如何查看 stash id 旁边的 stash date/timestamp?

How to view stash date/timestamp next to stash id?

使用 git stash list 显示带有 ID 的藏品列表。使用 git stash list --date=localgit stash list --date=relative 给了我他们的时间,但我不知道他们对应的 ID 是什么。

我想在某个时间获得一个藏品。

git stash list 只需使用一组特定的选项运行 git log

list_stash () {
        have_stash || return 0
        git log --format="%gd: %gs" -g --first-parent -m "$@" $ref_stash --
}

$@ 部分插入您指定的任何附加选项(默认情况下为 none,但在本例中为 --date=relative)。1

当您使用 --date=relative 时,这会修改 %gd 的输出:您会得到一个带有 index 的短 reflog,而不是带有相对时间戳:

$ git stash list
stash@{0}: ...
$ git stash list --date=relative
stash@{4 minutes ago}: ...

这种情况下的解决方案是使用您自己的显式格式,而不是让 --date=relative 修改 %gd 的显示方式。例如:

$ git stash list --format='%gd (%cr): %gs'
stash@{0} (4 minutes ago): ...

(%cr 以相对格式插入提交的提交者时间戳——一旦您知道所有 git stash 所做的只是为您进行几次提交,并存储提交,这就有意义了在特殊 stash ref 而不是在分支上)。


1在查看此答案时,我注意到 --first-parent-m 参数(字面上存在于 git stash 代码中)似乎起初是多余的,因为 -g 参数。 git log-g 参数告诉它只查看 reflog,而不是提交历史,在这种情况下,--first-parent 没有任何意义。同时 -m 告诉 git diff 拆分合并提交,但我们查看的是提交日志,而不是差异,那么它在这里做什么?

答案是 git log 可以 显示一个补丁,它运行 git diff,所以如果你给 -p 作为一个参数,--first-parent -m 将此差异限制为将存储引用日志指向的提交与其第一个父级进行比较。 reflog 入口指向的 stash bag 提交是工作树提交,其 first 父级是存储袋挂起的原始提交。 (它的第二个父项是索引提交,它的第三个父项(如果存在)是所有或未跟踪的文件提交。)所以这些选项是为了使 git stash list -p 将存储的工作树提交与当前的提交区分开来当隐藏本身被制作时。

这很聪明,但很晦涩! :-)

你实际上可以在引用存储时直接使用 stash@<date> 语法:

$ git stash list --date=local
stash@{Sun Dec 21 22:32:14 2014}: WIP on develop: 7142a6e Update data files
stash@{Fri Dec 12 10:02:20 2014}: WIP on develop: c72abda Add initial calibration data
stash@{Wed Dec 10 10:02:05 2014}: WIP on master: 1d27422 Bug fix for gadgeteer
$ git show 'stash@{Fri Dec 12 10:02:20 2014}'
commit a096484501caf14942f01a6500a5d0c3476d3145
Merge: c72abda 861fff6
Author: Robert Xiao <brx@cs.cmu.edu>
Date:   Fri Dec 12 13:02:20 2014 -0500

    WIP on develop: c72abda Add initial calibration data
...
$ git stash pop 'stash@{Fri Dec 12 10:02:20 2014}'

根本不需要获取藏匿处的ID!只要相对日期是唯一的,这甚至适用于 date=relative