原文: Git Revert – How to Reset a File or Commit

当与团队一起做一个项目或你自己做一个项目时,通过版本控制来跟踪代码库的变化是很重要的。

Git 为你提供了不同的命令来跟踪文件变化。这些命令将使你能够与其他开发人员协作、访问文件历史、管理代码,等等。

在这篇文章中,你将学习如何恢复和重置一个文件或提交到之前的提交。

我们将使用一些简单的 HTML 代码来演示如何使用 Git 恢复和重置到之前的提交。

让我们开始吧!

如何重置一个文件或提交

在本节中,你将学习如何使用以下命令来恢复/重置一个文件或提交:

  • git revert
  • git reset

如何使用 git revert 命令恢复文件或提交

下面是 git revert 命令的语法:

git revert [commit ID]

下面是我们将使用的代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Document</title>
  </head>
  <body>
    <h1>Hello World!</h1>
  </body>
</html>

让我们假设上面的文件是每个在项目上工作的开发人员的代码库的当前状态。

我们将对该文件做一些修改,然后添加、提交和推送这些修改,即:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Document</title>
  </head>
  <body>
    <h1>Hello World!</h1>

    <ul>
        <li>Red</li>
        <li>Yellow</li>
        <li>Orange</li>
    </ul>
    
  </body>
</html>

我们已经在代码中添加了一个颜色列表。让我们用下面的命令推送这些变化:

git add .
git commit -m "added colors to the HTML file"
git push -u origin main

现在,新的变化已经为在特定代码分支上工作的所有人更新了。

但如果添加的颜色是应该在未来为用户发布的功能的一部分呢?你提前发布了这个功能,就犯了一个错误。

要恢复到之前的提交,你需要那个特定提交的 ID。要得到提交 ID,请执行下面的命令:

git log

该命令会显示每个提交的 ID、作者和日期。它应该是这样的:

git-log
git log

在我们的例子中,提交 ID 是 785dd5a6dd0f1ebd9e06045df787d8d28fd38285。

所以,要重置文件,就用 git revert [commit ID],即:

git revert 785dd5a6dd0f1ebd9e06045df787d8d28fd38285

上面的命令将重置某个特定提交之前对文件所做的所有修改。下面是现在的 HTML 文件:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Document</title>
  </head>
  <body>
    <h1>Hello World!</h1>
  </body>
</html>

现在你可以推送这个新状态了。

请注意,git revert 命令并不从远程仓库中删除被恢复的提交。相反,它为被恢复的改动创建一个新的提交。

这意味着你将拥有被恢复的提交的历史和包含被恢复的修改的文件的新提交。

如何使用 git reset 命令重置文件或提交

git reset 命令也可以用来恢复修改。请看下面的提交历史:

git-log-1

上面的图片显示了所有的提交历史——从第一次提交到最后一节的还原提交。

如果我们用 git reset [commit ID] 来还原某个特定的提交,之后的其他提交都会从提交历史中被删除。

下面是一个例子:

git reset c1e4962a9b355f023c250609cfa9303a67b3063e

使用第一次提交的提交 ID,我们回到了第一次提交的状态。

运行 git log 命令,你会有一个这样的提交历史:

git-log-2

虽然你已经成功地恢复到了第一次提交,但代码中其他提交的历史却被抹去了。这在与其他开发者合作时,会产生非常负面的影响。

摘要

在这篇文章中,我们谈到了两个重要的 Git 命令,即 git revertgit reset,用于撤销 Git 仓库中的修改。

这两个命令都能让你回到代码库中之前的指定状态,但后果不同。

git revert 命令会恢复到指定的提交,但会保留代码库中其他所有提交的历史,并为恢复的改动创建一个新的提交。这是一种在与他人合作时撤销修改的更有效的方式。

另外,git reset 命令会恢复到指定的提交,然后删除指定提交之后的所有提交。

为了安全起见,在撤销有其他开发者工作的 repo 中的修改时,请使用 git revert

你可以在撤销修改后想完全删除提交的情况下使用 git reset

Happy coding!