2013-10-20 145 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歌就行了。如果你有更多的提交,它会更费时。你选择:)

相关问题