“git checkout -f”和“git reset --hard HEAD”有什么区别?

时间:2011-06-01 13:24:37

标签: git

我需要恢复部署的本地更改。 (我在旧的skool SVN时代使用了svn revert。)

我正在使用git reset --hard HEAD。 (同样git fetchgit merge origin/$branch --no-ff用于与上游分支同步。)

但有些文章指出git checkout -f还原了更改。

这些命令之间的主要区别是什么。推荐哪种方式?

2 个答案:

答案 0 :(得分:50)

其中两个具有完全相同的效果。我建议你选择更舒适的解决方案。

但是如果在这种特殊情况下效果相同,则使用不同的值会完全不同。基本上(还有更多,请参阅链接主题)通过重置将当前分支和HEAD移动到特定提交但是通过结帐,您只需移动HEAD。有关详细信息,请参阅下文。


<强>资源:

关于同一主题:

答案 1 :(得分:11)

还没有代表对其他答案发表评论,我只是想补充一点,我遇到了两个命令没有相同效果的情况。我进入了一个奇怪的状态,所以这绝对是一个优势。发生了什么:

我在一个分支,一切都很干净。我检查了主git checkout master并从git status发现现有文件的更改没有为提交暂存(是的,我刚检出的代码)。我试图藏匿回到一个干净的状态,藏匿声称已经完成,但git status仍未改变。还尝试了git reset --hard HEAD。它也报告说成功完成但状态并没有什么不同。我不能放弃这些奇怪的变化。

然而,git checkout -f解决了这个问题。我能够远离这个奇怪的状态。所以,至少在某些方面,两者并不相同。