如果您希望 ID 包含在您提供的消息中,则可以将 ID 作为消息的一部分提供。也就是说,而不是:
$ git stash save "My own message"
你可能会运行:
$ git stash save "[$(git rev-parse --short HEAD)] My own message"
(您可以将其转换为别名 - shell 别名或调用 shell 的 git 别名)。
如果你想利用实际存储在树中的父ID,你必须深入研究实现git stash
. See 这个答案 https://stackoverflow.com/a/20589663/1256452对于很多细节,但简而言之,工作树提交的第一个父级w
(refs/stash
,或 reflog 条目,指向此w
commit) 是之前的提交HEAD
当时藏匿的。
The git stash list
子命令只是将附加参数直接传递给git log
, so --oneline --parents
做它所做的事git log
-除了那个git stash list
是这样的吗:
git log --format="%gd: %gs" -g --first-parent -m "$@" $ref_stash --
(where "$@"
是你的附加参数)。很遗憾,--parents
使用历史简化和父重写(参见的文档git rev-list https://www.kernel.org/pub/software/scm/git/docs/git-rev-list.html),其中与-g
,变成“用reflog walk的结果替换亲子关系”,这完全破坏了原始的亲子关系信息。
(顺便说一句,我能看到明确的唯一原因--first-parent
这是为了使--parents
隐藏索引和可选的额外提交。自从--parents
无论如何都会被 reflog walk 击垮,这似乎毫无意义。不确定 git 人员是否希望 reflog walks 不会破坏父信息,如果它没有破坏,您就会看到您想要的内容。所以这可能是一个 git bug,尽管这里有很多猜测。)
你可以(某种程度上)通过返回到原始提交 ID(w
提交)并使用git rev-parse
找到每个的第一个父母w
commit:
git log -g --format="%gd %H" refs/stash |
while read name hash; do
printf "%s %s " $name $(git rev-parse --short $name^)
git log -1 --format=%s $hash
done
(可能有一些方法可以缩短这个时间,尽管上面的内容非常简单)。