Git重置



在Git中,命令git reset可以用来将当前HEAD重置到指定状态。

这有效地将工作目录和索引重置为与之前的提交匹配,或者将当前分支指针切换到指定的提交。

它做了什么?

1. 与反转git add类似,此过程有效地撤销了已安排提交的更改。

2. 重置后,我们可以使用git restore从索引更新工作树,或者使用git restore --source=<tree-ish>同时将提交内容复制到索引和工作树。

语法

git reset [-q] [<tree-ish>] [--] <pathspec>…
git reset [-q] [--pathspec-from-file=<file> [--pathspec-file-nul]] [<tree-ish>]

git reset [<tree-ish>] [--] <pathspec>…​ 命令将指定路径 (<pathspec>) 的索引条目重置为与<tree-ish>处的状态匹配,而不影响工作树或当前分支。

git reset (--patch | -p) [<tree-ish>] [--] [<pathspec>…​]

git reset --patch-p命令允许在索引和<tree-ish>(默认为HEAD)之间交互式选择块。

  • 通过反转和将某些块应用于索引,实际上撤消了已暂存提交的某些修改。

  • 此功能允许选择性地修改或删除暂存区中的更改,类似于git add --patch

git reset [<mode>] [<commit>]

命令git reset [<mode>] [<commit>] 根据<mode>修改索引和工作树,并将当前分支头重置为<commit>。

  • 如果未指定<mode>,则默认值为--mixed

    • --soft - 将修改保留为待提交的更改,并将分支头移动到<commit>,而不改变工作树或索引。

    • --mixed - 将更改标记为未暂存,并将索引重置为<commit>,同时保留工作树中的修改。

    • --hard - 删除<commit>之后的所有修改,并将工作树和索引重置为<commit>。

    • --merge - Git处理未合并的索引项,重置索引,并更新<commit>和HEAD之间不同的工作树文件。

    • --keep - 与--merge类似,但如果对<commit>和HEAD之间不同的文件进行了本地修改,则会停止。

    • --[no-]recurse-submodules - 更新工作树时,它会更新子模块的工作树以匹配超级项目中记录的提交。

  • 借助这些参数,Git在将仓库状态重置到特定提交时,可以更灵活地处理对索引、工作树和子模块的修改。

选项

git reset命令可以使用以下选项

-q 或 --quiet

  • 使用-q--quiet选项时,Git会抑制所有输出,只显示错误消息。



--refresh / --no-refresh

  • Git的--refresh选项确保在混合重置(git reset --mixed)之后更新索引。

  • 为了确保索引反映重置操作后的修改,默认情况下启用此功能。

  • 另一方面,混合重置后,--no-refresh会阻止此自动索引刷新。

git reset --refresh 

--pathspec-from-file=<file>

  • Git提供了一个名为--pathspec-from-file=<file>的选项,允许我们从文件中指定pathspec模式,而不是直接从命令行指定。

  • 如果<file>为-,则从标准输入读取。

  • Pathspec元素可以根据core.quotePath配置变量的指示进行引用,并在文件中由LFCR/LF分隔。

  • 对于有效管理冗长或复杂的pathspec模式,此选项很有用。



--pathspec-file-nul

  • Git的--pathspec-file-nul选项改变了--pathspec-from-file的行为。

  • 它指定将使用NUL字符来分隔文件中的pathspec项;所有其他字符,包括换行符和引号,都将按字面解释。

  • 当pathspec模式包含必须完全保留在文件中的特殊或复杂字符时,此选项很有用。
git reset --pathspec-from-file=file-list.txt --pathspec-file-nul
  • --pathspec-from-file=file-list.txt − 告诉Git从file-list.txt读取文件路径。

  • --pathspec-file-nul − 指定file-list.txt中的文件路径由空字符(\0)而不是默认的换行符(\n)分隔。

--

  • 带有--的Git命令指示任何后续参数都应作为文件名或路径而不是选项处理。

git rest -- <file>

它通常被称为分隔符选项。它不是git reset独有的,而是一个通用的Git约定,它告诉Git将--之后的任何内容解释为文件路径。

--soft

  • 它将HEAD移动到指定的提交,但保持暂存区和工作目录不变。

  • 更改仍然已暂存(索引不变)。

  • 工作目录中没有显示更改。

git reset --soft HEAD~1

--mixed

  • 它将HEAD移动到指定的提交,并取消暂存任何已暂存的更改。

  • 这是默认选项。

  • 工作目录保持不变。

  • 暂存区重置为指定提交的状态。

git reset --mixed HEAD~1

--hard

  • 它将HEAD移动到指定的提交,并将暂存区和工作目录都重置为与指定的提交匹配。

  • 所有未提交的更改都将丢失。

git reset --hard <commit>

谨慎使用git reset,尤其是在使用--hard选项时,因为它可能导致更改丢失。

--keep <commit>

  • 它将索引重置为指定的提交,但保留可以干净地应用于工作目录的本地更改。

  • 如果与本地更改冲突,重置将停止。

git reset --keep <commit>

--merge <commit>

  • 它重置索引,但保留工作目录中当前HEAD和指定提交之间不同的更改。

  • 如果合并失败,则使用此选项,将其重置回干净状态。

git reset --merge HEAD~1

因此,根据您使用的选项,git reset命令可以应用于工作目录、暂存区(索引)或提交历史记录。

广告