【问题标题】:Difference between git checkout HEAD -- filename and git checkout -- filenamegit checkout HEAD -- 文件名和 git checkout -- 文件名之间的区别
【发布时间】:2014-05-03 16:32:58
【问题描述】:

让我们从一个情况开始。

  1. 我存储了一些更改(5 个文件)git stash
  2. 更改一些文件
  3. 提交更改git commit -m "Commit message"
  4. 从藏匿处取回更改git stash apply

由于提交,我在 2 个文件中收到合并冲突。我不再想要这 2 个文件中的更改所以我尝试恢复这些更改。

我做了git checkout -- background.js

因为错误而失败

错误:路径 'src/background/background.js' 未合并

但后来我读了this SO post 并尝试了

git checkout HEAD -- background.js

它运行成功。这两个文件都发生在我身上。我想了解两者之间的区别

git checkout -- filegit checkout HEAD -- file

【问题讨论】:

    标签: git git-checkout git-stash merge-conflict-resolution


    【解决方案1】:

    通常没有太大区别。关键是你有冲突要解决。来自手册页http://csurs.csr.uky.edu/cgi-bin/man/man2html?1+git-checkout

    git checkout [--patch] [] [--] ...

    ...

    由于先前的合并失败,索引可能包含未合并的条目。 默认情况下,如果您尝试从 索引,结帐操作将失败,什么都不会 检查过了。使用 -f 将忽略这些未合并的条目。内容 从合并的特定方面可以通过以下方式从索引中签出 使用 --ours 或 --theirs。使用 -m,对工作树进行更改 可以丢弃文件以重新创建原始冲突合并 结果。

    当它失败时,您以这种方式使用checkout。因此,按照设计,结帐将由于未合并的更改(不解决冲突)而失败。添加 HEAD 告诉 git 使用哪个“分支”,因此实际上会签出文件。

    HEAD 指的是您在您的存储库中所处的特定 SHA。所以你告诉 git 从哪里提取文件,就像你在不同的分支中一样。

    【讨论】:

    • +1 非常感谢您的详细解释。我真的很感激。
    • @blunderboy,简而言之:git checkout -- <pathname> 从索引中签出称为<pathname> 的内容,git checkout HEAD -- <pathname> 从特定提交中签出ref HEAD 解析(在 90% 的情况下,它是您当前签出分支的提示提交)。
    • @kostix 我认为您应该将其添加为答案。简单,直截了当。并且请在你的答案中写下 1-2 行关于 git 的索引,以使其更完整。我喜欢它。
    • @blunderboy,不,我对接受的答案很好,因为扩展 why 第一种形式对您不起作用也很重要。因此我只想添加一个 TL;DR 风格的页脚 ;-) 干得好,Schleis。
    • @kostix 我不会更改已接受的答案 ;-) 我只是想让 TL;DR 的故事对更广泛的观众(未来的读者)更加可见..无论如何都很好 :) 非常感谢有用的评论
    猜你喜欢
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 2011-07-04
    • 2020-12-02
    • 2011-10-18
    • 2015-02-28
    • 2017-12-10
    相关资源
    最近更新 更多