到目前为止,我一直使用git checkout <branch_name>; git reset --hard <hash>
将分支移回早期的提交。
然后我遇到this question,但答案和评论并未详细解释它们之间的差异。
假设我有一个干净的工作树,
之间有什么内部差异git branch -f <branch_name> <hash>
和
git checkout <branch_name>
git reset --hard <hash>
并且这些差异(如果有的话)对高级用法有任何微妙的影响吗?
答案 0 :(得分:16)
主要区别在于git branch -f <branchname> <commitref>
移动<branchname>
指向指定的提交而不触及 HEAD
,索引或工作副本,而git checkout <branchname> && git reset --hard <commitref>
修改所有三个。
如果您希望在不移动HEAD
或修改当前工作树的情况下快速重新排列分支,那么git branch -f
是一种很好的方法。如果您有未提交的更改,它也会有效,如果您使用git checkout
,则无法使用。
另一个区别与性能有关,但它仅与非常大型项目相关。
在这些情况下,使用git checkout
和git reset --hard
修改工作树可能是一个带有大量磁盘I / O的昂贵的操作。另一方面,使用git branch -f
只会在磁盘上写入单个文件,即包含<commithash>
引用的<branchname>
的文件。