如何在Git中删除not-last commit?

时间:2015-04-08 23:15:31

标签: git

我最近创建了一个新分支,我们称之为“branch1”,它基于另一个分支,让我们称之为“master”。然后我向branch1提交了一堆提交,现在我已经意识到前几次提交实际上是一个错误,但是在前几个提交之后仍然是很棒的提交!所以我在这里尝试做的基本上就是删除那些前几次提交,以便后面的那些提交基本上得到主人的重新定位......怎么会这样做?

4 个答案:

答案 0 :(得分:3)

您最好的选择可能是使用git revert(文档here)进行您要取消的提交。

关于它的3个注释:

  1. 此命令允许您还原特定提交,而不是git reset,它会将您带回到您感兴趣的位置,可能会撤消所有提交的提交
  2. 每个恢复都将被视为自己的提交,这意味着您的历史记录可能会被不必要的提交和恢复混乱。但是,在合并到master分支之前,您可以使用branch1git reset --soft <initial commit in branch1>中压缩您的提交,然后按git commit -m <your commit message>重新进行所有更改。
  3. 为避免合并冲突,建议按照提交的相反顺序使用它。

答案 1 :(得分:2)

说这是您从最新到最早的提交历史记录:

branch1

5XXXX Good Commit
4XXXX Good Commit
3XXXX Good Commit
2XXXX Bad Commit
1XXXX Bad Commit

所以,假设您想要仅删除1XXXX2XXXX中的代码,并且不关心提交是保留还是继续。因此,您现在可以:

git revert 1XXXX 这使得新提交的消息类似于reverts 1XXXX

然后,

git revert 2XXXX 这使得新提交的消息类似于reverts 2XXXX

您现在有两个新的提交可以还原1XXXX2XXXX。只需推动它们......

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

如果你想自己删除提交,那么你可以这样做:

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

pick的{​​{1}}更改为Bad Commits

squash

修复任何pick 5XXXX Good Commit pick 4XXXX Good Commit pick 3XXXX Good Commit squash 2XXXX Bad Commit squash 1XXXX Bad Commit 如果它们出现并且BOOM! merge conflicts1XXXX从未存在!!

答案 2 :(得分:0)

您是否已经推动了更改?我假设你做到了。在这种情况下,我建议使用git revert来消除不良提交。这是安全的选择。

错误提交仍会在历史记录中显示,但是当他们已经撤消您的更改时,您的同事不会遇到问题。

如果您尚未推送更改,则可以选择使用git rebase -igit reset重写Git历史记录,然后重新发送。

答案 3 :(得分:0)

我通常是git revert的支持者,但是当您的提交是删除的提交时,还原提交将重新添加它,并且您将失去之前该文件的历史记录。因此,如果您已完成所有这些提交,则我将创建另一个分支-将所有提交重新置于其上,在错误的提交之前将错误的分支重置回该提交,然后从顶部选择最佳的提交。辅助分支。