假设您有以下历史记录:
D———G feature1.1
/
...A-B-C-E-F feature1
现在我想将 B 拆分为两个提交以获得:
D———G feature1.1
/
...A-B1-B2-C-E-F feature1
你不能只执行 git rebase -i ... 然后选择编辑,因为你得到了这个
B-C-D-G feature1.1
/
...A-B1-B2-C'-E'-F' feature1
但这可以通过使用 git rebase --onto C' C feature1.1 快速修复。
现在来看一个更具体的用例。如果 feature1 是你的主分支,你会怎么做,A 是你的初始提交并且你想拆分 A。相同的技术不起作用,因为在 rebase 之后它们不再有共享历史。
最佳答案
主要血统手术是 git filter-branch
领域,使用任何最方便的工具来进行任何内容更改。有时,在过滤器分支片段中“当你在那里”时最容易做到这一点,但在这里更容易提前设置内容并只使用过滤器分支来重写其祖先。你可以在不重写现有祖先的情况下做的事情是 make A---B1---B2
,开始做
git checkout B
git reset A
你的工作树现在是 B
内容,你的索引是 A
内容,HEAD 即你的下一个提交的父级是 A
,所以添加 B1
内容最方便:
git add files whose changes all belong in B1
git add --patch files whose changes partially belong in B1
git reset --patch any hunks you added by mistake
git commit # this makes B1
git add . # everything that remains belongs in B2, so add everything
git commit # this makes B2
现在唯一剩下的就是重新连接祖先,不需要更改内容。仅在本地重新布线,然后使用 git filter-branch
将本地历史记录重写到所有依赖于它的重写历史记录中:
git replace --graft C B2
git filter-branch -- --all
关于Git 在分支之前拆分提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59847321/