2017-02-19 34 views
1

我有一個主分支,有一些東西,比方說文件README。我也有一個開發分支,主人的孩子,有一些額外的文件,讓我們說文件README2。我做到以下幾點:Git合併不會第二次合併文件

git merge dev 

從主,並得到README2合併到主文件。現在,我將其刪除:

git rm README2 

現在,當我再次合併開發,我預計我會得到README2文件合併成高手,因爲它在主人的不是了。但Git報告沒有變化,也沒有合併。這實際上很適合我,但我不明白這是怎麼回事,因爲此時分支開發者明確擁有README2文件,而master卻沒有。

回答

4

您誤會了git merge的功能。它在提交樹的級別工作,而不是在單個文件的級別。

比方說,你開始在這裏,有兩個提交AB兩個分支:

master --- A  # this has *no* README2 file 

dev ------ B  # this has README2 

然後你合併了dev分支爲master

master --- A ----+--- C 
       /
dev ------ B --/ 

這將創建一個新的合併提交(C)在主分支。 C有其父母的歷史,AB。這是README2被帶入master分支的地方。

後來,您從master分支中刪除了README2。該文件刪除將在master分支上生成新的提交(D)。

master --- A ----+--- C --- D 
       /
dev ------ B --/ 

這種新提交D具有masterdev歷史(由於在C合併),以及您刪除的文件README2的事實。假設您還對dev進行了更改(下面的提交E),但它不涉及文件README2

master --- A ----+--- C --- D 
       /
dev ------ B --+--- E 

現在您再次將dev合併到主設備中。

master --- A ----+--- C --- D --+-- F 
       /   /
dev ------ B --+--- E --------/ 

你有一個新的合併提交F,其中有來自DE歷史。由於該文件已在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放棄並要求你告訴它接下來要做什麼。

-2

發生這種情況是因爲通過從git跟蹤系統中刪除README2文件,它將忽略您在將來可能對其進行的任何更改,這可能還涉及包含該文件的合併。如果您製作git status,則可能會將文件視爲未跟蹤文件。

我希望這是有幫助的,如果你想實際上刪除該提交中的文件而不是做git rm README2你可以簡單地刪除該文件,git會將該文件註冊爲文件刪除而不是解壓縮命令。

+2

這個答案是錯誤的。 – Pockets