如何从同一分支上的未来提交中签出单个文件?

时间:2018-02-16 19:25:11

标签: git

我最近遇到过几次提交时开始发生的失败的测试用例,所以为了调查我在他们第一次开始失败时检查了提交。这是下面显示的'master of master'提交(gitg;分支称为editable_phone_type):

enter image description here

所以现在我的HEAD处于该提交状态:

enter image description here

不同的文件中有一个我想查看的迁移:

(venv) Kurts-MacBook-Pro:lucy-web kurtpeek$ git diff --name-only HEAD editable_phone_type
lucy-web/dashboard/templates/families/index.html
lucy-web/dashboard/tests/test_families.py
lucy-web/lucy_web/migrations/0103_merge_20180216_1050.py
lucy-web/lucy_web/test_factories/family_factory.py

但是,如果我尝试git checkout editable_phone_type -- <the migration file>,我会收到pathspec错误:

(venv) Kurts-MacBook-Pro:lucy-web kurtpeek$ git checkout editable_phone_type -- lucy-web/lucy_web/migrations/0103_merge_20180216_1050.py
error: pathspec 'lucy-web/lucy_web/migrations/0103_merge_20180216_1050.py' did not match any file(s) known to git.

从同一分支上的未来提交中检出文件的正确方法是什么?

更新

使用git diff --name-status代替--name-only表示迁移文件的状态为A(已添加):

(venv) Kurts-MacBook-Pro:lucy-web kurtpeek$ git diff --name-status HEAD editable_phone_type
M       lucy-web/dashboard/templates/families/index.html
M       lucy-web/dashboard/tests/test_families.py
A       lucy-web/lucy_web/migrations/0103_merge_20180216_1050.py
M       lucy-web/lucy_web/test_factories/family_factory.py

这是否意味着无法检查出来?

更新2

我刚注意到git diff --name-status(或--name-only)提供的路径包含我所在的目录lucy-web。我无意中复制了粘贴整个路径。如果我改为从子目录lucy_web开始复制粘贴它可以工作:

(venv) Kurts-MacBook-Pro:lucy-web kurtpeek$ git checkout editable_phone_type -- lucy_web/migrations/0103_merge_20180216_1050.py
(venv) Kurts-MacBook-Pro:lucy-web kurtpeek$ 

2 个答案:

答案 0 :(得分:2)

content/

这是检查提交内容,提交提交和路径的正确方法。我很确定你的路径名中有一个拼写错误,案例差异或连字符混合或其他东西。该路径确实不存在。

尝试使用content/或其他内容来查看内容。

......啊。给git checkout editable_phone_type -- \ lucy-web/lucy_web/migrations/0103_merge_20180216_1050.py 而不是git ls-tree -r editable_phone_type | grep -i merge.2018,我认为它不是一个类型,因为文件只是简单删除。

答案 1 :(得分:2)

您指定的结帐语法是正确的,无论是将来的提交,过去的提交还是来自完全独立的分支的提交都无关紧要。只要你提供“&lt; tree-ish&gt;” (一个告诉git要查看哪个内容树的标识符)和一个标识“&lt; tree-ish&gt;”中文件的路径,它应该没问题。

所以最可能的事情是,{{1>}分支顶端的提交树中存在 dosen't 的路径。虽然在这种情况下错误消息可能会产生误导(因为很难看出当前提交中的文件如何“git”不知道“),但是在这种情况下你会得到错误

您的diff输出似乎表明这是一个存在于HEAD提交或分支提交中的文件,或两者都存在(但具有不同的内容)。所以最可能的情况是它出现在editable_phone_type但不出现在分支上。您可以通过更改diff命令来确认,如

HEAD

如果git在命名文件的行的开头打印git diff --name-status HEAD editable_phone_type ,则确认它在D提交中不存在。

在这种情况下,当然,您只需从工作树中删除该文件即可“查看editable_phone_type版本”。