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

What would be the difference between `git branch -f master HEAD~` and `git reset HEAD~`?

真的看到标题了。

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

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

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

假设master是当前分支,git branch -f master HEAD~拒绝做任何事情并报错"fatal: Cannot force update the current branch."

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

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

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

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


OP 在评论中提问:"I am also aware that mixed is a default for reset but there are also soft and hard but I don't know the differences."

场景:

  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 移动分支并更新索引以匹配它;它将 repo 带到步骤 2 之后的状态;
  • git reset --hard HEAD~1 移动分支然后更新索引和工作树以匹配它;它将 repo 带到步骤 1 之后的状态。

当然,这是一个简化的解释,"brings the repo to the state"部分仅适用于这个简化的场景。如果您 git reset 进行了不同的提交,那么只保留关于分支、索引和工作树发生了什么的解释,并弄清楚在 git reset 命令的每种风格之后 repo 会是什么样子。