2016-07-21 190 views
2

合併git不合並文件移動和刪除有沒有辦法?用git合併分支,除了文件移動和刪除

我們製作了一個分支,然後通過刪除或移動大量文件來修剪分支。在該分公司對重組文件進行了一些修改。我現在想要做的就是將完整分支合併到修剪完畢的目錄中,但仍然保留所有在修剪分支中刪除的文件,並將所有文件保留在原始位置。

有沒有一種簡單的方法使用git合併從修剪下來的分支的更改,而不執行任何文件刪除或移動?最好能容易地處理修改過的文件已被移動的事實。

請注意,我主要關注的是變化的內容,而不是分支歷史記錄,所以使用櫻桃採摘或重新印刷的方法都很好。 (只要我沒有通過提交歷史手動拖網那些提交與修改修改隔離。)

我發現How do I ignore file deletions in a git branch for merging purposes?,但問題有前瞻性,得到的回答是「不這樣做那」。在我的情況下,分支和刪除已經發生。

回答

1

這不是我會在Git中做的事情。可能有辦法做到這一點,但我會用一些shell腳本來代替。您沒有指定您的環境,但我的解決方案將用於UNIX環境。無論如何,應該有用於運行bash腳本的工具。

首先,如果您的分支機構已經發生分歧,因此您想要「合併」兩個分支的變化,那麼您可能需要進行變形。讓我們打電話給您的分行masterdeletions。如果您已推deletions以便其他人正在該分支上工作,則可能會創建一個新的相同分支deletions2,我將在master上進行重新分配以避免重寫歷史記錄。反正你可能不想繼續在deletions上工作,因爲你必須重做所有的東西,但這樣你不會破壞任何東西。

然後,我會通過克隆repo手動將deletions2中的所有文件複製到master,並檢出一個副本中的一個分支和另一個副本中的另一個分支。然後我會列出所有跟蹤的文件並使用簡單循環複製它們:

​​3210
+1

一個問題是對已移動的文件進行了修改。所以這些文件不在'deletions'分支和'master'分支中的相同位置。 –

+0

好吧,那麼我不知道如何做到這一點。我想現在是我學習修補和類似的時候了。 :) – user2882096

1

以下是我如何處理它。

與user2882096的回答一樣,我將使用約定,即完整的刪除前分支爲master,並且修剪後的分支爲deletions。我也會假設你正在處理倉庫的根目錄。

首先,git通過移動文件很容易感到困惑,所以首先要在犧牲分支中反向移動。

git checkout -b deletions2 deletions 
git merge-base deletions2 master # Note this SHA1 - substitute it in the following commands 
git diff --diff-filter=R -M25% --raw SHA1 | awk '{system("mkdir -p `dirname " $(NF-1)"`; git mv " $NF " " $(NF-1))}' 
git commit 

git diff命令使用diff-filter來提取剛剛在刪除分支上發生的重命名(移動)。 -M25%意味着執行更廣泛的重命名檢測,查找除移動之外還有高達75%修改的文件。 --raw將輸出格式更改爲後處理更方便的格式。

awk命令只是一種扭轉此舉的方法。 (請注意,如果文件名中包含空格或時髦字符,則不一定非常健壯。)這裏唯一的問題是git mv不會創建不存在的目錄,因此不會創建​​位。

隨着撤消的舉動,我們可以得到修改和補充(但不刪除)補丁:

git diff --patch --diff-filter=AM -M25 SHA1 > modifications.patch 

然後,我們可以使在合併點的另一個犧牲分支,使我們能夠應用更改。

git checkout -b temp SHA1 
git apply modifications.patch # and resolve any issues 
git merge master # To resolve conflicts with the current state of master 

現在我們簡單地將臨時分支合併回主。

git checkout master 
git merge temp 

這將合併修改,但不是提交歷史。

git merge -s ours deletions2 

-s ours告訴git的合併來合併提交歷史,但保持文件的狀態,因爲他們目前是:如果你也想在提交歷史中合併。

最後一點:這可能是如果不是使用git diffgit apply使補丁,你用git format-diffgit am更好。但是,我無法使其與--diff-filter選項一起使用。適當的修補程序已經制作完成,但它們不適用於清潔。更熟悉這兩者的人可能會有更好的成功。