2013-10-20 143 views
1

我正在研究兩個分支A和B.在主分支上,我決定刪除佔用項目歷史記錄空間的一些大型二進制文件。我這樣使用:在分支上的從歷史記錄中刪除文件後的Rebase分支

git filter-branch --force --index-filter \ 
'git rm --cached --ignore-unmatch "Filename"' \ 
--prune-empty --tag-name-filter cat -- --all 

(來自this site)。

然而,在這樣做之後,我又回到了B分支上工作,這個B分支沒有重寫歷史。這導致了以下承諾樹

+----+ +----+     +----+ 
| A1 |->| A2 |---------------->| A5 | 
+----+ +----+     +----+ 
+----+ +----+ +----+ +----+ /
| B1 |->| B2 |->| B3 |->| B4 |--/ 
+----+ +----+ +----+ +----+ 

其中A1和A2是相同的提交B1和除了缺少的二進制文件B2。我怎麼能刪除從B二進制文件以及並提交樹是這樣的:

+----+ +----+     +----+ 
| A1 |->| A2 |---------------->| A5 | 
+----+ +----+     +----+ 
      \ +----+ +----+ /
      \->| B3 |->| B4 |--/ 
       +----+ +----+ 

回答

2

可以先git checkout B4然後git rebase --interactive A2。你的$EDITOR將被激發一個文件列表大量提交格式爲pick <ABREVIATTED-HASH> <COMMIT-MESSAGE>。刪除除最後一個以外的所有文件,這應該是B3B4。之後,保存該文件,關閉您的$EDITORgit將應用您在A2之上所選的提交。如果git檢測到衝突,它會給你回提示並要求你解決它們。編輯衝突,git add衝突的文件和git rebase --continue。直到你解決所有衝突爲止。之後,您將在A2之上應用B3B4git checkout A5git merge B4,你最終會得到你想要的樹。

如果只有2提交在你的榜樣,它可以更容易地只是做:

$ git checkout A2 
$ git cherry-pick B3 
$ git cherry-pick B4 
$ git checkout A5 
$ git merge B4 

這就是孔rebase歌就行了。如果你有更多的提交,它會更費時。你選擇:)

相關問題