将内容存储在git中非常有用。 存放取消跟踪的文件并像这样进行存放时
echo test > foo
git stash -u # foo is stashed
git stash show -p stash@{0}
未跟踪的文件不会显示。 我们怎么看到他们?
谢谢
答案 0 :(得分:7)
您只需要查看第三个隐藏提交即可。但是“只需要”稍微低估了事情,直到您知道三个隐藏提交是之前,这才有意义。要明白我的意思,请继续阅读。
当您运行git stash save
或git 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 提交。
Git添加push
动词的原因 1 ,如git stash push
(原本是save
的同义词)那样,是因为作为一个新存储,Git使用存储 reflog 跟踪以前的存储。当前的存储量是stash@{0}
,而较旧的存储量变为stash@{1}
。
这些名称中的每一个只是Git给您提供的更一般的东西的一个特例:您可以引用任何解析为正确的哈希ID的名称的任何提交。任何提交的“真实名称”是其较大的丑陋哈希ID。 The gitrevisions documentation完整说明了将哈希ID拼写到Git的所有方法;使用branch
或stash
之类的名称就是这种方法之一。
使用名称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>