Git Reset

17 Mar 2025 | 6 分钟阅读

术语 reset 代表撤销更改。 git reset 命令用于重置更改。 git reset 命令有三种核心调用形式。这些形式如下。

  • Mixed

如果用 Git 的术语来说,那么 Git 是一个将 HEAD 的当前状态重置为指定状态的工具。它是一个用于撤销更改的复杂且通用的工具。它充当 Git 的时光机。你可以在各个提交之间来回跳转。这些重置变体中的每一个都会影响 Git 用于在其内容中处理文件的特定树。

此外,git reset 可以在整个提交对象或单个文件级别上运行。这些重置变体中的每一个都会影响 Git 用于处理你的文件及其内容的特定树。

Git Reset

Git 使用索引(暂存区)、HEAD 和工作目录来创建和恢复提交。如果你不了解 Head、树、索引是什么,请访问 Git 索引Git Head

工作目录允许你更改文件,并且你可以将其暂存到索引中。暂存区使你能够选择要放入下一个提交的内容。提交对象是内容的加密哈希版本。它有一些元数据和用于切换到先前提交的指针。

让我们了解 git reset 命令的不同用法。

Git Reset Hard

它将首先移动 Head 并使用提交的内容更新索引。这是最直接、最不安全且最常用的选项。 --hard 选项更改提交历史记录,并将引用指针更新为指定的提交。然后,需要重置暂存索引和工作目录以匹配指定的提交。任何先前待处理的提交到暂存索引和工作目录都会被重置以匹配提交树。这意味着任何等待的工作都将丢失。

让我们通过一个例子来理解 --hard 选项。假设我向现有的存储库添加了一个新文件。要将新文件添加到存储库,请运行以下命令

要检查存储库的状态,请运行以下命令

要检查 Head 和先前提交的状态,请运行以下命令

考虑下图

Git Reset

在上面的输出中,我添加了一个名为 newfile2.txt 的文件。我检查了存储库的状态。我们可以看到当前 head 的位置尚未更改,因为我尚未提交更改。现在,我将执行 reset --hard 选项。 git reset hard 命令将执行如下

考虑下面的输出

Git Reset

正如你在上面的输出中看到的那样,-hard 选项是在可用的存储库上操作的。此选项将重置更改并匹配 Head 在最后更改之前的状态。它将从暂存区中删除可用的更改。考虑以下输出

Git Reset

上面的输出显示了 hard 重置后存储库的状态。我们可以看到我的存储库中没有任何要提交的内容,因为所有更改都通过 reset hard 选项删除以匹配当前 Head 的状态。因此,文件 newfile2.txt 已从存储库中删除。

有一个更安全的方法可以通过 git stash 重置更改。

通常,reset hard 模式执行以下操作

  • 它将移动 HEAD 指针。
  • 它将使用 HEAD 指向的内容更新暂存区。
  • 它将更新工作目录以匹配暂存区。

Git Reset Mixed

混合选项是 git reset 命令的默认选项。如果我们不传递任何参数,则 git reset 命令被视为 --mixed 作为默认选项。混合选项更新引用指针。暂存区也会重置为指定提交的状态。撤消的更改将转移到工作目录。让我们通过一个例子来理解它。

让我们创建一个新文件,例如 newfile2.txt。检查存储库的状态。要检查存储库的状态,请运行以下命令

它将显示来自暂存区的未跟踪文件。将其添加到索引中。要将文件添加到暂存索引中,请运行 git add 命令,如下所示

上面的命令将把文件添加到暂存索引中。考虑以下输出

Git Reset

在上面的输出中,我将 newfile2.txt 添加到我的本地存储库中。现在,我们将在该存储库上执行 reset mixed 命令。它将运行如下

或者我们可以只使用 git reset 命令而不是此命令。

上面的命令将重置 Head 的状态,它不会从暂存区删除任何数据以匹配 Head 的位置。考虑以下输出

Git Reset

从上面的输出中,我们可以看到我们已经通过执行 git reset -mixed 命令重置了 Head 的位置。此外,我们已经检查了存储库的状态。正如我们所看到的,存储库的状态并未因该命令而改变。因此很明显,混合模式不会从暂存区清除任何数据。

通常,reset mixed 模式执行以下操作

  • 它将移动 HEAD 指针
  • 它将使用 HEAD 指向的内容更新暂存区。

它不会更新工作目录,因为 git hard 模式会这样做。它只会重置索引,但不会重置工作树,然后它会生成未更新文件的报告。

如果在命令行上指定了 -N,则 Git 将这些语句视为 intention-to-add。

Git Reset Head (Git Reset Soft)

soft 选项根本不会触及索引文件或工作树,但它会像所有选项一样重置 Head。当 soft 模式运行时,refs 指针被更新,重置在那里停止。它将充当 git amend 命令。它不是一个权威命令。有时开发人员认为它是在浪费时间。

通常,它用于更改 Head 的位置。让我们了解它将如何更改 Head 的位置。它将使用如下

上面的命令将移动 HEAD 到特定的提交。让我们通过一个例子来理解它。

我更改了我的文件 newfile2.txt 并提交了它。因此,Head 的当前位置已移动到最新的提交。要检查 Head 的状态,请运行以下命令

考虑下面的输出

Git Reset

从上面的输出中,你可以看到 HEAD 的当前位置在提交 f1d4b486f2eeefe575194d51ec3a54926ab05ef7 上。但是,我想将其切换到我的旧提交 2c5a8820091654ac5b8beed774fe6061954cfe92。由于提交-sha 编号是 sha 算法提供的唯一编号。要切换 HEAD,请运行以下命令

上面的命令将把我的 HEAD 移到特定的提交。考虑以下输出

Git Reset

正如你从上面的输出中看到的那样,HEAD 已通过 git reset --soft 模式移动到特定的提交。

Git 重置到提交

有时我们需要重置特定的提交; Git 允许我们这样做。我们可以重置到特定的提交。要重置它,可以使用 git reset 命令,该命令可以使用重置命令支持的任何选项。它将采用特定命令的默认行为并重置给定的提交。重置提交的语法如下所示

这些选项可以是

  • --soft
  • --mixed
  • --Hard

下一主题Git Rm