1

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

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

(来自此站点)在 A 分支上。

然而,在这样做之后,我又回到了 B 分支上,它的历史还没有被重写。这导致了以下提交树

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

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

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

1 回答 1

2

你可以先git checkout B4,然后git rebase --interactive A2。你$EDITOR会被一个列出大量提交的文件所激发,格式为pick <ABREVIATTED-HASH> <COMMIT-MESSAGE>. 删除除最后一个文件之外的所有这些文件,应该是B3B4. 之后,保存该文件,关闭您的$EDITOR并将git您选择的提交应用到A2. 如果git检测到冲突,它将给您提示并要求您解决它们。编辑冲突、git add冲突文件和git rebase --continue. 这样做直到解决所有冲突。之后,您将拥有B3B4A2. git checkout A5git merge B4你最终会得到你想要的树。

如果您的示例中只有 2 次提交,则这样做会更容易:

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

这就是洞rebase歌会做的事情。如果你有更多的提交,那将更加耗时。你选 :)

于 2013-10-20T22:23:16.307 回答