簡體   English   中英

很多令人困惑的 git 沖突

[英]Lots of confusing git conflicts

在 bitbucket 的拉取請求期間,我遇到了非常令人困惑的沖突問題。 我有 137 個沖突,如下所示。 如何解決它並防止將來發生這種情況? 這是 Android Studio 在 macOS 上的項目。

第一次沖突

第二次沖突

第三次沖突

如您所見,我剛剛添加了一些行,但 git 將其視為沖突。

您可以在下面找到與 merge.conflictStyle=diff3 的沖突。 1 次會議

2 會議

3 會議

我仍然不知道為什么它是沖突而不是版本。

您的 diff3 屏幕截圖提供了答案。 (旁白:不要在這里使用屏幕截圖。直接剪切並粘貼文本。在這種情況下,應該刪除帶有行號的裝訂線信息,但這沒關系。請參閱我如何提出一個好問題。)

請記住,在 Git 中,合並是關於合並工作 涉及三個提交:

  • 你,在你的分支上,從一些提交開始。 Git 將此稱為合並基礎提交。

  • 他們在他們的分支上,從這個相同的 commit開始。

所以 Git 首先運行兩個git diff命令(或內部等效命令)。 一個將此合並基礎與的代碼版本進行比較,第二個git diff將此合並基礎與其代碼版本進行比較。

我將從中間沖突開始。

diff3 風格的 diff 包括合並基本代碼(來自提交ce442625 ),我們可以在其中閱讀——我已經重新輸入了這個,所以我可能添加了一些錯別字1——原行說:

    chage_lang.setOnClickListener { openDialogToSelectLang() }

這顯然是有缺陷的:它應該讀取change_lang而不是chage_lang

您的提交中,在 HEAD 中,您保留了這一行,但在其后添加了一個空行 這是一個“差異大塊”。

他們的提交中,在feature/dark_mode中,他們修復了拼寫並將單個空行替換為非空行,以獲得:

    change_lang.setOnClickListener { openDialogToSelectLang() }
    change_theme.setOnClickListener { openDialogToSelectTheme() }

在這里,Git 不知道是保留您添加的空行,還是保留它們的刪除和替換空行; 它不知道是保留錯誤的拼寫chage_lang還是使用更正的拼寫change_lang 所以就產生了沖突:你必須select正確的分辨率。

就在這之下,最后一個沖突是相似的:合並基礎版本說:

    android:layout_marginTop="@dimen/standard_margin"
    android:background="@color/white"

您的版本中,您將“第一行”更改為“8dp”並保持第二行不變,但在他們的版本中,他們保持第一行不變並刪除了第二行。再一次,Git 不知道是否接受您的版本,他們的版本,兩者的某種組合,或者什么。必須在此處選擇正確的分辨率。

一個差異是最令人困惑的:這里,從合並基礎版本中獲取的行集是的。 您這邊的變化是添加了一個空白行,而他們添加了一個非空白行閱讀:

    setBackgroundColor(ContextCompat.getColor(context, ...

與其他兩種情況一樣,Git 不知道它是否應該添加您的空白行,或者他們的行,或者兩者,或者兩者都不,或者什么。 必須選擇。

編輯有問題的文件以具有正確的組合(並且不再包含沖突標記),或使用合並工具來實現相同的效果。 然后在生成的文件上使用git add ,或使用合並工具(可能是相同的合並工具,全部作為一件事)運行git add for you git add更新 Git暫存區中的文件副本,以便 Git 知道正確的分辨率。

(Git 假設您告訴它的任何內容都是正確的,因此請確保您在這里告訴它正確的內容,換句話說,確保整個文件是正確的。通常這意味着您應該在給它之前測試您的合並分辨率Git. That's one reason I don't like git mergetool : you do the merge, and then git mergetool immediately tells Git it's right, and if it's not right, you have to start over. 2 )


1這種拼寫錯誤的風險是“詢問”頁面建議使用剪切和粘貼的原因

2您可以只使用這一個文件重新開始,和/或編輯和調試它而無需重新創建沖突,但現在更難看到原始的三個輸入文件。 使用git checkout -m重新創建沖突有效,但這會失去您的解決方案。 一旦你確切地知道你和 Git 正在做什么,所有這些都有解決方法,但總的來說,整個用戶體驗對我來說似乎很糟糕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM