如何从 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 是必需的,否则还原的更改将不会再次合并。
git checkout master
git revert bad-commit
git checkout -b more-work
git cherry-pick bad-commit
- 在新分支上工作并最终合并回来
如果您真的需要删除原始提交(将其从历史记录中删除,而不仅仅是撤消其更改),您可以使用(交互式)变基。互动:
git branch more-work bad-commit
git rebase -i bad-commit^ master
- 将提交错误的行从
pick
更改为 drop
(或将其完全删除`
- 保存并退出文件
Non-interactive:
git branch more-work bad-commit
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 <- C
,master
指向 C
(好吧,C'
,实际上。这不是真的原始 C 版本)。
像往常一样,在这种情况下,考虑到您正在重写分支的历史记录并且如果该分支已经被共享(其他人已经在上工作top of it), 然后尝试将其关闭是完全可能的,但很痛苦,因此其他人开始使用新的 rebased 分支。
在我的 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 是必需的,否则还原的更改将不会再次合并。
git checkout master
git revert bad-commit
git checkout -b more-work
git cherry-pick bad-commit
- 在新分支上工作并最终合并回来
如果您真的需要删除原始提交(将其从历史记录中删除,而不仅仅是撤消其更改),您可以使用(交互式)变基。互动:
git branch more-work bad-commit
git rebase -i bad-commit^ master
- 将提交错误的行从
pick
更改为drop
(或将其完全删除` - 保存并退出文件
Non-interactive:
git branch more-work bad-commit
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 <- C
,master
指向 C
(好吧,C'
,实际上。这不是真的原始 C 版本)。
像往常一样,在这种情况下,考虑到您正在重写分支的历史记录并且如果该分支已经被共享(其他人已经在上工作top of it), 然后尝试将其关闭是完全可能的,但很痛苦,因此其他人开始使用新的 rebased 分支。