删除一个尚未推送的 git 提交

1400

我执行了git commit,但是我还没有将其推送到仓库中。所以当我执行git status时,会显示'# Your branch is ahead of 'master' by 1 commit.'。

那么如果我想回退到上一个提交,我可以这样做吗:

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

假设我执行 git log 命令,我会得到以下信息:

commit eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
Date:   Tue Sep 29 11:21:41 2009 -0700
commit db0c078d5286b837532ff5e276dcf91885df2296 Date: Tue Sep 22 10:31:37 2009 -0700

11
这个问题似乎是你自己的另一个问题的重复:https://dev59.com/03M_5IYBdhLWcg3wiDqA。 - Brian Campbell
1
可能是从Git中删除分支的提交的重复问题。 - Leonardo Alves Machado
1
可能是 如何在Git中撤消最后一次提交? 的重复问题。 - Jan Zerebecki
13
危险提示:reset --hard 命令可能会导致工作丢失,因为这个命令会导致 Git 用网上的文件覆盖你本地的文件(即你的新工作),类似于我遇到的情况。关于 Git 的问题和答案应该明确说明它们的命令正在做什么,以及读者遵循这些命令所面临的风险。 - JoseOrtiz3
13个回答

1718

如果您还没有将更改推送到远程

git reset HEAD~1

通过 git status 命令检查工作副本是否干净。

否则,你已经将更改推送到远程。

git revert HEAD

这个命令将撤销/移除本地提交/更改,然后您就可以推送


70
这是对“撤销最近一个未推送的git提交”的回答(在我看来最接近的答案)。 - Pierre de LESPINAY
52
同时,它会保留上一个提交中所做的本地更改,而git reset --hard则不会。 - Stanimir Stoyanov
2
对我来说,它将撤销最近的已推送和未推送的提交。 - CodyChan
3
git revert HEAD 对我来说刚刚删除了我准备推送的所有文件。要小心! - MrsPop88
1
我该如何撤销 git reset HEAD~1 命令? - information_interchange
显示剩余4条评论

844

实际上,当你使用 git reset 命令时,应该引用你要重置到的提交记录,所以你可能想要使用 db0c078 提交记录。

更简单的方法是使用 git reset --hard HEAD^ 命令,将当前 HEAD 指向之前的提交记录,这样你就不必复制提交记录 ID。

注意,当你执行 git reset --hard 命令时,可能会丢失未提交的更改。你可能需要检查 git status 命令,确保你的工作副本是干净的,或者确认你确实想要删除那些更改。

此外,你可以像 @bdonlan 在评论中建议的那样,使用 origin/master 作为参考,例如:git reset --hard origin/master


466
执行 git reset --hard origin/master 命令,可以将代码库重置为与远程源相同的状态。 - bdonlan
1
另一个有用的指针是ORIG_HEAD,或者利用reflog HEAD@{1}(HEAD的最后位置)进行泛化。 - Jakub Narębski
15
读者,在你执行 git reset 命令之前,请为你未来的自己着想:resetreset --softreset --hard 命令的区别(会发生什么事情会影响到之前的 git add 操作,也就是“你的工作”)。图片链接:link - user18099
3
请注意,这将删除你想要删除的提交中的任何内容(因此 git status 将不会显示任何更改,提交将被删除/更改将会丢失)。 - Bjørn Børresen
26
注意:当使用git reset --hard HEAD^命令时需小心,因为你将会丢失已提交文件中的更改(你的更改将被删除)。这个问题有两种分支解决方法:如果要撤销提交但仍保留磁盘上的更改,请执行git reset --soft HEAD~1 - papigee
显示剩余4条评论

326

我相信以下三种方法中的一种将符合您的需求:

1- 撤销提交并保留所有文件的暂存状态:git reset --soft HEAD~

2- 撤销提交并取消所有文件的暂存状态:git reset HEAD~

3- 撤销提交并完全删除所有更改:git reset --hard HEAD~

我在这里找到了答案


2
如果你正在使用自定义分支:git reset --soft origin/{分支名} - P.O.W.
3
注意:git reset HEAD~会移除你创建的所有文件。 - Skizo-ozᴉʞS ツ
注意事项 #2:第一个选项将您撤消的提交所做的更改恢复到您的暂存更改中。 - l -_- l
注意事项#3:git reset HEAD〜将使您仍然拥有添加和提交它们之前的“未跟踪文件”。因此,如果您意外执行“git add。”和“git commit”,并且希望其应用于一些您想要更改的文件,但忘记了您有一堆遗忘删除的工件,则可以使用git reset HEAD〜,这将使您能够删除工件(未跟踪文件),然后重新添加和提交您的更改,这些更改将在那里。 - Andy Weinstein

293
git reset --hard origin/main

它适用于其他分支:

git reset --hard origin/master
git reset --hard origin/staging

将其重置为原来的值。

这是由@bdonlan在评论中发布的。我添加了这个答案,方便那些不读评论的人。


5
这个问题是近5年前提出的,而且已经在其中一条评论中提到过了。 - Anubian Noob
1
如果当前本地分支与master不同,那么我应该使用origin/mybranch吗? - Pavel Vlasov
24
当我急需答案时,通常不会阅读评论...谢谢你提供一个回答(简单有效的回答)。 Translated: 我急需答案时通常不会阅读评论...感谢您提供一个回答(简单而有效的回答)。 - Leonardo Alves Machado
警告:请注意,这将删除所有现有的代码更改,除了git reset HEAD~仅将提交设置回代码之外。 - Mayer Spitz
1
你应该解释 --hard 会完全销毁所有的更改。这并不是每个人都想要的。 - JHBonarius
1
你应该解释一下--hard会完全销毁所有的更改。这并不是每个人都想要的。 - undefined

122

这个问题有两个方面(撤销commit并不意味着我想失去所有的本地更改):

1. 要撤销最新的commit并丢弃已提交文件中的更改,请执行以下操作:

git reset --hard HEAD~1

2. 要撤销最新的commit但保留本地的更改(在磁盘上),请执行以下操作:

git reset --soft HEAD~1

(后一个命令)将带您到如果执行git add的状态。

如果您想要在此之后取消暂存文件,请执行

git reset

现在您可以在添加并再次提交之前进行更改。


63

只需在控制台中输入:

$ git reset HEAD~

该命令会放弃本地分支在远程分支HEAD之前的所有提交记录。


9
你能解释一下你的回答相较于已有的回答有什么不同吗? - nvoigt
2
这会在推送之前清除当前提交记录,而不会还原您在本地所做的更改,就像其他答案一样,这可能是一个非常让人抓狂的时刻。 - Grant
2
简短而精炼,我喜欢!我们需要更多像这样的答案,这就是它相对于现有答案所“增加”的内容。减法可能更好地解释了这个答案的价值。我希望没有可怜的人使用任何--hard噪声。 - Craig Wilcox

60

在推送前删除最后一次提交

git reset --soft HEAD~1

1 表示最后一次提交,如果您想要删除最后两次提交,则使用 2,以此类推 *


3
嗨 Karina,提及“--soft”选项是个不错的补充,但你能否说明一下为什么吗?解释你的解决方案通常会很有帮助。另外请尽量使用英文。谢谢。 - Vlastimil Ovčáčík
3
--soft - 确保您不会丢失尝试撤消提交的文件中的更改 - papigee
3
这应该是正确的答案。 - LMaker

24

我遇到过相同的情况,我所做的如下所示,这样会更容易。 通过传递commit-Id,您可以到达想要前往的特定提交:


git reset --hard {commit-id}

如果您想要撤销最后一次提交,您需要传递 commit-ID,并将其指向您需要移动的位置:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296

4
对于像我这样的新手,需要提醒一下 - 备份任何您想要保留更改的文件,因为它们将被还原为早期版本。我的情况是我不小心将数据库转储放入存储库目录中并提交了更改 - 显然我不想将那些文件提交到存储库中,但是确实想保留我对其他文件所做的更改。因此,在进行git重置之前,我必须从之前制作的备份中复制和粘贴所需的更改。 - user1063287
git reset {commit-id}或者git reset {commit-id} --mixed会保留修改内容,这样它们可以重新添加到暂存区。git reset {commit-id} --mixed也会保留修改内容,但同时将文件保留在暂存区中,因此不需要重新添加。 - Philippe

12

这是我的操作步骤:

首先检出你的分支(在我的情况下是master分支):

git checkout master

然后重置到远程 HEAD^(它将移除所有本地更改),强制清空并拉取:

git reset HEAD^ --hard && git clean -df && git pull

1
这是非常核心的选项。我建议进行软重置以限制提交。 - c0der512

4

如果你的本地分支领先于远程分支多个提交,而你需要撤销所有提交,一种方法是删除本地分支并从服务器检出该分支。


出色的答案 - 它允许在 Sourcetree 中轻松单击它 :) - Kamil Kiełczewski

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