我该如何从一个分支中删除一个提交?

4268

我该如何从我的分支历史记录中删除一个提交?我应该使用 git reset --hard HEAD 吗?


67
我认为这篇文章不是Git undo last commit相同,因为它询问如何从一个分支中删除任何提交。我还认为没有一个答案实际回答了这个问题。它们都是倒退到最后提交的状态,而不是cherry-pickdelete一次性提交,即使这个提交发生在很久以前。 - Chris
23
@Chris,答案“git rebase -i HEAD~10”确实回答了问题,因为它允许您任意选择要删除的提交。Git会逐个应用您指定范围内的提交,忽略您从日志中删除的提交。我今天使用这个命令来摆脱我的存储库中第二和第三个最近的提交,同时保留顶部的提交。我同意其他答案都不令人满意。 - MST
@MST 是的,我应该说,接受的答案中没有任何选项解决了这个问题,但你是完全正确的 - 那个命令似乎有效。 - Chris
3
我认为 git reset --soft HEAD~1 正是你所需要的。 在这种情况下,你将撤销提交并保存你的工作。reset --hard 将完全删除提交。 - sergpank
幸运的是,我可以只写一个空提交信息,这样提交就不会被提交了:),所以我不需要删除它。简而言之:我偶然运行了命令git commit -a,认为它是git commit --amend的缩写(实际上不是),并且在一个新的空提交消息中。我可以使用空消息取消编辑器(在vim中使用:wq),git不会创建提交,而是返回“由于空提交消息而中止提交。” - questionto42
显示剩余2条评论
38个回答

2

删除本地提交

如上图所示,我想删除还原“测试更改2”的提交记录(SHA1 ID:015b5220c50e3dfbb1063f23789d92ae1d3481a2(你可以使用git bash中的gitk命令获取SHA1 ID))。

为此,我可以使用以下命令(以下所有命令仅在本地工作。删除后需要推送):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2 //它将备份到该提交记录(测试更改4的SHA1 ID为515b5220c50e3dfbb1063f23789d92ae1d3481a2
  2. git reset --hard HEAD~1 //它将备份到前一个提交记录。
  3. git reset --hard HEAD^ //从git中删除最后一次提交

删除后:

删除提交记录后


2

允许您删除提交,而不会删除您当前的文件:

git reset --soft Id commit

然后使用强制推送本地更改:

git push -f origin nameBranch

1

git reset --hard

撤销所有的修改,并将HEAD指向最新的提交。

git push origin HEAD --force

强制推送当前分支的所有修改到远程仓库。

如果有一个或多个提交被打了标签,请先删除标签。否则,已打标签的提交不会被删除。


1
对于我来说,rebase起到了作用。
$ git rebase -i HEAD~98

# Delete everything except for the most recent commit on the shown editor caused by "rebase"

$ git push origin -f production-static

注意: 在强制推送以减少我的注释后,我又推送了另一组文件,然后在另一台电脑上使用相同的“存储库和分支”进行了拉取。令人惊讶的是,没有冲突。这成为我减少存储库大小并避免其他本地使用相同git时出现拉取冲突的方法。


0
在我的情况下,我用于此目的的神奇代码是这个:
git reset --hard @{u}

测试一下并告诉我。我尝试了几个不同的,但这是唯一一个帮助我的。


0

使用 git revert https://git-scm.com/docs/git-revert 命令。它将撤销所有代码,然后您可以进行下一次提交。然后 head 将指向该最后一次提交。被撤销的提交不会被删除,但不会影响您的最后一次提交。


0

假设您尚未推送到远程存储库,则可以重新克隆存储库。这是我几次选择的方法。


1
@LucasHuang 不是这样的:“当我在将来进行推送时,我的更改不会推送到远程分支” - xhienne

0
使用IntelliJ的drop commit是最简单和直接的解决方案之一。 您可以从左下角访问它: 在IntelliJ中访问git窗口 然后,您可以选择提交并右键单击它,您将获得此菜单: 来自菜单 然后,您可以选择:drop commit选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接