78 题: 如何撤消Git中最近的本地提交?

在...创建的问题 Wed, May 29, 2019 12:00 AM

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

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

    
19738
  1. 警告:如果您尚未将提交推送到远程,则应该只执行此操作,否则您将搞乱已经撤消提交的其他人的历史记录遥控器!
    2015-05-13 21:18:57Z
  2. 这是一个非常清晰和彻底的帖子关于在Git中撤消事物,直接来自Github。
    2015-06-08 19:39:17Z
  3. 在发布新答案之前,请考虑此问题已有65个以上的答案。确保您的答案有助于现有答案中的答案。
    2017-06-15 15:26:36Z
  4. 你知道git需要什么吗? git undo,就是这样。然后声誉git用于处理我们凡人的错误消失。在执行任何git命令之前,通过在git堆栈上按下当前状态来实现。它会影响性能,因此最好添加一个配置标志,以确定是否启用它。
    2018-03-20 01:45:28Z
  5. @YiminRong可以使用Git的alias功能完成: git-scm.com/book/en/v2/Git-Basics-Git-Aliases
    2018-10-05 14:50:08Z
  6. 醇>
    30答案                              30 跨度>                         

    撤消提交并重做

     
    $ 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~(其中HEAD~HEAD~1相同)但保留现有的更改。
    3. 更正工作树文件。
    4.  git add您希望在新提交中包含的任何内容。
    5. 提交更改,重用旧的提交消息。 reset将旧头复制到.git/ORIG_HEAD; commit-c ORIG_HEAD将打开一个编辑器,该编辑器最初包含来自旧提交的日志消息,并允许您编辑它。如果您不需要编辑消息,可以使用-C选项。
    6. 醇>

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

      如果代码已经推送到您的服务器并且您有权覆盖历史记录(rebase),那么:

       
      git push origin master --force
      

      你也可以看看这个答案:

      如何移动HEAD回到以前的位置? (独立头)&amp;撤消提交

      上面的答案将向您展示git reflog,用于找出您希望恢复的SHA-1是什么。找到要撤消的点后,使用上述命令序列。


      1 但是,请注意,如果您在提交消息中犯了错误,则无需重置为先前的提交。更简单的选择是git reset(取消您之后所做的任何更改),然后 git commit --amend ,h将打开预先填充了最后一次提交消息的默认提交消息编辑器。

          
    21340
    2019-05-20 20:06:45Z
    1. 如果提交到错误的分支,您可以git checkout theRightBranch进行所有更改阶段。正如我必须做的那样。
      2010-10-05 15:44:20Z
    2. 如果您在DOS中工作,而不是git reset --soft HEAD^,则需要使用git reset --soft HEAD~1。 ^是DOS中的延续字符,因此无法正常工作。此外,--soft是默认值,因此如果您愿意,可以省略它,只需说git reset HEAD~1
      2011-04-13 14:15:10Z
    3. 另外,在zsh你必须引用^,所以git reset --soft 'HEAD^' ...至少我做了
      2011-10-27 18:24:16Z
    4. (对我上面写的更正; --mixed是默认值.--mixed表示保留更改的文件,但不保留在索引中.--soft会保留更改的文件并将它们保存在索引中,就像它们在更改提交之前一样。抱歉让人感到困惑。)
      2011-11-17 02:40:53Z
    5. zsh用户可能会得到:zsh: no matches found: HEAD^ - 你需要逃避^即git reset --soft HEAD\^
      2013-02-21 17:47:56Z
    6. 醇>

    如果您不知道如何工作,撤消提交有点可怕。但如果你理解的话,这实际上非常容易。

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

     
       (F)
    A-B-C
        ↑
      master
    

    您希望核实提交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只是指向最新提交的指针。当你执行git reset HEAD~1时,你告诉Git将HEAD指针移回一次提交。但是(除非你使用--hard)你保留文件原样。所以现在git status显示你已经检查过C的变化。你没有丢失任何东西!

    对于最轻微的触摸,您甚至可以撤消您的提交,但保留您的文件和指数 强>:

     
    git reset --soft HEAD~1
    

    这不仅会使您的文件单独存在,甚至会单独留下您的索引。当您执行git status时,您将看到索引中的文件与以前一样。事实上,在这个命令之后,您可以执行git commit,并且您将重做您刚刚提交的相同提交。

    还有一件事:假设您在第一个示例中销毁了提交,但后来发现您需要它?运气好,对吧?

    不,还有仍然让它回来的方法。键入git reflog,您将看到(部分)提交 shas 的列表(是,哈希),你已经移动过。找到你销毁的提交,并执行此操作:

     
    git checkout -b someNewBranchName shaYouDestroyed
    

    你现在已经复活了这个提交。提交实际上并没有在Git中被摧毁大约90天,所以你通常可以回去拯救一个你不想甩掉它的人。

        
    10293
    2018-12-07 09:56:29Z
    1. @ dma_k,是的。或者你可以做一次git reset --hard HEAD^^。我使用波浪号(〜)表示法,因为插入符号(^)符号在DOS中不起作用。
      2012-02-25 15:02:44Z
    2. 另一个不错的提示:您可以将分支重新附加到使用git branch -f <branch> <commit-id>删除它的提交。保存必须重新创建提交!
      2012-06-22 13:11:11Z
    3. 对于git初学者,最后两个选项(--soft和它上面的选项)之间的区别并不明显。提到索引并没有帮助,我们真的不知道这意味着什么。 @ nessur的soft和Ctrl-Z之间的联系真有帮助!但我仍然不太明白这两个选项之间的区别。
      2012-06-26 15:56:52Z
    4. 被告知“为什么”有效的方式要好得多,而不仅仅是被告知答案。感谢这个描述 - 它帮助'得到'git。
      2012-07-03 19:13:35Z
    5. 缺少一个关键点:如果所述提交先前被“推送”到遥控器,任何“撤销”操作,无论多么简单,都会造成巨大的痛苦和痛苦对于在本地副本中进行此提交的其他用户,当他们将来进行'git pull'时。因此,如果提交已被“推送”,请改为:git revert&lt; bad-commit-sha1-id&gt; git push origin:
      2013-11-08 23:43:18Z
    6. 醇>

    我花了一段时间才弄明白,所以也许这会帮助别人......

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

    如何撤消本地提交

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

     
    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
    

    要将所有内容恢复到上一次提交之前的状态,我们需要resetHEAD之前的提交:

     
    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 Basics - 撤消事物

        
    1966
    2018-01-30 23:27:24Z
    1. 我发现这个答案最清楚。 git revert HEAD^不是以前的,是前一个。我做了:git revert HEAD,然后再推,它工作:)
      2011-07-14 08:32:53Z
    2. 醇>

    添加/删除文件以获得您想要的内容:

     
    git rm classdir
    git add sourcedir
    

    然后修改提交:

     
    git commit --amend
    

    之前的错误提交将被编辑以反映新的索引状态 - 换句话说,它就像你从未犯过错误一样。

    请注意,只有在尚未推送的情况下才应执行此操作。如果你已推,那么你只需要正常提交修复。

        
    1685
    2016-10-12 06:45:55Z
    1. 当我做git commit --amend时,这是否有效?我真正打算做的是git commit
      2011-05-18 13:07:31Z
    2. @ dbm,如果你不小心修改了,请使用git reset --soft <oldref>,其中oldref是修改前的提交ID。您可以使用git reflog来标识旧的提交ID。这将取消修改的效果,但保留更改上演。然后只需执行git commit作为常规提交。
      2011-05-18 14:20:48Z
    3. @ Dennis,git commit --amend将当前树(即分阶段更改)转换为提交,覆盖当前HEAD。在那之后,它们不再被认为是暂存的,因为它们是提交的一部分(即,git diff --cached是空白的),但它们不会被“删除”或“丢失”。
    2012-02-01 03:08:06Z
  7. 选项--amend是技巧,以避免虚假提交!
    2019-03-22 19:58:29Z
  8. 醇>
     
    git rm yourfiles/*.class
    git commit -a -m "deleted all class files in folder 'yourfiles'"
    

     
    git reset --hard HEAD~1
    

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

    hard resetHEAD-1会在您错误提交之前将您的工作副本设置为提交状态。

        
    954
    2017-12-13 22:03:28Z
    1. “ - hard”将删除他想要提交的工作目录中的修改后的.java文件。
      2009-05-29 18:26:59Z
    2. 您可以“git stash save”工作副本更改,执行硬重置,然后“git stash pop”将其恢复,但我认为软重置将是简单。
      2011-04-15 13:33:03Z
    3. git commit -a -m ""git commit -am ""自然! :]
      2014-06-21 16:31:59Z
    4. 另一个“快捷方式”使用藏匿处;如果你想取消所有内容(撤消git add),只需git stash,然后是git stash pop
      2015-12-08 22:30:29Z
    5. 醇>

    更改上次提交

    替换索引中的文件:

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

    然后,如果它是私人分支,修改提交:

     
    git commit --amend
    

    或者,如果它是共享分支,请进行新的提交:

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


    更改之前的提交,请使用精彩的互动式广告一>)


    ProTip™:将*.class添加到 gitignore 以再次阻止这种情况发生。


    还原提交

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

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

     
    git reset @~N
    

    其中NHEAD之前的提交数,@~是重置之前的提交。

    因此,您可以使用:

    ,而不是修改提交  
    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
    

    结果

        
    724
    2017-05-23 12:03:09Z
    1. 对于那些将来阅读的人 - 请注意git revert是一个单独的命令 - 基本上“重置”一个单一的commimt。
      2018-08-08 07:11:00Z
    2. 醇>

    使用git revert <commit-id>

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

        
    612
    2018-11-10 09:36:11Z
    1. 如果你致力于错误的分支:一旦恢复,切换到正确的分支,并挑选提交。
      2012-06-27 11:02:58Z
    2. 这是什么意思,樱桃挑选提交?在我的情况下,当我编辑文件时,我在错误的分支上。我承诺了,然后意识到我在错误的分支。使用“git reset --soft HEAD~1”让我回到提交之前,但是现在如果我签出了正确的分支,我如何撤消对错误分支中的文件的更改,而是使它们(在同一个命名中)文件)在正确的分支?
      2015-01-13 22:05:57Z
    3. 我刚刚使用了git revert commit-id就像一个魅力。当然,你需要推动你的改变。
      2016-01-25 21:07:16Z
    4. 我相信那将是git cherry-pick <<erroneous-commit-sha>> @astronomerdave。来自,差不多2年 - 晚到党。
      2016-10-20 18:19:50Z
    5. @ Kris:而不是樱桃选择使用rebase。因为它是先进的樱桃采摘
      2018-11-10 09:38:58Z
    6. 醇>

    如果您计划完全撤消本地提交,无论您在提交时做了什么更改,如果您对此没有任何担心,请执行以下命令。

     
    git reset --hard HEAD^1
    

    (此命令将忽略您的整个提交,您的更改将完全从本地工作树中丢失)。如果要撤消提交,但希望在暂存区域中进行更改(在提交之前,就像在git add之后),请执行以下命令。

     
    git reset --soft HEAD^1
    

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

     
    git reset HEAD
    

    现在已提交的文件从暂存区域进入未分区区域。现在文件已经可以编辑了,所以无论你改变什么,你都要编辑并添加它并进行新的/新的提交。

    更多

        
    494
    2018-09-28 08:43:59Z
    1. @ SMR,在您的示例中,所有都只指向当前的HEAD。 HEAD ^ = HEAD ^ 1。和HEAD ^ 1 = HEAD~1一样。使用HEAD~2时,〜和^符号之间存在差异。如果使用~2表示“第一个父母的第一个父母”或“祖父母”。
      2015-12-14 15:34:11Z
    2. 醇>

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

        
    466
    2011-12-13 10:18:31Z

    我想在我们的共享存储库中撤消最新的5次提交。我查找了想要回滚的修订版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>
    
        
    433
    2012-04-06 13:58:52Z
    1. 重写共享存储库的历史通常是一个非常糟糕的主意。我假设你知道你在做什么,我只希望未来的读者也这样做。
      2012-12-07 16:02:12Z
    2. 是回滚是危险的。确保你的工作合作伙伴在推动之前,py处于所需的状态。当推送时,不需要的提交将被永久删除。
      2012-12-08 14:14:43Z
    3. “就像在现实世界中一样,如果你想重写历史,你需要一个阴谋:每个人都必须在'阴谋'上(至少每个人都是了解历史,即每个从分支机构撤出的人。“资料来源: stackoverflow.com/a/2046748/334451
      2013-08-07 10:10:25Z
    4. 醇>

    我更喜欢使用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将删除您删除的任何行的提交。

        
    412
    2018-12-06 21:59:20Z

    如何修复先前的本地提交

    使用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)
    

    在正常情况下,您可能不必担心您的私有分支提交历史是原始的。只需推送一个后续提交(请参阅上面的“如何撤消公共提交”),然后执行压缩合并隐藏历史。

        
    398
    2018-12-07 05:57:27Z
    1. 如果要撤消“--amend”提交,gitk --all $(git reflog | cut -c1-7)&可能有助于查找以前的修订。
      2014-10-18 23:38:11Z
    2. 应该注意的是,如果您在推送到共享存储库之前尝试删除机密信息,那么执行还原操作将无法帮助您,因为信息仍然存在在上次提交的历史记录中。如果您想确保其他人永远不会看到更改,您需要使用git reset
      2015-09-04 04:52:01Z
    3. 2016-04-05 04:20:04Z
    4. 我认为'private'/'public'更准确地说是'local'/'remote'。
      2018-03-28 14:59:27Z
    5. 更正远程存储库中的私有分支也可以通过简单的git push origin (branch_name) --force
      来完成
      2018-09-07 12:09:38Z
    6. 醇>

    如果你犯了垃圾但没有推,

     
    git reset --soft HEAD~1
    
      

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

         

    如果你想在工作树中删除对工作树中跟踪文件的任何更改,那么在使用“ - hard ”之前提交。

    OR

      

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

     
    git revert HEAD
    
      

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

        
    319
    2014-09-25 07:58:25Z
    1. 我是第二种情况,但是当我做“git revert HEAD”时它说“错误:提交[ID]是合并但没有-m选项是给予。致命:恢复失败“。有什么建议吗?
      2014-11-12 19:36:02Z
    2. 可能值得一提的是,除了HEAD~1之外,您可以使用git log --statgit reflog显示的实际哈希值 - 当您需要“撤消”多个提交时非常有用。 /DIV>
      2014-12-07 00:38:49Z
      醇>

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

      可以看到提交ID  
      git log 
      

      然后你可以做 -

       
      git reset --hard <commit_id>
      
      git push origin <branch_name> -f
      
          
      316
      2015-06-24 09:34:15Z
      1. 如果您不使用“&lt; commit_id&gt;”该怎么办?并简单地使用“git reset --hard”?我通常只是想摆脱我尚未提交的最新更新,并回到我最近的提交,我总是使用“git reset --hard”。
        2017-09-27 23:30:18Z
      2. @ JaimeMontoya要撤消最新的更改,您可以使用git reset --hard,但如果必须硬删除最后一次“n”提交,请指定SHA
        2017-09-28 13:10:3​​1Z
      3. 醇>

      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.
      
          
      269
      2015-06-24 09:34:11Z

      单个命令:

       
      git reset --soft 'HEAD^' 
      

      撤消上一次本地提交真的很棒!

          
      250
      2014-07-21 20:13:34Z
      1. 我需要用双引号写git reset --soft“HEAD ^”,因为我是从Windows命令提示符下写的。
        2014-04-23 09:13:35Z
      2. 它应该没有任何引号。
        2016-11-10 19:19:44Z
      3. 醇>

      使用git

      重新执行以下命令  
      git reset --soft HEAD~1
      

      解释: git reset的作用,对于你想要回复的任何提交,它基本上是reset,然后如果你将它与--soft键组合,它会返回,但保留更改你的文件,所以你回到刚刚添加文件的阶段,HEAD是分支的负责人,如果你与~1结合(在这种情况下你也使用HEAD^),它将只返回一个提交你想要的......

      我在下面的图片中为您创建了更多详细信息,包括在实际情况下可能发生的所有步骤以及提交代码:

          
      241
      2017-10-27 12:46:34Z

      如何撤消上次Git提交?

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

      1. 如果您不想保留所做的更改:

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

         
        git reset --soft HEAD^
        
      3. 醇>

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

            
      223
      2017-03-25 08:14:01Z

      使用reflog查找正确的状态

       
      git reflog
      

      REFLOG BEFORE RESET

      选择正确的reflog(在我的情况下为f3cb6e2)并输入

       
      git reset --hard f3cb6e2
      

      之后,repo HEAD将重置为该HEADid 重置后的日志

      最后,reflog如下图所示

      REFLOG FINAL

          
      180
      2014-01-06 22:34:06Z

      “将工作树重置为上次提交”

       
      git reset --hard HEAD^ 
      

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

       
      git clean    
      

      请参阅 - Git快速参考

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

          
      173
      2017-12-13 22:04:48Z

      首先运行:

       
      git reflog
      

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

      然后做:

       
      git reset --hard ActionIdFromRefLog
      
          
      156
      2015-06-24 09:33:20Z

      撤消上次提交:

      git reset --soft HEAD^git reset --soft HEAD~

      这将撤消上次提交。

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

      HEAD~HEAD^表示在HEAD之前移动到提交。


      将最后一次提交替换为新提交:

       
      git commit --amend -m "message"
      

      它将用新提交替换最后一次提交。

          
      148
      2017-12-13 22:05:20Z

      另一种方式:

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

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

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

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

          
      143
      2015-06-24 09:34:21Z

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

       
      git reset <the previous co>
      
          
      134
      2015-06-24 09:34:18Z

      在我的情况下,我不小心提交了一些我不想要的文件。所以我做了以下工作并且有效:

       
      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

          
      130
      2015-06-24 09:34:09Z

      简单,在命令行中运行:

       
      git reset --soft HEAD~ 
      
          
      121
      2016-01-18 21:58:33Z

      有很多方法可以做到:

      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
      

      其中 d81d3f1 be20eb8 是提交ID。

      现在让我们看一些案例:

      假设您要还原最后一次提交'd81d3f1'。以下是两个选项:

       
      $ git reset --hard d81d3f1
      

       
      $ git reset --hard HEAD~1
      

      假设您要还原提交'be20eb8':

       
      $ git reset --hard be20eb8
      

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

       
      $ git reset --help
      
          
      119
      2018-08-19 14:00:16Z
      1. git reset --hard HEAD~1 太危险了!这不仅仅是'取消最后一次提交',而是将repo完全恢复到之前的提交。因此,您将放弃上次提交中提交的所有更改!
        2017-03-21 12:09:47Z
      2. 你说得对,撤消这个你可以使用git push -f <remote> HEAD@{1}:<branch>
        2017-04-24 13:07:03Z
      3. 不幸的是,我使用了--hard,我的文件被删除了!我没有先检查评论,因为它已折叠。如果你不知道自己在做什么,请不要使用--hard!
        2018-08-19 13:53:17Z
      4. 醇>

      对于本地提交

       
      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)手册页

          
      117
      2014-07-21 20:15:08Z

      主要有两种情况

      您尚未推送提交

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

      进行提交。  
      git rm <pathToFile>
      

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

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

      删除文件后,您可以使用 - 修改选项

      进行提交  
      git commit --amend -C HEAD # the -C option is to use the same commit message
      

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

      您已经推送了提交

      您可以应用其他方案的相同解决方案,然后使用git push选项执行-f,但它不推荐,因为它会以不同的更改覆盖远程历史记录(它可能会使您的存储库陷入混乱) )。

      相反,你必须在没有--amend的情况下进行提交(记住这个关于-amend`:该选项重写最后一次提交的历史记录)。

          
      117
      2016-01-11 23:50:47Z

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

       
      git reset --hard HEAD~1
      
          
      117
      2016-09-16 07:25:01Z
      1. 也许你可以在注释/警告他的命令将丢弃提交和工作目录中的更改而不再询问任何进一步。
        2014-11-24 22:35:29Z
      2. 如果碰巧偶然发生这种情况,不是所有情况都会丢失。请参阅
来源放置 这里