从历史记录中删除文件后重新启动分支

时间:2013-10-20 21:04:19

标签: git

我正在处理两个分支,A和B.在主分支上,我决定删除一些占用项目历史空间的大型二进制文件。我是这样做的:

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

(来自this site)A分支。

然而,在这样做之后,我回到了B分支的工作,这个分支没有重写历史。这导致了以下提交树

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

其中A1和A2与B1和B2的提交相同,但缺少二进制文件除外。我怎样才能从B中删除二进制文件,并使提交树看起来像这样:

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

1 个答案:

答案 0 :(得分:2)

您可以先git checkout B4,然后git rebase --interactive A2。您的$EDITOR将被一个文件列出,该文件列出了许多格式为pick <ABREVIATTED-HASH> <COMMIT-MESSAGE>的提交。删除除最后一个文件之外的所有文件,应该是B3B4。之后,保存该文件,关闭$EDITORgit将在A2之上应用您选择的提交。如果git检测到冲突,它会向您提示您的提示并要求您解决冲突。编辑冲突,git add冲突的文件和git rebase --continue。这样做直到你解决所有冲突。之后,您可以在B3之上应用B4A2git checkout A5git merge B4,您将得到所需的树。

如果您的示例中只有2个提交,则可以更容易地执行:

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

那就是那首rebase首歌曲会做什么。如果您有更多提交,则会更耗时。你选择:)