Git 在分支之前拆分提交

标签 git git-branch git-rebase

假设您有以下历史记录:

         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/

相关文章:

git - 在 git 中的远程存储库上创建私有(private)分支

git - git branch工作流程政策

git - 在 git merge 上覆盖作者

Git Rebase 不是 rebase 整个分支

git - 如何清理提交树中未使用的侧分支?

git - 为什么有人应该在 git commit 之前使用 git add?或者为什么有人应该使用 git add ?

git - 如何在不同的git仓库之间复制带有历史记录的文件?

git - 我需要在切换分支之前提交吗?

Git Merge - 不 merge 来自远程分支的所有更改

git - 如何为 git rebase 选择 merge 策略?