【问题标题】:Undo a git commit撤消 git 提交
【发布时间】:2012-10-03 08:26:22
【问题描述】:

您能否通过 git 命令撤消一个早已合并到您的 git 存储库中的过去提交?还是您必须手动撤消该提交中所做的所有更改?

【问题讨论】:

  • 查看git commit --amend 以修改最后一次提交或git revert,您可以在其中设置要回滚的提交的ID。你可以通过git logGit AmendGit Revert找到提交的ID

标签: git git-commit


【解决方案1】:

您始终可以通过执行以下操作来恢复单个提交的更改:

git revert <commit-id>

请注意,这会创建一个 new 提交,只撤消这些更改

例如git log --oneline

d806fc9 two
18cdfa2 bye
62c332e hello
c7811ee initial

假设我想恢复提交 18cdfa2 中的更改:

git revert 18cdfa2

我们现在有:git log -1 -p

commit fb9d6627a71636503fc9a1eb4f725937c783ecee
Author: Seth <sehe@mint12.(none)>
Date:   Wed Oct 3 10:32:46 2012 +0200

    Revert "bye"

    This reverts commit 18cdfa27c964b66b624be1030250757b745d6866.

diff --git a/a b/a
index 0907563..3b18e51 100644
--- a/a
+++ b/a
@@ -1 +1 @@
-bye world
+hello world

【讨论】:

    【解决方案2】:

    您总是可以使用git revert &lt;commit-hash&gt; 来撤消 git 提交。但是,这在大多数情况下并没有帮助,因为它会创建一个新的提交添加到您的 git reflog。

    当我不得不后退时,我通常会做的是将我的分支重置到更早的阶段。为此,请执行 git reflog 并查找要移动到的 HEAD 位置。

    rizwan@dragonstone:~/myrepo$ git reflog -3
    8d386b8 HEAD@{0}: commit: I did something I don't want
    2a59955 HEAD@{1}: commit: Feedback from PR #792
    1023102 HEAD@{2}: checkout: moving from one branch to another
    

    现在,假设我想提交哈希 2a59955 并撤消 8d386b8 中的所有更改。我会这样做:

    Update: git reset --soft HEAD@{1} 
    

    这会将我的分支重置为初始状态。这样做不仅会撤消所有更改,还会停止跟踪您可能在此提交中添加的所有文件。无论如何,这是在一次提交中撤消所有更改的最有效方法。

    这将撤消您的所有更改。有一个硬重置意味着要回到过去(至少从 git 的角度来看)。为此使用--hard 代替--soft

    【讨论】:

    • 我认为它之所以有帮助,部分原因是 因为它创建了一个新的提交。如果你想撤销你的撤销怎么办?如果您想稍后知道您已完成还原,该怎么办?此外,还应该提到提交+推送,因为只是重置不会改变提交历史。
    • 是的,它没有,我同意拥有恢复提交的历史记录也很重要。当您想后退一步并从上一个状态重新开始时,重置会有所帮助。此外,重置会保留在您的日志中,并且不会像您完全删除提交一样。
    • 软!你用软!您使用该命令丢失更改。我正在寻找如何撤消提交过多的提交(该死,intellij),所以这里是对下一个人的警告。
    • 答案是否需要更新到 SOFT?此外,请参阅 stackoverflow.com/a/21778/509213 以从不需要的硬重置中恢复。
    猜你喜欢
    • 2014-05-06
    • 2018-05-01
    • 2021-06-26
    • 2020-05-13
    • 2010-09-25
    • 2014-06-05
    • 2020-05-13
    • 2021-09-30
    相关资源
    最近更新 更多