'git分支-f master HEAD~'和'git reset HEAD~`有什么区别?

wecizke3  于 2022-11-27  发布在  Git
关注(0)|答案(2)|浏览(205)

看标题真的。
假设我们已经在master分支上:
git branch -f master HEAD~git reset HEAD~之间有什么区别?
就我所知,这两个命令都将分支/HEAD指针在提交链中向上移动一个,但是这两个命令之间还有其他值得注意的区别吗?

c9qzyr3d

c9qzyr3d1#

假设master是当前分支,git branch -f master HEAD~拒绝执行任何操作并报告错误 “fatal:无法强制更新当前分支。"
如果您在不同的分支上,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得这种形式拒绝更改当前 checkout 得分支.

楼主在评论中问道:* “我也知道混合是重置的默认设置,但也有软重置和硬重置,但我不知道它们的区别。"*
场景:

  1. git checkout master
    1.修改file1
  2. git add file1
  3. git commit
    经过此步骤:
  • git reset --soft HEAD~1仅将master分支移动到其在最后提交之前所在的位置;它将REPO带回到它在步骤3之后的状态;
  • git reset --mixed HEAD~1移动分支并更新索引以匹配它;它将REPO带到步骤2之后的状态;
  • git reset --hard HEAD~1移动分支,然后更新索引和工作树以匹配它;它将REPO带到步骤1之后的状态。

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

kxe2p93d

kxe2p93d2#

git branch --force <branch> <commit>

相当于

git switch <branch> && git reset --hard <commit> && git switch -

相关问题