Git 在创建分支前如何拆分提交记录

3

假设您有以下历史记录:

         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 --onto。你的 --onto 的目标将是你拆分的第一半 A,无论它的哈希 ID 是什么。 - torek
1个回答

1
主要的祖先手术是“git filter-branch”领域,使用任何最方便的工具进行任何内容更改。有时,最容易在过滤分支片段中进行操作,但在这里,提前设置内容并仅使用filter-branch进行祖先重写会更容易。您可以在不重写现有祖先的情况下进行的操作是使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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接