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


80

我需要还原部署的本地更改。(我曾svn revert在过时的SVN时代使用过此功能。)

git reset --hard HEAD为此使用。(此外git fetchgit merge origin/$branch --no-ff用于与上游分支同步处理资料。)

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

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


Answers:


63

他们两个有完全相同的效果。我建议您选择更舒适的解决方案。

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


资源:

在同一主题上:


13

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

我在树枝上,一切都很干净。我检出master git checkout master,发现git status对未暂存的现有文件进行了更改(是的,在我刚刚检出的代码上)。我尝试隐藏以恢复到干净状态,该隐藏声称已完成但git status仍未更改。也试过了git reset --hard HEAD。它也报告成功完成,但状态没有改变。我无法放弃这些怪异的变化。

但是,git checkout -f解决了这个问题。我能够摆脱这种奇怪的状态。因此,至少在某些方面,两者并不相同。


我只是有完全相同的情况。有一堆修改过的文件,用git reset --hard HEAD不会消失,但是git checkout -f可以,所以它们在某种程度上显然是不一样的。
Mike Wasson 2014年

1
在我们的例子中,这是由于文件权限更改所致;这个固定stackoverflow.com/questions/1257592/...
迈克·沃森

2
如果您的git行末尾设置有些混乱,并且试图在结帐时进行转换,那么您也可能会遇到此问题。
西蒙·伊斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.