看标题就知道了。
假设我们已经在主分支上:
git branch -f master HEAD~
和 git reset HEAD~
有什么区别呢?
据我所知,这两个命令都将分支/HEAD指针向上移动一个提交,但还有其他值得注意的区别吗?
看标题就知道了。
假设我们已经在主分支上:
git branch -f master HEAD~
和 git reset HEAD~
有什么区别呢?
据我所知,这两个命令都将分支/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
的文档。
备注:如果当前分支是master
,则执行git branch -f master HEAD~
的效果可能与执行git reset --soft HEAD~
相同。但我们永远不会知道,因为这种形式的git branch
拒绝更改当前检出的分支。
在评论中,OP问道:"我知道mixed是reset的默认选项,但还有soft和hard,我不知道它们之间的区别。"
场景:
git checkout master
file1
git add file1
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
命令的不同情况下仓库将会变成什么样子。git branch
中没有soft
。你问了它们之间的区别。git reset --soft
仅移动分支,不影响索引和工作树。git checkout -f
也仅移动分支,不影响索引和工作树。这就是它们相似之处的地方。git reset
操作当前分支。git branch -f
拒绝在当前分支上工作。而git branch
没有soft/hard/mixed
。阅读有关git branch
和git reset
的内容。它们执行不同的操作。 - axiacgit 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 Ogamgit branch --force <branch> <commit>
不会进行任何切换或检出操作。它不会影响当前分支、索引或工作树。它拒绝在当前分支上操作,它所做的只是更改另一个分支指向的提交。没有 --force
,git branch <branch> <commit>
会创建一个新分支(但如果已存在则失败),但不会切换到该分支。这在 git branch
的文档中有描述。 - axiacgit branch --force <branch> <commit>
等同于
git switch <branch> && git reset --hard <commit> && git switch -
fatal: Cannot force update the current branch.
- Mark Adelsbergergit branch -f master HEAD~
gets mefatal: Cannot force update the current branch.
- jingx