如何使用Git Revert


How to use Git Revert

如何使用git revert

这听起来像是一个重复的问题,但当人们问它时,通常会使用git reset,根据git中的sha散列返回到commit?

然后,当有人问如何使用git reset时,人们回答说你应该按照git使用git revert—如何回滚

在你意识到这一点之前,8个不同的人出现了,他们用自己独特的方式来拯救OP的屁股,所有这些都在你的头上。

所以,让我们试着写一篇关于git revert的虚拟指南。

一个场景:你已经两次对大师和它的坏承诺。你推了别人,别人给你带来了不好的改变。

你想撤销它。这不是你可以自己在代码中提交撤销的东西,比如说某个向导或包管理器在整个地方改变了很多东西——你只想把它放回原来的样子。

这就是源代码管理的全部内容。我相信这很容易。

好吧,你要用git revert,但是怎么用呢?

在运行了git revert之后,你还需要做其他的事情吗?您是否必须提交所做的更改,或者Revert是否直接提交给repo,或者什么??

很明显,你需要再推一次,可能会向球队宣布你的球。


Git Revert进行新的提交

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

它使文件保持相同的状态,就好像恢复的提交从未存在过一样。例如,考虑下面的简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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还原:

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

日志中有3个提交:

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

因此,已经发生的事情有一个一致的历史记录,但是这些文件好像从未发生过错误的更新:

1
2
cat README.md
Initial text

在历史记录中,要恢复的提交在哪里并不重要(在上面的示例中,最后一次提交是被恢复的-任何提交都可以被恢复)。

结语问题

do you have to do something else after?

git revert只是另一个提交,例如推到远程,这样其他用户就可以拉/取/合并更改,您就完成了。

Do you have to commit the changes revert made or does revert directly commit to the repo?

git revert是一个提交—没有额外的步骤假定恢复单个提交是您想要做的。

Obviously you'll need to push again and probably announce to the team.

事实上,如果远程处于不稳定状态,那么与团队的其他成员通信,他们需要拉来获取修复(恢复提交)是正确的做法:)。


使用git revert,如下所示:

git revert

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

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


在同一个对话中,resetrevert往往会出现很多问题,原因是不同的版本控制系统使用它们来表示不同的事情。

尤其是,那些习惯于SVN或P4的人,如果想放弃对文件的未提交更改,在被告知他们实际上想要reset之前,他们通常会联系到revert

类似地,其他VCSE中的revert等价物通常称为rollback或类似的东西,但"回滚"也意味着"我要完全放弃最后几次提交",这适用于reset,但不适用于revert。所以,在人们知道他们想做什么的地方有很多困惑,但不清楚他们应该使用哪个命令。

至于你关于回复的实际问题…

Okay, you're going to use git revert but how?

江户十一〔11〕。

And after running git revert do you have to do something else after? Do you have to commit the changes revert made or does revert directly commit to the repo or what??

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

--edit

With this option, git revert will let you edit the commit message prior to committing the revert. This is the default if you run the command from a terminal.

--no-commit

Usually the command automatically creates some commits with commit log messages stating which commits were reverted. This flag applies the changes necessary to revert the named commits to your working tree and the index, but does not make the commits. In addition, when this option is used, your index does not have to match the HEAD commit. The revert is done against the beginning state of your index.

This is useful when reverting more than one commits' effect to your index in a row.

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


我通过运行"git revert commit id"恢复了一些提交,例如:

1
git revert b2cb7c248d416409f8eb42b561cbff91b0601712

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

1
:wq

最后,我将更改推送到存储库:

1
git push