我最近创建了一个新分支,我们称之为“branch1”,它基于另一个分支,我们称之为“master”。然后我对 branch1 做了一堆提交,现在我意识到前几次提交实际上是一个错误,但是在前几次之后的那些仍然是很好的提交!所以我在这里尝试做的基本上是删除前几次提交,以便它们之后的提交基本上基于 master ......如何做到这一点?
假设这是您从最新到最早的提交历史记录:
branch1
5XXXX Good Commit
4XXXX Good Commit
3XXXX Good Commit
2XXXX Bad Commit
1XXXX Bad Commit
Run Code Online (Sandbox Code Playgroud)
因此,假设您只想删除来自1XXXX和的代码,并且2XXXX并不真正关心提交是留下还是消失。因此,您现在可以执行以下操作:
git revert 1XXXX
这会生成一个新的提交,其消息类似于 reverts 1XXXX
然后,
git revert 2XXXX
这会生成一个新的提交,其消息类似于 reverts 2XXXX
您现在有两个新的提交,它们恢复1XXXX和2XXXX. 只需推动他们...
git push origin branch1
因此,您的提交现在将是:
branch1
7XXXX Good Commit reverting bad commit 2XXXX
6XXXX Good Commit reverting bad commit 1XXXX
5XXXX Good Commit
4XXXX Good Commit
3XXXX Good Commit
2XXXX Bad Commit
1XXXX Bad Commit
Run Code Online (Sandbox Code Playgroud)
如果你想摆脱提交本身,那么你可以这样做:
git rebase --interactive 1XXXX
因此,在同一个分支上branch1,您现在正在对第一个错误提交进行变基1XXXX。您现在将获得一个文本编辑器,其内容类似于:
pick 5XXXX Good Commit
pick 4XXXX Good Commit
pick 3XXXX Good Commit
pick 2XXXX Bad Commit
pick 1XXXX Bad Commit
Run Code Online (Sandbox Code Playgroud)
更改pick为Bad Commits至squash。
pick 5XXXX Good Commit
pick 4XXXX Good Commit
pick 3XXXX Good Commit
squash 2XXXX Bad Commit
squash 1XXXX Bad Commit
Run Code Online (Sandbox Code Playgroud)
merge conflicts如果它们出现并 BOOM,请修复任何问题!1XXXX并且2XXXX从未存在过!!
您最好的选择可能是使用(此处的git revert文档)来取消您想要取消的提交。
3 个注意事项:
git reset让您返回到您感兴趣的点,并可能撤消沿途的所有提交master分支之前,您可以branch1通过使用压缩您的提交git reset --soft <initial commit in branch1>,然后通过 重新提交所有更改git commit -m <your commit message>。