撤销一个git提交

59

你是否可以通过git命令撤销已合并到Git存储库中的过去提交?或者您必须手动撤销该提交中所做的所有更改?


1
请查看 git commit --amend 来修改最后一次提交或者 git revert,您可以设置要回滚的提交的 ID。您可以使用 git log 定位提交的 id。 [Git Amend](http://git-scm.com/book/en/Git-Basics-Undoing-Things) [Git Revert](http://gitready.com/intermediate/2009/03/16/rolling-back-changes-with-revert.html) - dasheddot
这回答了你的问题吗?如何在Git中撤消最近的本地提交? - Damjan Pavlica
1
@DamianPavlica 这个问题特别涉及到一个旧的提交,上面已经有很多内容了。你建议的那个答案是针对最新的提交的。 - edwardmlyte
2个回答

63

你可以通过以下方式撤销单个提交所做的更改:

git revert <commit-id>

请注意,这会创建一个新的提交,仅撤销那些更改。

例如: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

注意:这也会撤销在不想提交的版本之前对文件系统所做的所有更改。 - Franz Holzinger
注意:这也会撤销在不需要的提交之前对文件系统所做的所有更改。 - Franz Holzinger
@FranzHolzinger 你是什么意思?原则上它不会 实时示例。冲突的工作树编辑将阻止还原:冲突错误。已经提交的冲突将需要手动解决,就像任何合并一样 像这样。 也许取决于配置,它可能会 看起来 丢失本地更改 - 如果您启用了高级功能,如自动存储,rerere? - sehe
这不是关于冲突的问题。但我已经在文件上进行了本地更改。然后我做了一个错误的提交。但是当撤消最后一次提交时,我的文件更改也被还原为Git版本而没有任何警告。 - Franz Holzinger
这不是关于冲突的问题。但是我对文件进行了本地修改。然后我提交了一个错误的更改。但是当撤销最后一次提交时,我的文件更改也被还原为Git版本,而没有任何警告。 - Franz Holzinger
@FranzHolzinger 我向你展示了那不会发生。毫无疑问,可能涉及其他因素(例如git reset或checkout)。 - sehe

38
你可以始终使用git revert <commit-hash>来撤销一个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


1
我认为这部分有帮助的原因在于它创建了一个新的提交。如果您想撤消您的撤消怎么办?如果您想稍后知道您已经进行了还原怎么办?此外,还应该提到提交+推送,因为仅重置并不会改变提交历史记录。 - eis
是的,它确实不会。我同意拥有被还原提交历史记录的重要性。当你想要向后退一步并从上一个状态重新开始时,重置是有帮助的。此外,重置会留在你的日志中,而不是像你完全删除提交一样。 - automaticAllDramatic
9
软重置!你使用软重置!这个命令会让你失去所有更改。我正在寻找如何撤销一个提交的过程中,由于IntelliJ犯了一个错误,提交了太多内容。因此,这里是给下一个人的一个警告。 - cmp
2
答案需要更新到SOFT吗?此外,参考https://dev59.com/HXVD5IYBdhLWcg3wWaVh#21778以从不必要的HARD重置中恢复。 - edwardmlyte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接