git checkout HEAD -- filename 和 git checkout -- filename 的区别

6
让我们从一个场景开始。
1. 我暂存了一些更改(5个文件)git stash 2. 修改某些文件 3. 提交更改git commit -m "提交信息" 4. 从暂存中获取更改git stash apply 由于这次提交,我在2个文件中收到了合并冲突。我不再想要那2个文件中的更改,所以我试图撤销这些更改。
我执行了git checkout -- background.js
但是它失败并显示错误:

error: path 'src/background/background.js' is unmerged

然后我阅读了这篇文章并尝试了其他方法。
git checkout HEAD -- background.js

它成功地工作了。这对我来说两个文件都是一样的。我想要了解 git checkout -- filegit checkout HEAD -- file 之间的区别。

1个回答

4
通常情况下没有太大区别。关键是你需要解决冲突。请参考man手册http://csurs.csr.uky.edu/cgi-bin/man/man2html?1+git-checkout

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

...

由于之前的合并失败,索引可能包含未合并的条目。 默认情况下,如果您尝试从索引中检出这样的条目,则检出操作将失败,并且不会检出任何内容。 使用-f将忽略这些未合并的条目。可以使用--ours或--theirs从索引中检出合并的特定方面。 使用-m,可以放弃对工作树文件所做的更改,以重新创建原始的冲突合并结果。

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

HEAD指的是你在repo中的具体SHA,因此你告诉git从哪里拉取文件的方式与你为不同分支做的一样。


6
简而言之,git checkout -- <pathname> 从暂存区中检出 <pathname> 的内容,而 git checkout HEAD -- <pathname> 则从特定提交中检出它,该提交由引用 HEAD 解析(在90%的情况下,这是当前所检出分支的最新提交)。 - kostix
@kostix,我认为你应该将它添加为答案。简单、直接和有针对性。并请在您的答案中写1-2行关于Git的索引,使其更加完整。我喜欢它。 - Sachin Jain
@blunderboy,不,我对已接受的答案感到满意,因为详细说明为什么第一种形式对你无效也很重要。因此,我只是想添加一个TL;DR风格的页脚;-) 做得好,Schleis。 - kostix
@blunderboy,如果你想要解释索引的概念,请从这里(http://stackoverflow.com/a/22178579/720999)开始,或者阅读任何一本好书。 - kostix
@blunderboy是正确的 - 问题并不在于存在冲突本身,问题在于冲突会阻止检出索引中的版本,因为索引中根本就没有版本。 - Edward Thomson
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接