如何使用Git Revert


107

如何git revert使用?

这听起来像是一个重复的问题,但是当人们提出该问题时,响应通常git reset是按以下方式使用的:还原为Git中SHA哈希的提交?

然后,当有人问如何使用git reset别人时,回答说您应该git revert按照Git使用-如何回滚

在不知不觉中,有8个不同的人以他们自己独特的方式来保存OP的屁股,所有这些事都困扰着您。

因此,让我们尝试简短地写一些简短的摘要,并为撰写一份《傻瓜指南》git revert

一个场景:您已经两次对母带及其缺点进行过承诺。你被推了,其他人有你的不好的改变。

您要撤消它。并不是说您自己可以手动撤消代码,比如说某个向导或程序包管理器到处改变了很多东西-您只想把它放回原样。

这就是源代码控制的全部内容。我敢肯定这很容易。

好的,您将要使用,git revert但是如何使用?

跑步后git revert,您还必须做其他事情吗?您是否必须将所做的更改提交到还原,还是直接还原到仓库?

显然,您需要再次推动,并可能向团队宣布自己的实力。

Answers:


119

git revert进行新的提交

git revert 只需创建一个与现有提交相反的新提交即可。

它将文件保留为相同的状态,就好像从未存在已还原的提交一样。例如,考虑以下简单示例:

$ cd /tmp/example
$ git init
Initialized empty Git repository in /tmp/example/.git/
$ echo "Initial text" > README.md
$ git add README.md
$ git commit -m "initial commit"
[master (root-commit) 3f7522e] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ echo "bad update" > README.md 
$ git commit -am "bad update"
[master a1b9870] bad update
 1 file changed, 1 insertion(+), 1 deletion(-)

在此示例中,提交历史记录有两次提交,最后一次是错误。使用git revert:

$ git revert HEAD
[master 1db4eeb] Revert "bad update"
 1 file changed, 1 insertion(+), 1 deletion(-)

日志中将有3次提交:

$ git log --oneline
1db4eeb Revert "bad update"
a1b9870 bad update
3f7522e initial commit

因此,对于所发生的事情有一致的历史记录,但是文件好像从未发生过错误的更新:

cat README.md 
Initial text

与要还原的提交在历史记录中的位置无关(在上面的示例中,最后一个提交已还原-任何提交都可以还原)。

结题

之后您还需要做其他事情吗?

一个git revert刚刚另一个承诺,所以如推到远程,以便其他用户可以拉/读取/合并的变化,你就大功告成了。

您是否必须提交对还原所做的更改或将还原直接提交至存储库?

git revert 一个提交-假设您要还原单个提交,则没有多余的步骤。

显然,您需要再次推动并可能向团队宣布。

的确,如果遥控器处于不稳定状态,则与团队的其他成员进行沟通以获取解决方案(还原提交)将是正确的选择:)。


通过确认的方式,无论是这里的第一条语句,还是想知道我只是想知道它是如何工作的任何人,都可以还原一个还原,自还原以来,这里有多个新的提交。因此,真正还原只是与还原的提交相反的提交。当然,您可能会发生冲突……但这是另外一个故事。
GG2

我总是觉得最好避免使用它,只是先回顾一下更改git revert -n <commitToRevet>git revert --no-commit <commitToRevet>
后才

2
只是想说,经过多年的stackoverflow,我认为这可能是我遇到过的最好的答案之一。很好的例子和解释。谢谢。
user3344977

我进入这里是希望获得更多信息,例如此raw.githubusercontent.com/git/git/master/Documentation/howto/…的TLDR
wviana

1
@wviana如果您找到的信息不足,请写一个答案。请注意,堆栈溢出不能替代官方文档(您似乎正在链接到该文档,并且比该问题涵盖的范围要广得多)。
AD7six

35

像这样使用git revert:

git revert <insert bad commit hash here>

git revert使用回滚的更改创建一个新的提交。git reset删除您的git历史记录,而不是进行新的提交。

后续步骤与任何其他提交相同。


“还原提交”和“还原为提交”之间的区别非常微妙,以至于我多年来一直在使用此命令。您的解释立即为我解决了。谢谢!
claviska

24

究其原因reset,并revert往往会拿出很多相同的谈话是因为不同的版本控制系统使用它们来表示不同的东西。

特别是,习惯于SVN或P4的人想要放弃对文件的未提交的更改,通常会revert在被告知他们实际想要之前就达到了reset

类似地,revert通常会调用其他VCS中的等效项rollback或类似名称-但“回滚”也可能表示“我想完全放弃最近的几次提交”,它适用于reset但不适用revert。因此,人们知道自己想做什么,但并不清楚应该使用哪个命令,这引起了很多混乱。

至于您关于还原的实际问题...

好的,您将使用git revert,但是如何?

git revert first-bad-commit..last-bad-commit

在运行git revert之后,您还需要做其他事情吗?您是否必须提交对还原所做的更改,或者是否将还原直接提交至仓库或什么?

默认情况下,git revert提示您输入提交消息,然后提交结果。这可以被覆盖。我引用手册页

- 编辑

使用此选项,git revert将允许您在提交还原之前编辑提交消息。如果从终端运行命令,则为默认设置。

-不提交

通常,该命令会自动使用提交日志消息创建一些提交,这些消息指出已还原哪些提交。该标志将必需的更改应用于将命名的提交还原到您的工作树和索引中,但不进行提交。此外,使用此选项时,索引不必与HEAD提交匹配。还原是针对索引的开始状态进行的。

当连续将多个提交的效果恢复到索引时,此功能很有用。

特别是,默认情况下,它将为您要还原的每个提交创建一个新的提交。您可以revert --no-commit用来创建恢复所有更改的更改,而不必将这些更改作为单个提交提交,然后在闲暇时提交。


git revert first-bad-commit..last-bad-commit:我认为应该这样git revert parent-of-first-bad-commit..last-bad-commit
user1071847

9

这个问题已经很老了,但是回复仍然使人们(像我这样)感到困惑

作为初学者,经过反复试验(错误比试验多),我有一个重要的观点:

  • git revert需要您要删除的提交的ID,并将保留在历史记录中

  • git reset需要您要保留的提交,并将因此从历史记录中删除所有内容。

也就是说,如果您使用 revert第一个提交ID,则会发现自己进入了一个空目录,并在历史记录中进行了另一次提交,而使用reset时,您的目录将恢复为初始提交,并且您的历史记录将变得好像最后一次提交从未发生。

使用以下日志更加清楚:

# git log --oneline

cb76ee4 wrong
01b56c6 test
2e407ce first commit

默认情况下,使用git revert cb76ee4会把您的文件恢复为01b56c6,并将进一步添加您的历史记录:

8d4406b Revert "wrong"
cb76ee4 wrong
01b56c6 test
2e407ce first commit

git reset 01b56c6 而是将您的文件重新带回01b56c6,并从您的历史记录中清除所有其他提交:

01b56c6 test
2e407ce first commit

我知道这些是“基础”,但是这对我来说很困惑,因为我revert希望以第一个id(“首次提交”)运行,因此我希望找到我的初始文件,花了一段时间才能理解,如果您需要返回文件作为“首次提交”,您需要使用下一个ID。


我观察到了同样的情况。它确实令人困惑,但要知道却是如此重要。就在最近,我不得不帮助一位同事,却忘记了这一点。有点尴尬。
ExOfDe

1

我通过运行'git revert commit id'还原了一些提交,例如:

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

然后,系统提示我提交还原(就像运行“ git commit”时一样)。我的默认终端程序是Vim,所以我运行了:

:wq 

最后,我使用以下命令将更改推送到存储库:

git push
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.