术语重置代表撤消更改。git reset 命令用于重置更改。git reset 命令具有三种核心调用形式。这些形式如下。
- Soft
- Mixed
- Hard
如果我们用 Git 来说,那么 Git 就是一个将 HEAD 的当前状态重置为指定状态的工具。它是用于撤消更改的复杂且通用的工具。它充当Git的时间机器。您可以在各种提交之间来回跳转。这些重置变化中的每一个都会影响 git 用来处理文件内容的特定树。
此外, git reset 可以对整个提交对象或单个文件级别进行操作。这些重置变化中的每一个都会影响 git 用于处理文件及其内容的特定树。
Git 使用索引(暂存区)、HEAD 和工作目录来创建和恢复提交。
工作目录允许您更改文件,并且您可以暂存到索引中。暂存区使您可以选择要放入下一次提交的内容。提交对象是内容的加密散列版本。它有一些元数据和点,用于切换以前的提交。
让我们了解一下 git reset 命令的不同用途。
Git 硬重置
它将首先移动 Head 并使用提交的内容更新索引。它是最直接、最不安全、最常用的选项。--hard 选项更改提交历史记录,并且 ref 指针更新到指定的提交。然后,需要重置暂存索引和工作目录以匹配指定提交的索引和工作目录。任何先前未决提交到暂存索引和工作目录都会重置以匹配提交树。这意味着任何等待的工作都将丢失。
让我们通过一个例子来理解 --hard 选项。假设我在现有的存储库中添加了一个新文件。要将新文件添加到存储库,请运行以下命令:
$ git add <file name>
要检查存储库的状态,请运行以下命令:
$ git status
要检查 Head 和先前提交的状态,请运行以下命令:
$ git log
考虑下图:
在上面的输出中,我添加了一个名为newfile2.txt的文件。我已经检查了存储库的状态。我们可以看到当前的头部位置还没有改变,因为我没有提交更改。现在,我将执行reset --hard选项。git reset hard 命令将被执行为:
$ git reset --hard
考虑以下输出:
正如您在上面的输出中看到的,-hard 选项是在可用存储库上操作的。此选项将重置更改并匹配上次更改前 Head 的位置。它将从暂存区中删除可用的更改。考虑以下输出:
上面的输出显示了硬重置后存储库的状态。我们可以看到我的存储库中没有任何内容可以提交,因为所有更改都被重置硬选项删除,以匹配当前 Head 的状态与前一个 Head 的状态。因此文件newfile2.txt已从存储库中删除。
在git stash的帮助下,有一种更安全的方法可以重置更改。
通常,重置硬模式执行以下操作:
- 它将移动 HEAD 指针。
- 它将使用 HEAD 指向的内容更新暂存区。
- 它将更新工作目录以匹配暂存区。
Git重置混合
混合选项是 git reset 命令的默认选项。如果我们不传递任何参数,则将 git reset 命令视为--mixed作为默认选项。混合选项更新引用指针。暂存区也重置为指定提交的状态。撤消的更改转移到工作目录。让我们通过一个例子来理解它。
让我们创建一个新文件,比如newfile2.txt。检查存储库的状态。要检查存储库的状态,请运行以下命令:
$ git status
它将显示暂存区中未跟踪的文件。将其添加到索引中。要将文件添加到阶段索引,请按以下方式运行 git add 命令:
$ git add <filename>
上面的命令会将文件添加到暂存索引中。考虑以下输出:
在上面的输出中,我在本地存储库中添加了一个newfile2.txt。现在,我们将在此存储库上执行重置混合命令。它将作为:
$ git reset --mixed
或者我们可以只使用 git reset 命令而不是这个命令。
$ git reset
上述命令将重置Head的状态,并且不会从暂存区删除任何数据以匹配Head的位置。考虑以下输出:
从上面的输出中,我们可以看到我们已经通过执行 git reset -mixed 命令重置了 Head 的位置。此外,我们还检查了存储库的状态。如我们所见,此命令并未更改存储库的状态。所以很明显,混合模式不会从暂存区清除任何数据。
通常,复位混合模式执行以下操作:
- 它将移动 HEAD 指针
- 它将使用 HEAD 指向的内容更新暂存区。
它不会像 git 硬模式那样更新工作目录。它只会重置索引而不是工作树,然后它会生成尚未更新的文件的报告。
如果在命令行中指定了 -N,则这些语句将被 Git 视为意图添加。
Git 重置头(Git Reset Soft)
soft 选项根本不涉及索引文件或工作树,但它会像所有选项一样重置 Head。当软模式运行时,refs 指针会更新,并且重置在那里停止。它将充当 git amend 命令。它不是权威命令。有时开发人员认为这是浪费时间。
一般用于改变Head的位置。让我们了解它将如何改变 Head 的位置。它将用作:
$ git reset--soft <commit-sha>
上面的命令会将 HEAD 移动到特定的提交。让我们通过一个例子来理解它。
我已经在我的文件 newfile2.txt 中进行了更改并提交了它。因此,Head 的当前位置在最新提交时发生了变化。要检查 Head 的状态,请运行以下命令:
$ git log
考虑以下输出:
从上面的输出中,可以看到 HEAD 的当前位置在 f1d4b486f2eeefe575194d51ec3a54926ab05ef7 commit 上。但是,我想在我较早的提交 2c5a8820091654ac5b8beed774fe6061954cfe92 上切换它。由于 commit-sha 编号是由 sha 算法提供的唯一编号。要切换 HEAD,请运行以下命令:
$ git reset --soft 2c5a8820091654
上面的命令会将我的 HEAD 转移到特定的提交。考虑以下输出:
从上面的输出中可以看出,HEAD 已通过 git reset --soft 模式转移到特定的提交。
Git重置以提交
有时我们需要重置一个特定的提交;Git 允许我们这样做。我们可以重置为特定的提交。要重置它,git reset 命令可以与 reset 命令支持的任何选项一起使用。它将采用特定命令的默认行为并重置给定的提交。重置提交的语法如下:
$ git reset <option> <commit-sha>
这些选项可以
- --soft
- --mixed
- --Hard