如何在git存储中签出未跟踪的文件?

时间:2014-05-12 12:04:14

标签: git

假设我使用以下方法之一隐藏了一些更改:

git stash -u
git stash --include-untracked

我可以通过

从藏匿处查看单个文件
git checkout stash@{0} -- filename

如果git知道“filename”,那就有效,但如果“filename”未跟踪则不起作用。有没有办法从藏匿处检查未跟踪的文件?

3 个答案:

答案 0 :(得分:17)

git stash在内部创建特殊的黑魔法合并提交,以存储更改的不同部分。合并提交具有原始基本提交(当您存储时在分支顶部具有的内容)作为其第一个父级,一次性提交,表示存储时作为其第二个父级的索引内容,并且(仅当您使用{时) {1}})一次性提交,包含未跟踪文件作为其第三个父级。

因此,合并提交引用未跟踪的文件(作为其父项之一)......但它实际上并没有将这些文件包含在自己的树中(如果这没有任何意义,要么你还有一些关于Git内部的东西要学习......或者你对合并提交了解得太多了,这整个构造看起来似乎太可怕了;))。

简而言之......要访问藏匿的未跟踪部分,请访问其第三个父级:--include-untracked

答案 1 :(得分:1)

  

我有一个我试验过的划痕分支,但一般都没有承诺。我想将一些选择更改转移到我的真实主题分支。

在这种情况下,不要打扰存储更改以将它们从一个分支移动到另一个分支。直接执行git commit,并使用git cherry-pick git cherry-pick #hash_of_the_commit将更改从您提交的分支移至另一个分支:

答案 2 :(得分:0)

对我来说,扬·克鲁格(JanKrüger)的答案以某种方式无法解决(git 2.19.1)。我的解决方法是从存储中检出单个文件:

查找带有未跟踪文件的隐藏提交部分的提交ID(提交消息的前缀为“未跟踪文件”)

git log --name-status stash@{0}

然后,在此提交中对文件执行常规的git checkout

git checkout <commit id> -- <your file pathspec>