如何撤消Git中的最新本地提交?


21043

我不小心将错误的文件提交给Git,但是我还没有将提交推送到服务器。

如何撤消本地存储库中的那些提交?


136
发布新答案之前,请考虑该问题已经有65个以上的答案。确保您的答案对现有答案没有帮助。
Sazzad Hissain Khan

88
你知道git需要什么吗?git undo, 而已。然后,git用来处理我们由凡人造成的错误的声誉消失了。通过在执行任何git命令之前将当前状态压入git堆栈来实现。这会影响性能,因此最好添加关于是否启用它的配置标志。
Yimin Rong

11
@YiminRong可以使用Git的完成alias功能:git-scm.com/book/en/v2/Git-Basics-Git-Aliases
埃德里克

3
@RomainValeri-撤消在其他地方都可以使用的相同方法。
Yimin Rong

1
@YiminRong不买。人们仍然会摸索,撤消那些不可撤销的事情。但更重要的是,git reflog它已经接近您所描述的内容,但是使用户可以更好地控制要执行的操作。但是请不要,“撤消”并非在所有地方都一样,人们期望该功能实现许多不同的事情。撤消上一次提交?撤消上一个动作?如果最后一个动作是推动,则撤消(重置并推动)或(恢复并推动)的精确度?
RomainValeri

Answers:


22845

撤消提交并重做

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. 这是您要撤消的操作。
  2. 这不会对您的工作树(磁盘上文件的状态)产生任何影响,但会撤消提交,并使您提交的更改未进行暂存(因此,它们将在中显示为“未暂存用于提交的更改”)git status,因此您需要在提交之前再次添加它们)。如果你需要添加更多的变化上一次提交,或更改提交信息1,您可以使用git reset --soft HEAD~替代,这就好比是git reset HEAD~2,但离开你现有的变化上演。
  3. 对工作树文件进行更正。
  4. git add 您想要包含在新提交中的任何内容。
  5. 提交更改,重新使用旧的提交消息。reset将老头复制到.git/ORIG_HEAD; commit使用-c ORIG_HEAD将会打开一个编辑器,该编辑器最初包含来自旧提交的日志消息,并允许您对其进行编辑。如果不需要编辑消息,则可以使用该-C选项。

但是请注意,如果您向索引添加了任何新的更改,则使用commit --amend会将它们添加到先前的提交中。

如果代码已经推送到服务器,并且您有权覆盖历史记录(变基),则:

git push origin master --force

您还可以查看以下答案:

如何将HEAD移回先前的位置?(独立的头部)和撤消提交

上面的答案将向您显示git reflog,用于找出要恢复的SHA-1的内容。找到要撤消的点后,即可使用上述命令序列。


1注意,但是,如果您在commit message了一个错误,则无需重置为较早的提交。较简单的选项是git reset(取消对您自此以来所做的任何更改),然后选择git commit --amend,这将打开预先填充有最后一条提交消息的默认提交消息编辑器。

2 HEAD~与相同HEAD~1。另外,请参阅git中的HEAD是什么?。如果您要取消提交多个提交,这将很有帮助。


472
如果提交到错误的分支,则可以git checkout theRightBranch处于所有更改阶段。正如我要做的。
Frank Shearar

489
如果您在DOS下工作,则git reset --soft HEAD^无需使用git reset --soft HEAD~1。^是DOS中的延续字符,因此无法正常工作。此外,--soft它是默认设置,因此您可以忽略它,只说一句git reset HEAD~1
Ryan Lundy

119
zsh用户可能会得到:zsh: no matches found: HEAD^-您需要转义^即git reset --soft HEAD\^
tnajdek

7
如果说(例如偶然地)git commit -a是在本-a应忽略的情况下发出的,则答案是不正确的。在这种情况下,最好不要遗漏--soft(这将--mixed是默认设置),然后您可以保留要提交的更改。
dmansfield

6
@IcyBrk git add是一个命令。 git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…​]
Ashraf.Shk786

10729

如果您不知道提交的工作方式,则撤消提交会有些吓人。但是,如果您理解的话,实际上非常容易。

假设您有这个,其中C是您的HEAD,(F)是您的文件状态。

   (F)
A-B-C
    ↑
  master

您想核对commit C,再也看不到它,并且丢失本地修改文件中的所有更改。你来做这件事:

git reset --hard HEAD~1

结果是:

 (F)
A-B
  ↑
master

现在B是HEAD。由于您使用--hard,因此文件在提交B时被重置为其状态。

嗯,但是假设提交C并不是一场灾难,只是有点困难。您想要撤消提交,但是在进行更好的提交之前保留您的更改以进行一些编辑。从这里再次开始,以C作为您的HEAD:

   (F)
A-B-C
    ↑
  master

您可以这样做,省去了--hard

git reset HEAD~1

在这种情况下,结果为:

   (F)
A-B-C
  ↑
master

在这两种情况下,HEAD都只是指向最新提交的指针。当执行a时git reset HEAD~1,您告诉Git将HEAD指针移回一次提交。但是(除非使用--hard),否则文件将保持原样。现在,git status显示已签入C的更改。您还没有丢失任何东西!

对于最轻松的接触,您甚至可以撤消提交,但保留文件和索引

git reset --soft HEAD~1

这不仅让您的文件独自一人,甚至让索引也独自一人。完成后git status,您将看到与以前相同的文件在索引中。实际上,在此命令之后,您可以执行操作,git commit并且您将重做刚才的相同提交。

还有一件事:假设您像第一个示例一样破坏了一个提交但是毕竟发现您需要它?运气不好吧?

不,仍然有办法找回它。类型git reflog,你会看到一个名单(部分)提交的SHA你已经在四处移动(即哈希)查找提交你摧毁,这样做:

git checkout -b someNewBranchName shaYouDestroyed

您现在已经复活了该提交。在Git中,提交实际上并没有被销毁约90天,因此您通常可以回去拯救不是故意要摆脱的一个。


15
谨防!如果您的错误提交是一次(快进)合并,那么这可能无法实现您的期望!如果您的头在合并提交上(例如:将合并的分支功能合并到master中),git reset --hard~1则将master分支指向功能分支中的最后一个提交。在这种情况下,应使用特定的提交ID而不是相对命令。
克里斯·克瑞克斯

90
遗漏了一个关键点:如果先前曾将该“提交”推送到远程,那么任何“撤消”操作(无论多么简单)都会给其他在本地副本中拥有该提交的用户造成极大的痛苦和折磨,当他们将来做“ git pull”时。因此,如果提交已被“推送”,则改为:git revert <bad-commit-sha1-id> git push origin:
FractalSpace

12
@FractalSpace,它不会引起“巨大的痛苦”。与团队一起使用Git时,我已经进行了几次推力操作。它所要做的就是沟通。
Ryan Lundy 2013年

14
@Kyralessa在我的工作场所,将整个团队的工作流程弄乱,然后告诉他们如何解决问题,这没有被称为“沟通”。git history re-write是一种破坏性的操作,会导致破坏回购部分。坚持使用它,尽管有明确和安全的替代方法,这是完全不负责任的。
FractalSpace

14
我想取消一次提交,以后再也看不到了。我使用了您的示例,--hard但我没有意识到的是,我在工作树中进行的所有未按阶段进行的更改也都被忽略了!我打算在以后的提交中提交这些文件。现在看来,找回这些文件似乎是不可能的-我什至尝试了您发布的解决方案,reflog但这并没有还原以前未进行的更改。
亚当·伯利

2128

有两种方法可以“撤消”您的上一次提交,具体取决于您是否已将提交公开(推送到远程存储库):

如何撤消本地提交

假设我在本地提交了,但是现在我想删除该提交。

git log
    commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
    commit 100: good commit   # Second to last commit. This is the one we want.

要将所有内容恢复到上一次提交之前的状态,我们需要reset在执行以下操作之前提交HEAD

git reset --soft HEAD^     # Use --soft if you want to keep your changes
git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made

现在git log将显示我们的上一次提交已被删除。

如何撤消公开提交

如果已经将提交公开,则需要创建一个新的提交,该提交将“还原”您在先前提交(当前HEAD)中所做的更改。

git revert HEAD

您的更改现在将恢复并准备提交:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

有关更多信息,请查看Git基础知识-撤消事情


101
我发现这个答案最清楚。git revert HEAD^不是前一个,而是前一个。我做到了:git revert HEAD然后再按一次就可以了:)
nacho4d 2011年

如果Git问您“更多?” 当您尝试这些命令时,请在此答案上使用替代语法:stackoverflow.com/a/14204318/823470
tar

1745

添加/删除文件以所需的方式获取内容:

git rm classdir
git add sourcedir

然后修改提交:

git commit --amend

先前的错误提交将被编辑以反映新的索引状态-换句话说,就好像您从未犯过错误。

请注意,只有在尚未推送的情况下,才应该这样做。如果已推送,则只需正常提交修复程序即可。


2
仅供参考:这将删除我的所有文件,并且丢失了更改。
egorlitvinenko

UPD:但是,我已经使用reflog恢复了它。但是收据不适用于最初的提交。
egorlitvinenko

1
使用git rm --cached保持在文件系统中的文件,只有从Git的索引中删除它们!
xuiqzy

1014
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

要么

git reset --hard HEAD~1

警告:上面的命令将永久删除.java您要提交的文件(和任何其他文件)的修改。

hard resetHEAD-1将你的工作拷贝设定在状态的你的不对了提交前提交。


19
git commit -a -m ""git commit -am ""自然!:]
trejder 2014年

另一种“捷径”使用藏匿处;如果您想取消所有内容的发布(撤消git add),则只需git stashgit stash pop
seanriordan08

778

更改最后一次提交

替换索引中的文件:

git rm --cached *.class
git add *.java

然后,如果它是一个私有分支,则修改提交:

git commit --amend

或者,如果它是一个共享分支,请重新提交:

git commit -m 'Replace .class files with .java files'


要更改以前的提交,请使用令人敬畏的交互式rebase。)


ProTip™:添加*.classgitignore以阻止再次发生这种情况。


还原提交

如果需要更改最后的提交,则修改提交是理想的解决方案,但是更通用的解决方案是reset

您可以使用以下命令将Git重置为任何提交:

git reset @~N

N之前的提交次数在哪里HEAD,并@~重置为上一次提交。

因此,您可以使用:

git reset @~
git add *.java
git commit -m "Add .java files"

请查看git help reset,尤其是--soft --mixed和上的部分--hard,以更好地了解其功能。

刷新日志

如果您搞砸了,可以随时使用reflog查找丢弃的提交:

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started



2
对于以后阅读的人-请注意,这git revert是一个单独的命令-基本上可以“重置”单个命令。
BKSpurgeon '18

680

使用git revert <commit-id>

要获取提交ID,只需使用git log


15
樱桃选择提交是什么意思?就我而言,编辑文件时我在错误的分支上。我承诺,然后意识到我在错误的分支。使用“ git reset --soft HEAD〜1”使我回到提交之前,但是现在如果我签出正确的分支,我该如何撤消对错误分支中文件的更改,而是进行更改(以相同的名称命名)文件)在正确的分支中?
天文学家

我只是把作品git revert commit-id当成魅力。当然,那么您将需要进行更改。
Casey Robinson

8
我相信那将是git cherry-pick <<erroneous-commit-sha>>@astronomerdave。从Almost-2-Year-to-the-Party先生开始。
汤姆·霍华德

@Kris:请使用rebase而不是pick-pick。因为它是先进的樱桃采摘
尤金Konkov

仅当我已经推送我的提交时,我才会使用还原。否则,重设是更好的选择。不要忘记,还原会创建一个新的提交,通常这不是目标。
Hola Soy Edu Feliz Navidad

532

如果您打算完全撤消本地提交,那么您对提交所做的任何更改,如果您对此不担心,只需执行以下命令即可。

git reset --hard HEAD^1

(此命令将忽略您的整个提交,并且您的更改将完全从本地工作树中丢失)。如果要撤消提交,但是要在登台区域中进行更改(在提交之前就像after一样git add),请执行以下命令。

git reset --soft HEAD^1

现在,您提交的文件进入暂存区。假设如果您要升级文件,因为您需要编辑一些错误的内容,请执行以下命令

git reset HEAD

现在已提交的文件将从暂存区域进入未暂存区域。现在文件已准备好进行编辑,因此无论您进行什么更改,都希望对其进行编辑并将其添加并进行新的/新的提交。

更多


13
@SMR,在您的示例中,所有都仅指向当前HEAD。HEAD ^ = HEAD ^ 1。以及HEAD ^ 1 = HEAD〜1。当您使用HEAD〜2时,〜和^符号之间存在差异。如果使用〜2,则表示“第一对父母的第一对父母”或“祖父母”。
Madhan Ayyasamy 2015年

501

如果您安装了Git Extras,则可以运行git undo以撤消最新的提交。git undo 3将撤消最后三个提交。


470

我想撤消我们共享存储库中的最新五次提交。我查找了要回滚的修订版ID。然后我输入以下内容。

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

25
在共享存储库上重写历史记录通常是一个非常糟糕的主意。我想你知道自己在做什么,我只是希望未来的读者也能做到。
Brad Koch

是的,回滚很危险。推入之前,请确保您的工作副本处于所需状态。当推送时,不需要的提交将被永久删除。
neoneye 2012年

6
“就像在现实世界中一样,如果您想重写历史,就需要一个阴谋:每个人都必须'参与'阴谋(至少每个了解历史的人,即每个曾经从分支机构撤出的人) 。” 资料来源:stackoverflow.com/a/2046748/334451
Mikko Rantalainen 2013年

440

我更喜欢使用git rebase -i此工作,因为会弹出一个不错的列表,在这里我可以选择要删除的提交。它可能不像这里的其他答案那么直接,但是感觉不错。

选择要列出的提交数量,然后像这样调用(以列出最后三个)

git rebase -i HEAD~3

样品清单

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

然后,Git将删除您删除的任何行的提交。


422

如何修复先前的本地提交

使用git-gui(或类似命令)执行git commit --amend。在GUI中,您可以从提交中添加或删除单个文件。您也可以修改提交消息。

如何撤消之前的本地提交

只需将分支重置到先前的位置即可(例如,使用gitkgit rebase)。然后从保存的副本重新应用您的更改。在本地存储库中进行垃圾回收之后,就像从未发生过不需要的提交一样。要在单个命令中完成所有这些操作,请使用git reset HEAD~1

警告词粗心使用git reset是使您的工作副本进入混乱状态的好方法。我建议Git新手尽可能避免这种情况。

如何撤消公开提交

执行反向樱桃挑git-revert)撤消更改。

如果您尚未将其他更改添加到分支中,则只需执行...

git revert --no-edit HEAD

然后将更新后的分支推送到共享存储库。

提交历史记录将分别显示两个提交


高级:更正公共存储库中的私有分支

这可能很危险-确保您具有要重新推送的分支的本地副本。

另请注意:如果其他人可能正在分支上工作,则您不想这样做。

git push --delete (branch_name) ## remove public version of branch

在本地清理您的分支,然后重新启动...

git push origin (branch_name)

在正常情况下,您可能不必担心您的私人分支提交历史记录很原始。只需推送一个后续提交(请参见上面的“如何撤消公共提交”),然后再执行壁球合并以隐藏历史记录。


8
gitk --all $(git reflog | cut -c1-7)&如果您要撤消“ --amend”提交,则可能有助于查找先前的修订。
2014年

4
应该注意的是,如果您尝试在推送到共享存储库之前删除机密信息,那么执行恢复操作将无济于事,因为该信息仍将保留在上一次提交的历史记录中。如果您想确保git reset
所做

我认为“私人” /“公共”将更正确地称为“本地” /“远程”。
nobar

还可以通过简单的方法来更正远程存储库中的私有分支git push origin (branch_name) --force
nobar

335

如果您想永久撤消它,并且已经克隆了一些存储库

提交ID可以通过

git log 

然后,您可以-

git reset --hard <commit_id>

git push origin <branch_name> -f

如果您不使用“ <commit_id>”而仅使用“ git reset --hard”怎么办?我通常只想摆脱尚未提交的最新更新,并返回到我所做的最新提交,因此我始终使用“ git reset --hard”。
Jaime Montoya

3
@JaimeMontoya要撤消最新更改,可以使用git reset --hard,但是如果您必须硬删除最后的“ n”个提交,则可以指定一个SHA
贫穷的人17/09/28

334

如果您犯了垃圾但没有被推,

git reset --soft HEAD~1

HEAD〜1是head之前提交的简写。或者,如果您想重置为哈希,则可以引用哈希的SHA-1--soft选项将删除提交,但会保留所有更改的文件“要提交的更改”,因为git status会将其保存。

如果您想摆脱工作树中被跟踪文件的任何更改,因为在头部之前的提交使用“ --hard ”代替。

要么

如果您已经推送并且有人拉了通常是我的情况,则不能使用git reset。不过,您可以执行git revert

git revert HEAD

这将创建一个新的提交,以撤消意外提交所引入的所有内容。


我处于第二种情况,但是当我执行“ git revert HEAD”时,它说:“错误:提交[ID]是合并,但未提供-m选项。致命:恢复失败”。有什么建议么?
metaforge 2014年

2
可能值得一提的是,HEAD~1您可以使用git log --stat或显示的实际哈希代替git reflog-在需要“撤消”多个提交时很有用。
ccpizza 2014年

284

SourceTree(适用于GitHub的GUI)上,您可以右键单击提交并执行“反向提交”。这应该撤消您的更改。

在终端上:

您也可以使用:

git revert

要么:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.


253

只需使用以下命令执行以下操作即可将其重置git

git reset --soft HEAD~1

说明:做什么git reset,基本上就是reset要返回的任何提交,然后如果将其与--soft键结合使用,它将返回,但是将更改保留在文件中,因此您可以回到阶段刚添加的文件是HEAD分支的头,如果与~1(在这种情况下,您也使用HEAD^)结合,它将仅返回您想要的一次提交...

我在下图中为您创建了更详细的步骤,包括在实际情况下和提交代码时可能发生的所有步骤:

如何撤消Git中的最后一次提交?


239

如何撤消最后的Git提交?

为了将所有内容恢复到上一次提交之前的状态,我们需要重置为HEAD之前的提交。

  1. 如果您不想保留所做的更改,请执行以下操作:

    git reset --hard HEAD^
    
  2. 如果要保留更改:

    git reset --soft HEAD^
    

现在检查您的git日志。它将显示我们的上一次提交已被删除。


192

“将工作树重置为最后一次提交”

git reset --hard HEAD^ 

“从工作树中清除未知文件”

git clean    

参见-Git快速参考

注意:此命令将删除您以前的提交,因此请谨慎使用!git reset --hard更安全。


190

使用reflog查找正确的状态

git reflog

刷新之前 重置前重新记录

选择正确的引用日志(在我的情况下为f3cb6e2)并输入

git reset --hard f3cb6e2

之后,回购HEAD将重置为该HEADid 重置效果 LOG AFTER RESET

最后,reflog如下图所示

刷新后 最后完成


164

第一次运行:

git reflog

它将向您显示您对存储库执行的所有可能操作,例如,提交,合并,拉取等。

然后做:

git reset --hard ActionIdFromRefLog

155

撤消上一次提交:

git reset --soft HEAD^ 要么 git reset --soft HEAD~

这将撤消上一次提交。

此处--soft表示重置为暂存。

HEAD~HEAD^意味着要在HEAD之前提交。


将最后的提交替换为新的提交:

git commit --amend -m "message"

它将用新提交替换最后的提交。


153

另一种方式:

签出要还原的分支,然后将本地工作副本重置回您要成为远程服务器上最新提交的提交(之后的所有操作都会再见)。为此,我在SourceTree中右键单击,然后选择“将BRANCHNAME重置为此提交”。

然后导航到存储库的本地目录并运行以下命令:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

这将删除本地存储库中当前提交之后的所有提交,但仅针对该分支。


144

输入git log并找到最后一个提交哈希码,然后输入:

git reset <the previous co>

139

就我而言,我意外地提交了一些我不想提交的文件。所以我做了以下工作,它起作用了:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

使用gitk或git log --stat验证结果


133

很简单,在命令行中运行以下命令:

git reset --soft HEAD~ 

126

有很多方法可以做到这一点:

使用Git命令撤消上一次提交/上一次提交:

警告:如果您不知道自己在做什么,请不要使用--hard。--hard太危险了,它可能会删除您的文件。

恢复Git中的提交的基本命令是:

$ git reset --hard <COMMIT -ID>

要么

$ git reset --hard HEAD~<n>

COMMIT-ID:提交的ID

n: 是您要还原的最后一次提交的次数

您可以获取提交ID,如下所示:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

其中d81d3f1be20eb8是提交ID。

现在让我们看一些情况:

假设您想还原最后的提交'd81d3f1'。这里有两个选择:

$ git reset --hard d81d3f1

要么

$ git reset --hard HEAD~1

假设您要还原提交“ be20eb8”:

$ git reset --hard be20eb8

有关更多详细信息,您也可以参考并尝试其他一些命令以将head重置为指定状态:

$ git reset --help

5
git reset --hard HEAD~1太危险了!这不仅会“取消上一次提交”,还会将存储库完全还原为上一次提交。因此,您将丢失上一次提交中提交的所有更改!
阿尼斯·朱拉加

是的,要撤消该操作,您可以使用git push -f <remote> HEAD@{1}:<branch>
Benny

不幸的是,我用--hard删除了我的文件!我没有先检查评论,因为它已折叠。如果您不知道自己在做什么,请不要使用--hard!
匿名

125

对于本地提交

git reset --soft HEAD~1

或者,如果您不记得确切的提交时间,则可以使用

git rm --cached <file>

对于推送的提交

从存储库历史记录中删除文件的正确方法是使用git filter-branch。那是,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

但我建议您谨慎使用此命令。在git-filter-branch(1)手册页中阅读更多内容。


125

主要有两种情况

您尚未推送提交

如果问题是您提交了多余的文件(并且您不希望这些文件存储在存储库中),则可以使用删除它们git rm,然后使用--amend

git rm <pathToFile>

您还可以使用删除整个目录-r,甚至可以与其他Bash命令结合使用

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

删除文件后,可以使用--amend选项进行提交

git commit --amend -C HEAD # the -C option is to use the same commit message

这将重写您最近的本地提交,从而删除了多余的文件,因此,这些文件将永远不会在推送时发送,也将由GC从您的本地.git存储库中删除。

您已经推送了提交

您可以应用与其他方案相同的解决方案,然后再git push使用该-f选项,但是不建议这样做,因为它会用不同的更改覆盖远程历史记录(这可能会使您的存储库混乱)。

相反,您必须在不进行提交的情况下进行提交--amend(记住有关-amend`的内容:该选项将重写上一次提交的历史记录)。


125

要重置为先前的版本,请永久删除所有未提交的更改:

git reset --hard HEAD~1

23
也许您可以注意到/警告他的命令将丢弃提交和工作目录中的更改,而无需进一步询问。
cr7pt0gr4ph7 2014年


13
使用--soft让您的变化uncommitted changes--hard对核弹完全和一个恢复提交。请记住,仅对尚未推送的更改执行此类操作。
Yunus Nedim Mehel 2015年

@Zaz:你是对的;也许我应该澄清一下。只能恢复已添加到索引(/暂存)或已提交的文件/更改。如您所说,未提交的,未安排的更改完全被丢弃git reset --hard
cr7pt0gr4ph7

1
附带说明:每次暂存文件时,都git将其内容存储在其对象数据库中。仅在执行垃圾回收时才删除存储的内容。因此,可以恢复git reset --hard执行时当前未暂存的文件的最后暂存版本(有关更多信息,请参见上面链接的文章)。
cr7pt0gr4ph7
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.