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

时间:2015-01-26 12:05:30

标签: git branch git-checkout

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

然后我遇到this question,但答案和评论并未详细解释它们之间的差异。

假设我有一个干净的工作树,

之间有什么内部差异
git branch -f <branch_name> <hash>

git checkout <branch_name>
git reset --hard <hash>

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

1 个答案:

答案 0 :(得分:16)

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

如果您希望在不移动HEAD或修改当前工作树的情况下快速重新排列分支,那么git branch -f是一种很好的方法。如果您有未提交的更改,它也会有效,如果您使用git checkout,则无法使用。

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