175

如何git revert使用?

这听起来像是一个重复的问题,但是当人们问这个问题时,通常会git reset按照Revert to a commit by a SHA hash in Git?

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

在不知不觉中,8 个不同的人出现了,他们用自己独特的方式拯救了 OP 的屁股,所有这些都在你的脑海中。

因此,让我们试着坚持简短并编写一个傻瓜指南git revert

一个场景:你已经两次提交给 master 和它的坏处。你已经推动,其他人也有你不好的改变。

你想撤消它。这不是您可以自己在代码中手动撤消的东西,比如说某个向导或包管理器在整个地方更改了大量的东西 - 您只想将它​​们全部恢复原状。

这就是源代码控制的全部意义所在。我敢肯定这很容易。

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

跑步之后git revert你还需要做其他事情吗?您是否必须提交所做的更改还原或还原直接提交到回购或什么?

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

4

6 回答 6

184

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 还原:

$ 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

要恢复的提交在历史记录中的哪个位置无关紧要(在上面的示例中,最后一次提交被恢复 - 任何提交都可以恢复)。

结束问题

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

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

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

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

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

确实 - 如果遥控器处于不稳定状态 - 与团队的其他成员沟通他们需要拉动以获得修复(恢复提交)将是正确的做法:)。

于 2013-09-26T15:41:15.517 回答
56

像这样使用 git revert :

git revert <insert bad commit hash here>

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

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

于 2013-09-26T15:32:50.190 回答
33

这个问题已经很老了,但revert仍然让人们感到困惑(比如我)

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

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

  • git reset需要您要保留的提交,并且随后会从历史记录中删除任何内容。

也就是说,如果您使用revert第一个提交 ID,您会发现自己进入一个空目录并在历史记录中添加一个附加提交,而使用重置您的目录将..恢复到初始提交,您的历史记录将变得好像最后一次提交从未发生过。

更清楚地说,使用这样的日志:

# 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。

于 2019-12-03T12:09:48.210 回答
26

在相同的对话中出现很多的原因reset和往往是因为不同的版本控制系统使用它们来表示不同的东西。revert

特别是,习惯了 SVN 或 P4 并想要丢弃对文件的未提交更改的人通常会revert在被告知他们真正想要reset.

类似地,revert其他 VCS 中的等价物通常被称为rollback或类似的东西 - 但“回滚”也可能意味着“我想完全丢弃最后几个提交”,这适用于reset但不适用revert。因此,在人们知道他们想要做什么但不清楚他们应该使用哪个命令的地方存在很多混乱。

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

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

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

编辑:注意^第一个错误提交的字符。这是引用 的父级first-bad-commit,因为还原范围不包括起始提交。

运行 git revert 之后你还需要做其他事情吗?您是否必须提交所做的更改还原或还原直接提交到回购或什么?

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

- 编辑

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

--无提交

通常,该命令会自动创建一些提交,其中包含提交日志消息,说明哪些提交已恢复。此标志应用必要的更改以将命名提交还原到您的工作树和索引,但不进行提交。此外,使用此选项时,您的索引不必匹配 HEAD 提交。恢复是针对索引的开始状态完成的。

这在将多个提交的效果恢复到连续索引时很有用。

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

于 2013-09-26T15:33:34.160 回答
3

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

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

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

:wq 

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

git push
于 2019-03-28T14:42:20.797 回答
1

信息图显示了如何通过向前滚动git revert本质上是一个倒置的git cherry-pick、撤销的东西;被还原的目标提交保留在历史记录中!

git revert当您无法重写整个历史记录但仍想完全撤消较早的提交时使用。与大多数 git 命令一样,revert 是在本地执行的,因此需要推送生成的提交以便与团队的其他成员共享。

信息图显示如何

于 2021-09-22T11:24:47.410 回答