如何在藏匿处显示文件(暂存区域)?

时间:2016-07-05 12:49:53

标签: git

我正在使用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。这将提供所需的输出。

但我在这里看到的是在将存储应用于任何分支之前获取此信息。任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:3)

存储包含两个(有时是三个)提交。这些提交不在分支上,而是通过特殊的stash引用(refs/stash)及其reflog(stash@{n},对于任何整数 n 找到,是一个reflog名称)。这两个(或三个)提交保持索引/暂存区域状态,工作树状态,以及 - 如果存在第三个提交 - 未跟踪文件或额外"全部"文件(来自git stash save -ugit stash save -a)。我想将这些引用为"stash bag"iwu提交,因为如果您将这两个(或三个)提交作为一部分提交提交图形绘制,它们看起来像是一个挂在提交上的小包。

git stash show命令运行git diff以将w提交与其父级进行比较。您需要的是比较i提交(至iw的父级,在下图中标记为*) 。 git stash show没有标记可以执行此操作,但您可以使用隐藏包的结构:

  • stashstash@{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}来比较wstash@{3}^2 })和wi本身),按此顺序。

(作为一种快捷方式,您可以在stash@{3}提交上使用w,因为git show会对其父项进行提交。请注意,使用igit show不太有用:git show有两个父项,因此w生成组合差异,这对于常规合并提交是合理的,但对这些很少有用w提交,因为它们不是正常的合并提交。)