我已经使用 git 一个多月了。确实我昨天才第一次使用reset,但是软复位对我来说仍然没有多大意义。

我知道我可以使用软重置来编辑提交而无需更改索引或工作目录,就像使用 git commit --amend 一样。

这两个命令真的一样吗( reset --soft vs commit --amend )?有什么理由在实际中使用其中之一吗?更重要的是,除了修改提交之外,reset --soft 还有其他用途吗?

最佳答案

git reset 是关于移动 HEAD , and generally the branch ref
问题:工作树和索引怎么样?
当与 --soft 一起使用时, 移动 HEAD ,最常更新分支引用,只有 HEAD 0x2141 0x21413
这与 commit --amend 的不同之处在于:

  • 它不会创建新的提交。
  • 它实际上可以将 HEAD 移动到任何提交(因为 commit --amend 只是关于不移动 HEAD,同时允许重做当前提交)


  • 刚刚发现这个组合的例子:
  • 经典 merge
  • 子树 merge

  • 全部合二为一(八爪鱼,因为 merge 了两个以上的分支)提交 merge 。

    Tomas "wereHamster" Carnecky 在他的 "Subtree Octopus merge" article 中解释:



    (那是子树 merge 部分)


    # Merge projectA with the default strategy:
    git merge projectA/master
    
    # Merge projectB with the subtree strategy:
    git merge -s subtree projectB/master
    

    在这里,作者使用了 reset --hard ,然后是 read-tree 来恢复前两次 merge 对工作树和索引所做的事情,但这就是 0x25181224131419x251812241314149
    如何重做这两个 merge ,它们已经起作用了,即我的工作树和索引很好,但不必记录这两个提交?
    # Move the HEAD, and just the HEAD, two commits back!
    git reset --soft HEAD@{2}
    

    现在,我们可以恢复 Tomas 的解决方案:
    # Pretend that we just did an octopus merge with three heads:
    echo $(git rev-parse projectA/master) > .git/MERGE_HEAD
    echo $(git rev-parse projectB/master) >> .git/MERGE_HEAD
    
    # And finally do the commit:
    git commit
    

    所以,每次:
  • 您对最终得到的结果感到满意(就工作树和索引而言)
  • 你对带你到达那里的所有提交不满意:
  • reset --soft 是答案。

    关于git - git reset --soft 的实际用途?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5203535/

    10-13 09:36