所有Git重置模式之间的区别到底是什么?

所有Git重置模式之间的区别到底是什么?,git,git-reset,Git,Git Reset,我试图为Git-SavySublime扩展添加Git重置模式的简明摘要。这很难 我有这个: mixed (default): update index soft: move branch pointer only hard: update index & working dir, discard local changes merge: update index & working dir, keep local changes keep: update index &

我试图为Git-SavySublime扩展添加Git重置模式的简明摘要。这很难

我有这个:

mixed (default): update index 
soft: move branch pointer only
hard: update index & working dir, discard local changes
merge: update index & working dir, keep local changes
keep: update index & working dir, abort if local changes
(希望这意味着分支指针可以在所有模式下移动。)

reset
模式的文档非常模糊,使用了“更新索引”、“接触索引文件”、“重置索引”和“重置索引项”等短语,无法知道它们是否同义

--hard
--merge
--keep
之间还有其他细微的区别吗?

首先,重置头部。
头并不总是一个“分支指针”:它是一个分支指针

其次,
git reset
可以在提交级别或文件级别重置(您可以重置文件)

但在任何情况下,我都会使用“移动头部”这两个词

您可以在以下内容中找到更准确的表格:

另见:

  • “”以了解为什么git重置默认为
    HEAD
    (而
    git checkout--path
    没有)
  • “”

好的,因为我找不到对不同模式的完整并排分析,所以我将使用用户更容易理解的语言制作一个表格。我还包括
git checkout

为清楚起见,“对……的影响”

  • “头部”:手术后头部指向什么
  • “分支指针”:如果我们现在在分支B的顶端,B之后指向什么
  • “空索引”:在没有阶段性更改的情况下执行重置时将看到的情况
  • “跟踪文件”:如果切换到影响工作目录中文件的提交,是否会更改工作目录中的文件
  • “未跟踪文件”:工作目录中未跟踪的文件是否会被更改。(扰流板:否)
清理工作目录:

Effect on        | soft | mixed   | hard    | merge   | keep   |checkout
-----------------+---------------------------------------------|--------
HEAD             | Move | Move    | Move    | Move    | Move   | Move
Branch pointer   | Move | Move    | Move    | Move    | Move   |  -   
Empty index      | Add* |  -      |  -      |  -      |  -     |  -
Tracked files    |  -   |  -      | Change  | Change  | Change |Change
Untracked files  |  -   |  -      |  -      |  -      |  -     |  -
工作目录中的更改(可能是暂存的),这些更改不受我们正在重置/签出的提交的影响。(例如,我们更改file.txt,但在当前提交和我们要去的地方之间没有任何更改)

-
表示“保持当前状态”,
两者都表示对同一文件进行了暂存和未暂存的更改)

工作目录中受我们正在重置/签出的提交影响的更改(可能是暂存的)。有时表示为询问操作是否“工作目录安全”

*关于
--soft
git reset--soft X
将工作目录(包括当前头)和X之间的更改转换为阶段性更改。Git的手册页计数器直观地将此描述为“不接触索引文件”

当有阶段性更改时,
--soft
将它们与新的阶段性更改组合

当有未老化的更改时,
--soft
会保留未老化的更改,但也会如上所述进行新的更改。这是一致的,但可能令人困惑

总结 不同的
git重置
模式由以下问题定义:

  • 分阶段的更改是保留(
    ),未分阶段(
    混合
    保留
    )还是丢弃(
    合并
  • 工作目录是否始终更新(
    ),仅在安全(
    保持
    合并
    )或从不更新(
    混合
  • 是否保留了不相关的未老化更改(
    soft
    mixed
    merge
    keep
    )或丢弃(
    hard
我最后对每一项的简要描述:

  • 混合(默认):未分级、保持未分级、不接触工作(安全)
  • 软:只需移动头部,阶段差异(安全)
  • 硬:放弃暂存、放弃未暂存、更新工作(不安全)
  • 合并:放弃暂存、保持未暂存、更新工作(如果不安全则中止)
  • 保持:取消分级、保持取消分级、更新工作(如果不安全则中止)

是的,我看到了“git reset demystified”一文,但不幸的是,它没有处理“merge”和“keep”这两个文档很少的问题。例如,请看哪一个未能真正解释这两种模式的实际用途以及它们的实际用途。@SteveBennett这两种模式用于模拟签出模式。实际上我从来没有机会使用它们。非常好,比我的答案更完整+回答得很好。我发现每个表格的导言和表格本身都有点难以理解,三个问题的摘要是答案中最好的部分。我略读的时候差点错过了。也许你应该把它作为tl放在第一位;博士
Effect on        | soft | mixed   | hard    | merge   | keep   |checkout
-----------------+---------------------------------------------|--------
HEAD             | Move | Move    | Move    | Move    | Move   | Move
Branch pointer   | Move | Move    | Move    | Move    | Move   |  -   
Empty index      | Add* |  -      |  -      |  -      |  -     |  -
Tracked files    |  -   |  -      | Change  | Change  | Change |Change
Untracked files  |  -   |  -      |  -      |  -      |  -     |  -
Staged changes   |  -   | Unstage | Discard | Discard | Unstage| -
Unstaged changes |  -   |  -      | Discard |     -   |  -     | -
Both             |  - * | Unstage | Discard | Abort   | Unstage| -
  Effect on      | soft | mixed   | hard    | merge   | keep   |checkout
-----------------+---------------------------------------------|--------
Staged changes   |  -   | Unstage | Discard | Discard | Abort  | Abort
Unstaged changes |  - * |    -    | Discard | Abort   | Abort  | Abort
Both             |  - * | Unstage | Discard | Abort   | Abort  | Abort