【问题标题】:What is difference between "git checkout -f" and "git reset --hard HEAD"?“git checkout -f”和“git reset --hard HEAD”有什么区别?
【发布时间】:2011-09-06 07:26:21
【问题描述】:

我需要为部署还原本地更改。 (在旧 skool SVN 时代,我曾使用 svn revert。)

我为此使用git reset --hard HEAD。 (还有git fetchgit merge origin/$branch --no-ff 用于与上游分支同步。)

但有些文章指出git checkout -f 用于恢复更改。

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

【问题讨论】:

标签: git


【解决方案1】:

两者的效果完全一样。我建议您选择您更满意的解决方案。

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


资源:

关于同一主题:

【讨论】:

    【解决方案2】:

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

    我在一个分支,一切都很干净。我检查了主 git checkout master 并从 git status 发现现有文件的更改未暂存以进行提交(是的,在我刚刚检查的代码上)。我尝试 stash 回到一个干净的状态,stash 声称已经完成,但 git status 仍然没有改变。也试过git reset --hard HEAD。它也报告成功完成,但状态没有什么不同。我无法中止这些奇怪的变化。

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

    【讨论】:

    • 我也遇到了完全相同的情况。有一堆修改过的文件 git reset --hard HEAD 不会消失,但 git checkout -f 会消失,所以它们在某种程度上显然不一样。
    • 在我们的例子中,这是由于文件权限的变化;这修复了它stackoverflow.com/questions/1257592/…
    • 如果您的 git 行尾设置有点混乱,并且它试图在结帐时转换这些设置,您也可能会遇到这个问题。
    猜你喜欢
    • 2017-12-10
    • 2020-04-07
    • 2011-07-04
    • 2014-08-25
    • 1970-01-01
    • 2018-06-25
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多