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

5

看标题就知道了。

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

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

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


在第一种情况下,您将保留当前分支,而在第二种情况下,您将切换到“master”。 - Cristian Lupascu
假设我们已经在主分支上。编辑原帖以澄清。 - user9225276
fatal: Cannot force update the current branch. - Mark Adelsberger
git branch -f master HEAD~ gets me fatal: Cannot force update the current branch. - jingx
2个回答

4
假设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的文档。

备注:如果当前分支是master,则执行git branch -f master HEAD~的效果可能与执行git reset --soft HEAD~相同。但我们永远不会知道,因为这种形式的git branch拒绝更改当前检出的分支。


在评论中,OP问道:"我知道mixed是reset的默认选项,但还有soft和hard,我不知道它们之间的区别。"

场景:

  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命令的不同情况下仓库将会变成什么样子。

1
@user9225276,在git branch中没有soft。你问了它们之间的区别。git reset --soft仅移动分支,不影响索引和工作树。git checkout -f也仅移动分支,不影响索引和工作树。这就是它们相似之处的地方。git reset操作当前分支。git branch -f拒绝在当前分支上工作。而git branch没有soft/hard/mixed。阅读有关git branchgit reset的内容。它们执行不同的操作。 - axiac
这是不正确的。git branch --force <branch> <commit> 等同于 git switch <branch> && git reset --hard <commit>,而不是像在这个答案中建议的那样 git switch <branch> && git reset --soft <commit>,因为 git branch --force <branch> <commit> 通过将工作区和暂存区重置为 <commit> 来影响它们。 - Géry Ogam
@Maggyero 请再仔细阅读一遍答案。git branch --force <branch> <commit> 不会进行任何切换或检出操作。它不会影响当前分支、索引或工作树。它拒绝在当前分支上操作,它所做的只是更改另一个分支指向的提交。没有 --forcegit branch <branch> <commit> 会创建一个新分支(但如果已存在则失败),但不会切换到该分支。这在 git branch文档中有描述。 - axiac
@Maggyero 重新表述了可能误导您的段落。 - axiac
我认为你没有理解我的意思,我的意思是你应该用“--hard”代替“--soft”。 - Géry Ogam
显示剩余5条评论

0
git branch --force <branch> <commit>

等同于

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接