删除尚未推送的git commit


721

我做了一个,git commit但还没有将其推送到存储库中。因此,当我这样做时git status,我得到'#您的分支比'master'领先1次提交。

因此,如果我想回滚我的最高提交,我可以这样做:

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

鉴于我做的时候git log得到:

提交eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
日期:2009年9月29日星期二11:21:41 2009-0700


提交db0c078d5286b837532ff5e276dcf91885df2296
日期:2009年9月22日星期二10:31:37 2009-0700

9
这个问题似乎是您另一个问题的重复:stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Brian Campbell,2009年



3
危险:reset --hard可能会导致工作丢失,因为这样做会导致git用网络上的文件(发生在我身上)覆盖本地文件(您的新工作)。有关git的问题和答案应明确说明其命令正在执行的操作以及对读者造成的风险。
OrangeSherbet

Answers:


673

实际上,当您使用时git reset,应该引用您要重置的提交;因此,您可能需要db0c078提交。

一个更简单的版本是git reset --hard HEAD^,以将其重置为当前磁头之前的先前提交;这样,您不必在提交ID周围进行复制。

当您执行任何操作时要当心git reset --hard,因为您可能会丢失所有尚未提交的更改。您可能要检查git status以确保您的工作副本是干净的,或者您确实想吹走那里的所有更改。

另外,可以使用origin/master@bdonlan在注释中代替HEAD来作为参考:git reset --hard origin/master


374
或者git reset --hard origin/master,将其重置为原点。
bdonlan

1
您可以重置为另一个有用的指针是ORIG_HEAD或使用reflog HEAD @ {1}(HEAD的最后一个位置)对其进行的概括。
2009年

12
阅读器,在git reset编写代码之前。做你的未来的自己一个忙:之间的区别resetreset --soft以及reset --hard(碰巧你刚才什么git add又名“你的工作” :)图片:链接
user18099

3
请注意,这将删除您要删除的提交中的所有内容(因此a git status将不显示任何更改,并且提交将被删除/更改丢失)。
比约恩·伯雷森(BjørnBørresen)

12
注意:使用时要小心,git reset --hard HEAD^因为您将丢失已提交文件中的更改(您的更改将被删除)。这个问题有两个分支:要还原提交但仍在磁盘上进行更改,可以这样做git reset --soft HEAD~1
papigee

625

如果您尚未将更改推送到远程

git reset HEAD~1

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

否则,您已将更改推送到远程

git revert HEAD

此命令将还原/删除最后一个提交/更改,然后您可以按


34
这回答了“删除尚未推送的最新git commit”(最接近的答案,恕我直言)
Pierre de LESPINAY 2014年

25
此外,它会保留在上一次提交中完成的本地更改,而git reset --hard不会这样做
Stanimir Stoyanov

1
对我来说,它将撤消最后一次推送的提交和未推送的提交
CodyChan

git revert HEAD对我来说只是删除了我准备推送的所有文件。小心!
詹森·布鲁斯

158
git reset --hard origin/master

将其重置为原点。

这是@bdonlan在评论中发布的。我为不阅读评论的人添加了此答案。


4
这个问题是在近5年前提出的,已经在评论中之一。
Anubian Noob 2014年

1
如果当前的本地分支不同于该怎么办master-我应该怎么用origin/mybranch
帕维尔·弗拉索夫

9
急于寻求答案时,我通常不会阅读评论...感谢您提供答案(一个简单的
Leonardo Alves Machado

警告:请注意,这将删除所有现有的代码更改,git reset HEAD~但只会将提交重新设置为代码
Mayer Spitzer

69

这个问题有两个分支(回滚提交并不意味着我要丢失所有本地更改):

1.要还原最新的提交并 放弃已提交文件中的更改,请执行以下操作:

git reset --hard HEAD~1

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

git reset --soft HEAD~1

这(后面的命令)将把您带到原先的状态git add

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

git reset

现在,您可以在添加然后再次提交之前进行更多更改。


47

只需在控制台中输入:

$ git reset HEAD~

该命令丢弃远程HEAD之前的所有本地提交


7
您能解释一下您的答案加上现有答案吗?
nvoigt

这会在推送之前清除当前提交-不会像其他答案一样还原您在本地所做的更改-这可能是一个严重的拔毛时刻
Grant

41

我相信其中之一会满足您的需求

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

2-撤消提交和取消登台所有文件: git reset HEAD~;

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

这是我找到答案的地方


该答案必须被接受:D
亚伦·约翰·萨布

30

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

git reset --soft HEAD~1

1表示最后一次提交,如果要删除两个last use 2,依此类推*


3
嗨,卡里纳(Karina),--soft除了可能的答案外,提到的内容也很棒,但是您还能提及为什么吗?解释您的解决方案总是有帮助的。也尝试坚持英语。谢谢
VlastimilOvčáčík18年

1
--soft-确保您不会丢失要撤消提交的文件中的更改
papigee

19

我经历了以下相同的情况,因为这样做更加容易。通过传递,commit-Id您可以到达要执行的特定提交:

git reset --hard {commit-id}

当您要删除上一次提交时commit-Id,需要将指针移到需要的位置:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296

对像我这样的新手来说,这只是一个警告-备份要保留更改的所有文件,因为它们将还原为较早的版本。我的情况是,我不小心将数据库转储放在我的repo目录中,然后提交-我显然不想将这些文件提交到repo,但是DID希望保留对其他文件所做的更改。因此,在进行git reset之前,我必须从备份中复制并粘贴所需的更改。
user1063287

10

这是我的工作:

首先结帐您的分支(对于我的案例master分支):

git checkout master

然后重置为远程HEAD ^(它将删除所有本地更改),强制清理并拉出:

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

1
这是非常核的选择。我建议软重置为有限的提交。
c0der512

3

一种方法是删除本地分支,如果您的本地分支比多次提交领先于远程,并且您需要取消所有提交,则从服务器中检出该分支。


好的答案-它可以轻松地在sourcetree中单击它:)
KamilKiełczewski

1

我只是遇到了同样的问题,最终做了:

git rebase -i HEAD~N

(N是git将显示给您的提交次数)

这将提示您的文本编辑器,然后您可以通过删除与之关联的行来删除所需的提交。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.