假设我使用以下方法之一隐藏了一些更改:
git stash -u
git stash --include-untracked
我可以通过
从藏匿处查看单个文件git checkout stash@{0} -- filename
如果git知道“filename”,那就有效,但如果“filename”未跟踪则不起作用。有没有办法从藏匿处检查未跟踪的文件?
答案 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>