您誤會了git merge
的功能。它在提交樹的級別工作,而不是在單個文件的級別。
比方說,你開始在這裏,有兩個提交A
和B
兩個分支:
master --- A # this has *no* README2 file
dev ------ B # this has README2
然後你合併了dev
分支爲master
。
master --- A ----+--- C
/
dev ------ B --/
這將創建一個新的合併提交(C
)在主分支。 C
有其父母的歷史,A
和B
。這是README2
被帶入master
分支的地方。
後來,您從master
分支中刪除了README2
。該文件刪除將在master
分支上生成新的提交(D
)。
master --- A ----+--- C --- D
/
dev ------ B --/
這種新提交D
具有master
和dev
歷史(由於在C
合併),以及您刪除的文件README2
的事實。假設您還對dev
進行了更改(下面的提交E
),但它不涉及文件README2
。
master --- A ----+--- C --- D
/
dev ------ B --+--- E
現在您再次將dev
合併到主設備中。
master --- A ----+--- C --- D --+-- F
/ /
dev ------ B --+--- E --------/
你有一個新的合併提交F
,其中有來自D
和E
歷史。由於該文件已在master
(位於D
)中被刪除,並且新的dev
提交E
不包含README2
的更新,所以主分支不再獲得文件README2
。
在這一點上,如果你修改了dev
分支文件README2
,然後試圖把它合併到master
,你最終會得到一個合併衝突。它看起來像這樣。
$ git merge dev
CONFLICT (modify/delete): README2 deleted in HEAD and modified in dev. Version dev of README2 left in tree.
Automatic merge failed; fix conflicts and then commit the result.
正如文中所言,兩國之間存在衝突。在一個分支中,文件已被修改,但在另一個分支中它已被刪除。不確定哪一個可以接受,git放棄並要求你告訴它接下來要做什麼。
這個答案是錯誤的。 – Pockets