如何从 master 中删除旧的 Git 提交并将其变成自己的分支?

How can I remove an old Git commit from master and turn it into its own branch?

在我的 master 分支历史记录中有一个提交 C 我们认为需要做更多的工作。这不是最新的提交。从那以后已经有 10 多次提交。幸运的是,none 的后续提交触及了 C 更改的任何文件。

我想从主分支中删除此提交,同时根据 C 中的更改创建一个新分支 test-c。这样,可以对其进行更多的工作,然后可以将其合并到 master.

所以我想从这里开始:

---A---B---C---D---E (master)

至此

---A---B---D---E (master)
                \
                 '---C (test-c)

或者就这样就好了(以后可以合并)

---A---B---D---E (master)
        \
         '---C (test-c)

我能找到的 only relevant answer 听起来好像我需要编写脚本或在前一个主提交(C 之后)手动重新设置每个后续主提交的基数。我很害怕那个。但这个答案已有 9 年历史了,所以我希望有更好的方法。

在 Visual Studio 2022(或我也使用的 Tortoise Git 中是否有更简单的方法来执行此操作?当我在 master 分支历史记录中右键单击此提交时,我查看了 VS 给我的内容。我看到以下选项

这些是我想要的吗?还是我必须做所有的变基?如果是后者,我会尽快向 master 添加一个反向提交,然后创建一个包含更改的分支,让历史看起来很混乱)

您可以还原提交(将其留在历史记录中),创建一个新分支然后 cherry-pick 原始提交。重写已发布的历史有很多问题,因此我建议还原提交的更改。

Cherry-picking 是必需的,否则还原的更改将不会再次合并。

  1. git checkout master
  2. git revert bad-commit
  3. git checkout -b more-work
  4. git cherry-pick bad-commit
  5. 在新分支上工作并最终合并回来

如果您真的需要删除原始提交(将其从历史记录中删除,而不仅仅是撤消其更改),您可以使用(交互式)变基。互动:

  1. git branch more-work bad-commit
  2. git rebase -i bad-commit^ master
  3. 将提交错误的行从 pick 更改为 drop(或将其完全删除`
  4. 保存并退出文件

Non-interactive:

  1. git branch more-work bad-commit
  2. git rebase --onto bad-commit^ bad-commit master

我会这样做

git rebase -i C~
# in the list of revisions, take the first line (C) and move it to be the last line. Save / exit

rebase 应该 运行,现在分支应该是 A <- B <- D <- E <- Cmaster 指向 C(好吧,C',实际上。这不是真的原始 C 版本)。

像往常一样,在这种情况下,考虑到您正在重写分支的历史记录并且如果该分支已经被共享(其他人已经在上工作top of it), 然后尝试将其关闭是完全可能的,但很痛苦,因此其他人开始使用新的 rebased 分支。