原文: Git Reverting to Previous Commit – How to Revert to Last Commit

Git 是一个很好的版本控制工具。它还能使你与他人的协作更有效率。

在这篇文章中,你将学习如何在用 Git 跟踪项目时恢复到之前的 commit(提交)。

本文要讨论的两个命令是 git resetgit revert。这些命令可以帮助你撤销你的 commit,回到之前的 commit。

不过它们并不完全相同,所以我们将通过演示每个命令在项目中如何运行的来使本文更实用一些。

任何人都可以理解这个教程,因为它不是关于特定的语言——我们将利用一个文本(txt)文件。

如何使用 git reset 命令恢复到之前的 commit

在本节中,我们将创建一个新文件,并进行三次 commit。然后你会看到如何使用 commit ID 恢复到上一次 commit 或任何其他 commit。

首先,我创建了一个名为 tasks.txt 的文件。该文件中有如下内容:

1. code.
2. Practice.
3. Build. 

接下来,我们要初始化、添加和提交这个文件:

git init
git add tasks.txt
git commit -m "first commit"

我们已经进行了第一次 commit。

我们再重复上面的过程两次,但在每次 commit 之前,我们会在文件中多加一行文字,如下:

1. code.
2. Practice.
3. Build. 
4. Research. 
git add tasks.txt
git commit -m "second commit"

最后,对于第三次 commit:

1. code.
2. Practice.
3. Build. 
4. Research. 
5. Write.
git add tasks.txt
git commit -m "third commit"

现在我们有三个 commit。要恢复到之前的 commit,你必须先得到 commit ID。要做到这一点,请执行下面的命令:

git log --oneline

我们的终端中显示如下:

git-commit
git log --oneline

正如你在上面看到的,这个命令列出了你所有的 commit 以及它们的 ID。

要回到第二个 commit,你可以运行 git reset 命令,后面跟上 commit 的 ID,即:

git reset 5914db0

如果你一直跟到这一步,你不会注意到文件有什么不同(你会在后面看到如何撤销提交和对文件的任何修改)。

文件仍然是这个样子的:

1. code.
2. Practice.
3. Build. 
4. Research. 
5. Write.

但当我们运行 git log --oneline 命令时,第三次提交不会出现在提交日志中:

second-commit
git log --oneline

我们已经成功回到了之前的 commit。

如果你想撤销一个 commit,并撤销该提交之后的所有修改,你可以在 git reset 命令中加上 --hard 标志:

让我们测试一下这个方法,回到第一个 commit:

git reset 89f6c3d --hard

这就是文本文件现在的样子:

1. code.
2. Practice.
3. Build. 

我们又回到了指定提交时的文件初始状态。所有在那次 commit 之后对文件所做的修改都被删除。当我们检查提交日志时,我们将只看到第一次 commit。

虽然这看起来是件很酷的事情,但在使用这条命令时,你应该小心。特别是当你和一个团队一起工作时。

如果你撤销了一个 commit,并删除了它之后的每一个文件改动,你可能会失去你和其他队友对代码所做的重要改动。这也会改变你项目的提交历史。

幸运的是,我们有办法恢复被删除的 commit 的状态。你可以在这里了解更多信息。

如何使用 git revert 命令恢复到之前的 commit 内容

我已经初始化了项目,并像上一节中那样做了三次 commit。下面是提交日志的样子:

commit-log
git log --oneline

要恢复到之前的 commit,请运行 git revert 命令,同时输入当前提交的 ID。

在我们的例子中,我们将使用第三个提交的 ID:

git revert 882ad02

上面的命令会撤销当前的 commit,将文件恢复到上一次 commit 的状态。当你检查 commit 日志时,你会看到这样的内容:

revert-log
git log --oneline

git reset 命令不同的是,git revert 命令为被还原的改动创建一个新的 commit。我们还原的那个 commit 不会被删除。

所以你可以看到,git resetgit revert 是不一样的。

git reset 会撤消直到指定的 commit ID 的状态的改动。例如,恢复到第二个 commit ID 的状态将撤消改动,并将文件的状态保持为第二个 commit 的状态。

git revert 将撤消到指定的 commit ID 之前的状态。例如,还原到第二个 commit ID 将撤销更改,并将文件的状态保留为第二个 commit 之前的 commit 的状态——第一个 commit。

上面的解释可能看起来很混乱。理解它的最好方法是自己去尝试。

何时使用 git reset 和 git revert

当你在本地仓库上工作时,如果变化尚未被远程推送,你应该使用 git reset。这是因为在从远程仓库拉取修改后运行该命令会改变项目的 commit 历史,导致在该项目上工作的每个人发生合并冲突。

当你意识到对某一本地分支所做的修改应该在其他地方时,git reset 是一个不错的选择。你可以重置并移动到想要的分支,而不会丢失你的文件修改。

对于恢复推送到远程仓库的改动,git revert 是一个很好的选项。因为这个命令会创建一个新的提交,而不会改变其他人的提交历史。

总结

在这篇文章中,我们谈到了在 Git 中恢复以前的提交。

我们谈到了两个主要的命令,即 git resetgit revert 命令,它们显示了如何撤销 Git 修改。

我们还通过实际例子看到了这两个命令是如何工作的。

Happy coding!