如何查看“ git stash -u”的未跟踪文件

时间:2018-09-16 19:00:28

标签: git git-stash

将内容存储在git中非常有用。 存放取消跟踪的文件并像这样进行存放时

echo test > foo
git stash -u # foo is stashed
git stash show -p stash@{0}

未跟踪的文件不会显示。 我们怎么看到他们?

谢谢

1 个答案:

答案 0 :(得分:7)

您只需要查看第三个隐藏提交即可。但是“只需要”稍微低估了事情,直到您知道三个隐藏提交之前,这才有意义。要明白我的意思,请继续阅读。

设置:关于隐藏的知识

当您运行git stash savegit stash push时,Git的正常操作是创建两个提交,这两个提交都不在任何分支上。如果您像这样绘制“之前”的图片,则将具有以下一系列提交:

...--o--o--*   <-- branch (HEAD)

git stash save完成之后,您有两个 new 提交,它们不在分支branch上,也不在任何其他分支上:

...--o--o--*   <-- branch (HEAD)
           |\
           i-w   <-- the stash

w提交保存工作树状态,而i提交保存索引。这两个提交中的每一个都非常类似于其他任何提交,并且实际上,i提交是使用大多数常规git commit机制进行的:Git将当前索引写入内部的 tree 对象使用git write-tree,然后使用git commit-tree创建 commit 对象。如果您不知道这些内部对象是什么,则不必对此太担心:重点是git commit也是通过编写树然后提交对象来完成其大部分工作的方式。 (git commit的其余部分包括首先收集您的日志消息,最后更新分支名称。)

w提交要稍微复杂一点,因为它具有 merge 提交的 form (但不是意图),由两个父母代替一个。但基本上,它会保存工作树的快照,就像您对所有跟踪的文件运行git add一样。

当您添加--all--include-untracked(简称为-a-u)时,git stash所做的是添加了 third < / em> commit,我们可以这样绘制:

...--o--o--*   <-- branch (HEAD)
           |\
           i-w   <-- the stash
            /
           u

第三次提交是快照,但这是一个非常奇怪的快照。它只包含未跟踪文件 -未跟踪但未被忽略的文件(git stash save -u),或未跟踪文件包括未被跟踪和忽略的文件文件(git stash save -a)。它还没有 parent 提交。

隐藏“堆栈”,提交哈希ID和父对象

Git添加push动词的原因 1 ,如git stash push(原本是save的同义词)那样,是因为作为一个新存储,Git使用存储 reflog 跟踪以前的存储。当前的存储量是stash@{0},而较旧的存储量变为stash@{1}

这些名称中的每一个只是Git给您提供的更一般的东西的一个特例:您可以引用任何解析为正确的哈希ID的名称的任何提交。任何提交的“真实名称”是其较大的丑陋哈希ID。 The gitrevisions documentation完整说明了将哈希ID拼写到Git的所有方法;使用branchstash之类的名称就是这种方法之一。

使用名称stash专门定位提交w。然后,Git使用w本身来查找提交i,如果存在,则提交u。 Git之所以可以这样做是因为每个提交都包含其 parent 提交的哈希ID。使w具有合并提交的形式的原因在于,它至少有两个父级:i(索引提交)和*(您在运行时坐在的提交{首先是{1}}或git stash save

我们可以通过添加尖号git stash push和一个数字以专门查看编号的父级来修改大多数修订说明符(例如stash)。编写^是命名提交stash^1的一种方式。编写*是命名提交stash^2的一种方式。如果提交i存在,则写u即可命名。请注意,在某些系统(Windows)上,stash^3可能是一个特殊字符,需要加倍或加引号,因此您可能需要^来代替stash^3


1 另一个原因是增加了使用pathspecs进行部分隐藏的功能:stash^^3接受了任何额外的参数作为要包含在隐藏提交中的消息,因此他们需要一个新的使用git stash save指定消息的动词,为pathspec参数留有空间。


查看-m提交

我们可以使用u查看任何提交。对于隐藏git show提交,这会失败,因为Git认为w提交是合并的,因此我们可以改用w。 (这是 合并,只是git stash show不能正确显示。)我的earlier answer to a related question要求在git show提交时使用git diff,因为在这种情况下,我们不想获取u显示的标题,但是如果我们只想查看未跟踪的文件提交,则可以在此处使用git show

git show

例如。以下是上述git show stash^3 示例的输出:

foo

使用类似$ git show stash^3 commit 4c9bd2486706980f5a492d19c49270381db2d796 Author: Chris Torek <chris.torek gmail.com> Date: Sun Sep 16 12:35:03 2018 -0700 untracked files on master: f72737e initial diff --git a/foo b/foo new file mode 100644 index 0000000..257cc56 --- /dev/null +++ b/foo @@ -0,0 +1 @@ +foo 的名称标识reflog条目#1中的提交,这是“存储堆栈”中的下一个存储。 (引用日志从零开始计数,因此stash@{1}stash表示相同的提交。)因此,对于stash@{0},您将需要stash@{1}stash@{1}^3。 / p>