`git branch -f master HEAD~`和`git reset HEAD~`之间有什么区别?

时间:2018-01-16 16:10:34

标签: git version-control git-branch git-checkout

真的看标题。

假设我们已经在主分支上:

git branch -f master HEAD~git reset HEAD~之间有什么区别?

据我所知,这两个命令都将分支/ HEAD指针移动到提交链中,但是这两个指针之间是否存在其他值得注意的差异?

1 个答案:

答案 0 :(得分:1)

假设master是当前分支,git branch -f master HEAD~拒绝执行任何操作并报告错误“致命:无法强制更新当前分支。”

如果您在不同的分支上,git branch -f master HEAD~会在当前分支的第一个父分支上移动分支master,并且不会影响当前分支,索引或工作树。

git reset HEAD~git reset --mixed HEAD~相同。它将当前分支移动到其第一个父级,更新索引以匹配分支的新位置,并且不会影响工作树。

如果当git branch -f master HEAD~是当前分支时master有效,则其效果与git reset --soft HEAD~相同。

如您所见,这两个命令之间存在许多差异。

OP在评论中提到:“我也知道混合是重置的默认值,但也有软和硬但我不知道差异。”

情景:

  1. git checkout master
  2. 修改file1
  3. git add file1
  4. git commit
  5. 完成此步骤后:

    • git reset --soft HEAD~1仅移动最后一次提交之前的master分支;它使回购回到了第3步之后的状态;
    • git reset --mixed HEAD~1移动分支并更新索引以匹配它;它将回购带到了第2步之后的状态;
    • git reset --hard HEAD~1移动分支然后更新索引和工作树以匹配它;它将回购带到了第1步之后的状态。

    当然,这是一个简化的解释,“将回购带到状态”部分仅适用于此简化方案。如果你git reset进行不同的提交,那么只保留关于分支,索引和工作树会发生什么的解释,并弄清楚在git reset命令的每种风格之后repo的样子。