foo git stash -u # foo is stashed git stash -6ren">
gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:26:57 31 4
gpt4 key购买 nike

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

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

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

谢谢

最佳答案

您只需要查看第三个 stash 提交即可。但是“只是需要”稍微低估了事情,在您不知道这三个 stash 提交是什么之前,这是没有任何意义的。要明白我的意思,请继续阅读。

设置:关于 stash 的知识

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

...--o--o--*   <-- branch (HEAD)
git stash save完成后,您将有两个新提交,它们不在 branch分支上,也不在任何其他分支上:
...--o--o--*   <-- branch (HEAD)
|\
i-w <-- the stash
w提交保存工作树状态,而 i提交保存索引。这两个提交中的每一个都非常类似于其他任何提交,并且实际上, i提交是使用大多数常规 git commit机制进行的:Git使用 git write-tree将当前索引写入内部树对象,然后使用 git commit-tree创建一个提交对象。如果您不知道这些内部对象是什么,则不必对此太担心:重点在于,这也是 git commit通过编写树然后提交对象来完成其大部分工作的方式。 ( git commit的其余部分包括首先收集您的日志消息,然后在最后更新分支名称。)
w提交要稍微复杂一点,因为它具有 merge 提交的形式(但不是意图),只有两个父代而不是一个父代。但基本上,它保存了工作树的快照,就好像您对所有跟踪的文件都运行了 git add一样。

当您添加 --all--include-untracked(简称 -a-u)时, git stash所做的是添加了第三次提交,我们可以这样绘制:
...--o--o--*   <-- branch (HEAD)
|\
i-w <-- the stash
/
u

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

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

Git添加了 push动词(例如 git stash push,否则它基本上是 save的同义词)的一个原因是,当您创建新的存储时,Git使用存储 stash 引用日志来跟踪较早的存储 stash 。当前的存储量以reflog的形式为 stash@{0},而较早的存储物变为 stash@{1}

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

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

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

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

查看 u提交

我们可以使用 git show查看任何提交。对于 stash w提交,这会失败,因为Git认为 w提交是 merge ,因此我们可以改用 git stash show。 (这是一种 merge ,但 git show不能正确显示。)我的 earlier answer to a related question要求在 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

使用类似 stash@{1}的名称标识reflog条目#1中的提交,这是“存储堆栈”中的下一个存储。 (reflog从零开始计数,因此 stashstash@{0}表示相同的提交。)因此,对于 stash@{1},您将需要 stash@{1}^3stash@{1}^^3

关于git - 如何查看 "git stash -u"的未跟踪文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52357450/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com