程序员社区

Git系列教程 --- 30、Git Reset详解

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

  • Soft
  • Mixed
  • Hard

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

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

file

Git 使用索引(暂存区)、HEAD 和工作目录来创建和恢复提交。

工作目录允许您更改文件,并且您可以暂存到索引中。暂存区使您可以选择要放入下一次提交的内容。提交对象是内容的加密散列版本。它有一些元数据和点,用于切换以前的提交。

让我们了解一下 git reset 命令的不同用途。

Git 硬重置

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

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

$ git add <file name>  

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

$ git status  

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

$ git log  

考虑下图:

file

在上面的输出中,我添加了一个名为newfile2.txt的文件。我已经检查了存储库的状态。我们可以看到当前的头部位置还没有改变,因为我没有提交更改。现在,我将执行reset --hard选项。git reset hard 命令将被执行为:

$ git reset --hard  

考虑以下输出:

file

正如您在上面的输出中看到的,-hard 选项是在可用存储库上操作的。此选项将重置更改并匹配上次更改前 Head 的位置。它将从暂存区中删除可用的更改。考虑以下输出:

file

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

在git stash的帮助下,有一种更安全的方法可以重置更改。

通常,重置硬模式执行以下操作:

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

Git重置混合

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

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

$ git status  

它将显示暂存区中未跟踪的文件。将其添加到索引中。要将文件添加到阶段索引,请按以下方式运行 git add 命令:

$ git add <filename>  

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

file

在上面的输出中,我在本地存储库中添加了一个newfile2.txt。现在,我们将在此存储库上执行重置混合命令。它将作为:

$ git reset --mixed  

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

$ git reset  

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

file

从上面的输出中,我们可以看到我们已经通过执行 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  

考虑以下输出:

file

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

$ git reset --soft  2c5a8820091654  

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

file

从上面的输出中可以看出,HEAD 已通过 git reset --soft 模式转移到特定的提交。

Git重置以提交

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

$ git reset <option> <commit-sha>  

这些选项可以

  • --soft
  • --mixed
  • --Hard
赞(0) 打赏
未经允许不得转载:IDEA激活码 » Git系列教程 --- 30、Git Reset详解

一个分享Java & Python知识的社区