如何使用Git恢复

git revert是如何使用的?

这听起来像是一个重复的问题,但当人们问这个问题时,回答通常是,按照在Git中通过SHA哈希恢复到提交?< / >使用git reset

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

在你意识到之前,八个不同的人出现了,他们用自己独特的方法来救OP的屁股,所有这些都超出了你的理解范围。

所以,让我们试着坚持简短,写一个傻瓜指南git revert

一个场景:你承诺了两次master,结果很糟糕。你在推波助澜,别人也有你的坏改变。

你想要撤销它。这不是你可以自己在代码中手工撤销的东西,比如一些向导或包管理器在各处更改了大量的东西——你只想把它都放回原来的样子。

这就是源代码控制的意义所在。我相信这很简单。

好吧,你将使用git revert,但如何使用呢?

在运行git revert之后,你还需要做其他事情吗?你必须提交恢复所做的更改还是恢复直接提交到存储库还是什么??

显然,你需要再次用力,可能还会向团队宣布你的决定。

266247 次浏览

使用Git恢复如下所示:

git revert <insert bad commit hash here>

git revert创建一个包含回滚更改的新提交。git reset将擦除Git历史记录,而不是进行新的提交。

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

resetrevert在相同的对话中经常出现的原因是因为不同的版本控制系统使用它们来表示不同的事情。

特别是那些习惯了颠覆必然地的人,他们想要丢弃对文件未提交的更改,在被告知他们实际上想要reset之前,他们经常会使用revert

类似地,在其他风投公司中等价的revert通常被称为rollback或类似的东西——但是“回滚”;也可以表示“我想完全丢弃最后几个提交”,这适用于reset,但不适用于revert。因此,人们知道他们想做什么,但不清楚他们应该使用哪个命令,这有很多困惑。

至于你关于恢复…

你会用到git revert,但是怎么用呢?

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

注意第一次错误提交的^字符。这引用了first-bad-commit的父类,因为恢复范围包含了开始提交。

在运行git恢复之后,你还需要做其他事情吗?你必须提交恢复所做的更改还是恢复直接提交到存储库还是什么??

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

——编辑

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

——no-commit

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

这在将多个提交的效果还原到一行中的索引时非常有用。

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

Git会进行一次新的提交

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

要还原的提交在历史记录中的哪个位置并不重要(在上面的例子中,还原的是最后一次提交——任何提交都可以还原)。

关闭问题

之后你还有别的事要做吗?

git revert只是另一个提交,例如,推到远程,以便其他用户可以提取/获取/合并更改,然后你就完成了。

你必须提交还原所做的更改还是还原直接提交到回购?

git revert a commit -没有额外的步骤假设还原一个单一的提交是你想做的。

显然你需要再推一次,可能还要向团队宣布。

实际上——如果远程处于不稳定状态——与团队的其他成员沟通他们需要拉取以获得修复(还原提交)将是正确的事情:)。

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

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

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

:wq

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

git push

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

作为一个初学者,在经历了一些试验和错误(错误比试验更多)后,我得到了一个重要的观点:

  • 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

我知道这些是“基本的”;但这对我来说很困惑,通过在第一个id('第一次提交')上运行revert,我期望找到我的初始文件,这需要一段时间来理解,如果你需要你的文件作为'第一次提交',你需要使用下一个id。

下面的信息图显示了git revert本质上是一个反向的git cherry-pick,通过前滚来撤销东西;被还原的目标提交将保留在历史记录中!

当你不能重写整个历史,但仍然想完全撤销之前的提交时,使用git revert。与大多数Git命令一样,还原是在本地执行的,因此,需要推送结果提交,以便与团队的其他成员共享。

信息图表显示如何