我正在使用git 1.7.1
。我的场景如下所述: -
我在项目中添加了5个新文件并修改了1个现有文件。我现在决定当前对藏匿的更改并转移到一些不同的分支。所以,我将所有新的5个文件添加到临时区域,然后我存储它。让stash@{0}
成为我的藏匿处。因此,在存储stash@{0}
中,暂存区域中有5个新文件,工作目录中有1个已修改的文件。
现在我做git stash list
。它让我说下面的藏匿列表:
stash@{0}
stash@{1}
stash@{2}
stash@{3}
stash@{4}
stash@{5}
一两天后,我回来想检查可用的藏匿列表,然后想检查哪个藏匿包含什么。因此我尝试了git stash show -p stash@{0}
。这给了我在工作目录中修改的只有1个文件的更改。它没有提供暂存区域中有5个新文件的任何信息。我可以做的一种方法是将存储应用于分支并执行git status
。这将提供所需的输出。
但我在这里看到的是在将存储应用于任何分支之前获取此信息。任何帮助都非常感谢!
答案 0 :(得分:3)
存储包含两个(有时是三个)提交。这些提交不在分支上,而是通过特殊的stash
引用(refs/stash
)及其reflog(stash@{n}
,对于任何整数 n 找到,是一个reflog名称)。这两个(或三个)提交保持索引/暂存区域状态,工作树状态,以及 - 如果存在第三个提交 - 未跟踪文件或额外"全部"文件(来自git stash save -u
或git stash save -a
)。我想将这些引用为"stash bag"的i
,w
和u
提交,因为如果您将这两个(或三个)提交作为一部分提交提交图形绘制,它们看起来像是一个挂在提交上的小包。
git stash show
命令运行git diff
以将w
提交与其父级进行比较。您需要的是比较i
提交(至i
或w
的父级,在下图中标记为*
) 。 git stash show
没有标记可以执行此操作,但您可以使用隐藏包的结构:
stash
或stash@{n}
引用直接指向w
提交。w
提交的第一个父级是保存存储时的HEAD
提交。i
提交是w
提交的第二个父级。 (这意味着w
提交是合并提交;但不要尝试将其用作合并!)i
提交具有单个父级,与{{1}的父级相同第一个父母。w
提交,则它是u
的第三个父提交,它本身就是根提交(没有父提交)。我发现Unicode箭头字符无法在所有查看器上正确显示,因此此图表的箭头绘制得更大:
w
在此图中,提交...<-- o <-- o <-- * <-- o <-- o <-- branch
^
|\
| \
i<-w <-- stash@{3}
是保存此存储时 提交*
的提交(但从那时起,又添加了两个提交HEAD
)。
Git有一些特殊的语法可以从任何特定的提交转到它的父项,如the gitrevisions
documentation中所述,所以你可以得到一个差异比较提交branch
来提交w
:
*
这是git diff stash@{3} stash@{3}^
的作用:git stash show
名称提交stash@{3}
和w
命名其父项,即提交stash@{3}^
。但你想要的是将提交*
与提交i
进行比较:
*
请注意,如果您愿意,也可以通过命名git diff stash@{3}^2 stash@{3}^
(i
&#39}的第二个父亲= {{1}来比较w
和stash@{3}^2
})和w
(i
本身),按此顺序。
(作为一种快捷方式,您可以在stash@{3}
提交上使用w
,因为git show
会对其父项进行提交。请注意,使用i
时git show
不太有用:git show
有两个父项,因此w
生成组合差异,这对于常规合并提交是合理的,但对这些很少有用w
提交,因为它们不是正常的合并提交。)