所有Git重置模式之间究竟有什么区别?

时间:2015-12-08 06:24:04

标签: git git-reset

我正在尝试为Git-Savvy Sublime扩展添加简洁的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之间是否存在其他细微差别?

2 个答案:

答案 0 :(得分:5)

好的,既然我找不到对不同模式的完整的并排分析,我会使用希望用户更容易理解的语言来制作表格。我还包括git checkout

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

  • “HEAD”:操作后HEAD指向的内容
  • “分支指针”:如果我们当前在分支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,但在当前提交和我们要去的地方之间没有任何变化)

-表示“保持当前状态”,Both表示对同一文件进行暂存和非暂停更改)

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

*关于--soft

的说明

git reset --soft X将工作目录(包括当前HEAD)和X之间的更改转换为分阶段更改。 Git的手册页反直觉地将其描述为“未触及索引文件”。

当有阶段性更改时,--soft会将这些更改与新的分阶段更改相结合。

如果出现非暂停更改,--soft会保留未暂停的更改,但也会按上述步骤进行新的更改。这是一贯的,但可能令人困惑。

摘要

这些问题定义了不同的git reset模式:

  • 是保留的分阶段变更(soft),未分期付款(mixedkeep)或已弃用(mergehard
  • 是始终更新的工作目录(hard),仅在安全(keepmerge)或永不(softmixed
  • 是保留的不相关的非暂停更改(softmixedmergekeep)或已弃用(hard

我对每个人的最后简洁描述:

  • mixed(默认):unstage staged,keep unstaging,not touch working(safe)
  • soft:只需移动HEAD,阶段差异(安全)
  • hard:discard staged,discard unstaged,update working(unsafe)
  • merge:discard staged,keep unstaged,update working(如果不安全则中止)
  • keep:unstage staged,keep unstaged,update working(如果不安全则中止)

答案 1 :(得分:1)

首先,git reset重置HEAD 并且HEAD并不总是“分支指针”:它是current commit

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

但无论如何,我会用两个词“移动HEAD”。

您会在git reset Demystified中找到更准确的表格:

                        head    index   work dir    wd safe
Commit Level     
reset --soft [commit]   REF     NO      NO          YES
reset [commit]          REF     YES     NO          YES
reset --hard [commit]   REF     YES     YES         NO
checkout [commit]       HEAD    YES     YES         YES

File Level   
reset (commit) [file]   NO      YES     NO          YES
checkout (commit) [file]NO      YES     YES         NO

另见: