从远程 Git 仓库中删除最后一次提交

491

如何从远程Git存储库中删除最后一次提交,以便在日志中不再看到它?

例如,如果git log给出以下提交历史记录

A->B->C->D[HEAD, ORIGIN]

我该如何前往?

A->B->C[HEAD,ORIGIN]

如果您已经将其提交到存储库中,那么我认为没有办法将其删除。 - Gaurav Shah
@Guarav:我认为没有“礼貌”的方式来删除它。我的意思是,如果所有其他方法都失败了,rm -rf命令可以摧毁存储库中的任何内容。但是,我认为我链接的问题包含了一个更好的解决方案——如果其他人已经拉取了该版本,则仍然不太礼貌。 - sarnold
2
最后一次提交总是可以从您的历史记录中删除。根据许多因素,您可能会或可能不会完全从人们的记忆中抹去它。 - Michael Krelin - hacker
@sarnold,如果它被推到其他地方,你只是毁掉了你的存储库的想法,而不是整个世界 :) - Michael Krelin - hacker
@Michael:哈!很好的区分。 - sarnold
2个回答

1197
请注意,这将为那些已经从远程仓库获取/拉取/克隆的人创建一个“备用现实”。但事实上,这很简单:
git reset HEAD^ # remove commit locally
git push origin +HEAD # force-push the new HEAD commit

如果您想仍然将其保留在本地存储库中,只从远程删除它,则可以使用以下命令:
git push origin +HEAD^:$name_of_your_branch # e.g. +HEAD^:master

一些Shell语言会解释^字符。对于这些Shell,要么使用引号/转义字符,要么使用~代替:

HEAD\^
'HEAD^'
HEAD~

39
请注意,在zsh中使用git reset HEAD\^ - Alter Lagos
58
在Windows电脑上使用git reset HEAD~1 - aeracode
3
+HEAD是做什么用的?当我执行 git log 命令时,它会在最新的提交记录上加上 (HEAD -> approval, origin/approval),那这是什么意思呢? - ASN
3
它会强制推送当前检出的分支(在您的情况下是“approval”分支)。 - knittl
你的远程仓库分支权限可能不允许“ForcePush”。为了解决这个问题,请参考这里的信息:https://dev59.com/U1YO5IYBdhLWcg3wL-vY - Ryan Naccarato
显示剩余3条评论

29

如果还没有人拉取它,你可以尝试做以下操作:

git push remote +branch^1:remotebranch

这将强制更新远程分支,使其变为你的分支的倒数第二个提交。


5
如果有人已经做过了,你也可以这样做。请注意,原文中的could和if是虚拟语气,表示条件或可能性。 - Sebastian Mach
8
当然可以。不过如果你知道自己在做什么以及后果是什么,才应该这样做。如果你确实知道,那么可能就不会阅读这个答案了。 - Michael Krelin - hacker
这里的分行名称是哪一个?是冒号前还是冒号后? - undefined
@VikasAcharya,都是,先是本地分支,然后是远程分支。 - undefined
@MichaelKrelin-hacker 两者是一样的,对吗?我们在本地创建分支,然后将其推送到GitLab。 - undefined
1
@VikasAcharya,这完全取决于你,你可以按照自己的方式创建本地分支,并推送到任何远程分支。 - undefined

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