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

use*_*276 5 git version-control git-checkout git-branch

看标题确实。

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

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

据我所知,这两个命令都将分支/HEAD 指针在提交链中向上移动,但是这两个命令之间还有其他值得注意的区别吗?

axi*_*iac 4

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

如果位于不同的分支上,git branch -f master HEAD~则将该分支移动master到当前分支的第一个父级上,并且不会影响当前分支、索引或工作树。

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

正如您所看到的,这两个命令之间存在许多差异。

请阅读 的文档git branch

备注: 如果在 是 当前分支git branch -f master HEAD~时起作用master,其效果可能与 相同git reset --soft HEAD~。我们永远不会知道,因为这种形式git branch拒绝更改当前签出的分支。


OP 在评论中问道:“我也知道混合是重置的默认设置,但也有软和硬,但我不知道其中的区别。”

设想:

  1. git checkout master
  2. 调整file1
  3. git add file1
  4. git commit

执行此步骤后:

  • git reset --soft HEAD~1仅移动master上次提交之前的分支;它将存储库恢复到步骤 3 之后的状态;
  • git reset --mixed HEAD~1移动分支并更新索引以匹配它;它将存储库恢复到步骤 2 之后的状态;
  • git reset --hard HEAD~1移动分支,然后更新索引和工作树以匹配它;它将存储库恢复到步骤 1 之后的状态。

当然,这是一个简化的解释,“将回购协议带到国家”部分仅适用于这种简化的场景。如果您git reset进行不同的提交,则仅保留有关分支、索引和工作树发生的情况的解释,并弄清楚在命令的每种风格之后存储库将是什么样子git reset