我正在尝试为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
之间是否存在其他细微差别?
答案 0 :(得分:5)
好的,既然我找不到对不同模式的完整的并排分析,我会使用希望用户更容易理解的语言来制作表格。我还包括git checkout
。
为清楚起见,“对...的影响”
清理工作目录:
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
),未分期付款(mixed
,keep
)或已弃用(merge
,hard
)hard
),仅在安全(keep
,merge
)或永不(soft
,mixed
)soft
,mixed
,merge
,keep
)或已弃用(hard
)我对每个人的最后简洁描述:
答案 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
另见:
git reset
vs git reset HEAD
”了解为什么git重置默认为HEAD
(而git checkout -- path
没有)。git reset
” and “git checkout
”?”