以下是我如何處理它。
與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 diff
和git apply
使補丁,你用git format-diff
和git am
更好。但是,我無法使其與--diff-filter選項一起使用。適當的修補程序已經制作完成,但它們不適用於清潔。更熟悉這兩者的人可能會有更好的成功。
一個問題是對已移動的文件進行了修改。所以這些文件不在'deletions'分支和'master'分支中的相同位置。 –
好吧,那麼我不知道如何做到這一點。我想現在是我學習修補和類似的時候了。 :) – user2882096