`git branch -f <branch_name> <hash>`和`git checkout <branch_name>之间的区别; git reset --hard <hash>`在干净的工作树下?

mer*_*011 17 git branch git-checkout

到目前为止,我一直习惯git checkout <branch_name>; git reset --hard <hash>将分支移回早期的提交.

然后我遇到了这个问题,但答案和评论并没有详细解释它们之间的差异.

假设我有一个干净的工作树,它们之间有什么内部差异

git branch -f <branch_name> <hash>
Run Code Online (Sandbox Code Playgroud)

git checkout <branch_name>
git reset --hard <hash>
Run Code Online (Sandbox Code Playgroud)

并且这些差异(如果有的话)对高级用法有任何微妙的影响吗?

Enr*_*lio 18

主要区别在于git branch -f <branchname> <commitref>移动<branchname>指向指定的提交而不触摸 HEAD,索引工作副本,同时git checkout <branchname> && git reset --hard <commitref>修改所有三个.

如果您想在不移动HEAD或修改当前工作树的情况下快速重新排列分支,那么这git branch -f是一个很好的方法.如果您有未提交的更改,它也会起作用,如果您使用,这种情况并非总是可行git checkout.

另一个区别与性能有关,但它仅适用于非常大的项目.
在这些情况下,使用大量磁盘I/O 修改工作树git checkout并且git reset --hard可能是一项昂贵的操作.另一方面,git branch -f只有一个文件将写在磁盘上,即包含<commithash>引用的文件<branchname>.

  • 很好的完整答案。我删除了我的。+1 (3认同)