git checkout HEAD-文件名和git checkout-文件名之间的区别

sac*_*024 5 git git-stash git-checkout merge-conflict-resolution

让我们从一种情况开始。

  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”未合并

但是后来我读了这篇SO帖子并尝试

git checkout HEAD -- background.js
Run Code Online (Sandbox Code Playgroud)

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

git checkout -- filegit checkout HEAD -- file

Sch*_*eis 4

通常情况下没有太大区别。关键是你们有冲突需要解决。从手册页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 从哪里提取文件,就像你在不同的分支上一样。

  • @blunderboy,简而言之: `git checkout -- <pathname>` 从索引中检查出名为 `<pathname>` 的内容,* 而 `git checkout HEAD -- <pathname>` 从特定提交中检查出它ref `HEAD` 解析为该引用(在 90% 的情况下,它是当前签出分支的提示提交)。 (6认同)