2013-01-15 82 views
8

我有兩個存儲庫。我不時想將other的內容合併到main中。但是,合併忽略已刪除的文件。讓我通過一個例子來解釋一下:Git忽略合併時刪除的文件

mkdir -p test/main test/other 

cd test/other/ 
git init 
touch one two three 
git add . 
git commit -m "Add one, two and three." 

cd ../main/ 
git init 
touch four 
git add . 
git commit -m "Add four." 

添加othermain遠程。

git remote add other ../other/ 
git fetch other 

合併其內容。

git merge --squash other/master 
git commit -m "Merge other." 

它正確地將文件添加。現在,刪除other中的文件。

cd ../other/ 
git rm two 
git commit -m "Remove two." 

合併變爲main

cd ../main/ 
git fetch other 
git merge --squash other/master 

後合併git status說:

# On branch master 
nothing to commit (working directory clean) 

我希望合併刪除two,因爲它是在other刪除。我究竟做錯了什麼?

回答

6

這裏的問題是你使用壓扁提交。

當您執行merge --squash時,您將放棄分支的所有歷史記錄。你還沒有真正「合併分支」 - 你只是應用了其歷史的簡明表述。因此,如果你稍後再做merge --squash,git將重新申請所有分支歷史中的提交(因爲兩個分支沒有共同的祖先)。

當您執行第一merge --squash,爲您營造一個提交上main其中包含「創建一,二,三」。所以main的歷史首先是「創建四個」,然後是「創建一個,兩個和三個」。

當您執行第二個merge --squash時,您將添加一個提交,其中包含(實際上)「創建一個,兩個和三個」以及「刪除兩個」。這兩個承諾的網絡在一起(壓扁!)是「創建一個和三個」。所以git自動合併「創建一個和三個」提交與您當前的回購狀態 - 留下四個文件存在。內容合併自動成功,因爲文件「一」和「三」在兩側是相同的。

如果您希望使用遠程控制回購庫,應該使用「真實」合併或櫻桃採摘而不是壓扁。 A merge --squash與「通過遠程存儲庫中的所有新提交進行遊戲並將其集成到此處」不同。

+0

沒錯,這個解釋是有道理的。我想做一個南瓜合併,不污染與其他主要歷史。但看起來沒有其他辦法。謝謝你的幫助! –

+1

@GergoErdosi如果你想*查看*「未受污染的」歷史,請查看'first-parent'選項到'git log'。 – Borealid

+0

感謝您的提示! –