好的,由于我找不到对不同模式的完整并排分析,我将使用希望用户更容易理解的语言制作一个表格。我还包括git checkout。
为清楚起见,“对...的影响”
- “HEAD”:操作后 HEAD 指向的对象
- “分支指针”:如果我们当前在分支B的尖端,那么B之后指向什么
- “空索引”:在没有阶段性更改的情况下进行重置时会发生什么。
- “Tracked files”:如果切换到影响它们的提交,是否会更改工作目录中的文件
- “Untracked files”:是否会更改工作目录中未跟踪的文件。 (剧透:否)
清理工作目录:
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)的不相关的非暂存更改
我对每一个的最后简洁描述:
- 混合(默认):未暂存、保持未暂存、不接触工作(安全)
- soft:只需移动 HEAD,阶段差异(安全)
- hard:丢弃已暂存、丢弃未暂存、更新工作(不安全)
- 合并:丢弃暂存,保持未暂存,更新工作(如果不安全则中止)
- 保持:未暂存、保持未暂存、更新工作(如果不安全则中止)