我正在处理两个分支,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 |--/
+----+ +----+
答案 0 :(得分:2)
您可以先git checkout B4
,然后git rebase --interactive A2
。您的$EDITOR
将被一个文件列出,该文件列出了许多格式为pick <ABREVIATTED-HASH> <COMMIT-MESSAGE>
的提交。删除除最后一个文件之外的所有文件,应该是B3
和B4
。之后,保存该文件,关闭$EDITOR
和git
将在A2
之上应用您选择的提交。如果git
检测到冲突,它会向您提示您的提示并要求您解决冲突。编辑冲突,git add
冲突的文件和git rebase --continue
。这样做直到你解决所有冲突。之后,您可以在B3
之上应用B4
和A2
。 git checkout A5
,git merge B4
,您将得到所需的树。
如果您的示例中只有2个提交,则可以更容易地执行:
$ git checkout A2
$ git cherry-pick B3
$ git cherry-pick B4
$ git checkout A5
$ git merge B4
那就是那首rebase
首歌曲会做什么。如果您有更多提交,则会更耗时。你选择:)