`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."
场景:
git checkout master
- 修改
file1
git add file1
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 会是什么样子。
真的看到标题了。
假设我们已经在 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."
场景:
git checkout master
- 修改
file1
git add file1
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 会是什么样子。