【问题标题】:What exactly is the difference between all the Git Reset modes?所有 Git 重置模式之间到底有什么区别?
【发布时间】:2016-03-12 23:42:03
【问题描述】:

我正在尝试为 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 之间是否还有其他细微差别?

【问题讨论】:

    标签: git git-reset


    【解决方案1】:

    好的,由于我找不到对不同模式的完整并排分析,我将使用希望用户更容易理解的语言制作一个表格。我还包括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:丢弃已暂存、丢弃未暂存、更新工作(不安全)
    • 合并:丢弃暂存,保持未暂存,更新工作(如果不安全则中止)
    • 保持:未暂存、保持未暂存、更新工作(如果不安全则中止)

    【讨论】:

    • 非常好,比我的回答更完整。 +1
    • 很好的答案。我发现每个表格的开头和表格本身有点难以理解,三个问题的总结是答案的最佳部分。我在浏览时几乎错过了它。也许你应该把它作为 tl;dr 放在首位?
    【解决方案2】:

    首先,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 demystified”文章,但不幸的是,它没有解决“合并”和“保留”问题,而这方面的文档记录要少得多。例如,请参阅 stackoverflow.com/questions/25553175/…,它无法真正解释这两种模式的实际用途和用途。
    • @SteveBennett 这两种模式用于模拟结帐模式。我从来没有机会真正使用它们。
    猜你喜欢
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多