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

我不小心commit错误的文件commit给Git,但我还没有push提交提交到服务器。

我怎样才能从本地存储库中取消这些提交?


撤消提交并重做

$ 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)
  • 这是你想要撤消的
  • 这会使您的工作树(磁盘上的文件状态)保持不变,但会取消提交并保留您未提交的更改(因此它们在git status显示为“更改未提交以进行提交”,您需要在提交之前再次添加它们)。 如果你只是想更多的变化添加到先前的承诺,或修改提交MESSAGE1,你可以使用git reset --soft HEAD~代替,这就好比是git reset HEAD~其中HEAD~相同HEAD~1 )但会保留现有的更改。
  • 更正工作树文件。
  • git add任何你想包含在你的新提交中的东西。
  • 提交更改,重新使用旧的提交消息。 reset将旧头复制到.git/ORIG_HEAD ; 使用-c ORIG_HEAD commit将打开一个编辑器,该编辑器最初包含来自旧提交的日志消息并允许您对其进行编辑。 如果您不需要编辑消息,则可以使用-C选项。

  • 1但是,请注意,如果您在提交消息中犯了错误,则不需要重置为较早的提交。 更简单的选项是git reset (以便更新自己做出的更改),然后git commit --amend ,这会打开默认提交消息编辑器,并使用上次提交消息预填充。

    但是要注意,如果你已经对索引添加了新的更改,使用commit --amend将把它们添加到你以前的提交中。

    ----编辑Frank R. 2018-3-9

    如果推动,

    git push origin master --force
    

    如果你不知道它是如何工作的,那么撤销一个提交会有点吓人。 但如果你理解的话,它确实很容易。

    假设你有这个,C是你的头,(F)是你的文件的状态。

       (F)
    A-B-C
        ↑
      master
    

    你想核实提交C并永远不会再看到它 。 你做这个:

    git reset --hard HEAD~1
    

    结果是:

     (F)
    A-B
      ↑
    master
    

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

    啊,但是假设承诺C不是一场灾难,而是一点点关闭。 您希望撤销提交,但在做出更好的提交之前保留一些修改 。 从这里开始,以C作为你的头:

       (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 ,你会看到你已经移动过的(部分)commit shas列表。找到你所销毁的提交,并执行以下操作:

    git checkout -b someNewBranchName shaYouDestroyed
    

    你现在已经复活了那个提交。 提交并没有在Git中真正被破坏90天,所以你通常可以回去拯救一个你并不想要摆脱的东西。


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

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

    如何撤消本地提交

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

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

    链接地址: http://www.djcxy.com/p/3.html

    上一篇: How to undo the most recent commits in Git?

    下一篇: Why is it faster to process a sorted array than an unsorted array?