使用git stash list
向我显示带有ID的藏匿列表。使用git stash list --date=local
或git stash list --date=relative
会给我他们的时间,但我不知道他们的相应ID是什么。
我想在某个时间获得藏匿。
答案 0 :(得分:20)
git stash list
只需使用一组特定选项运行git log
:
list_stash () {
have_stash || return 0
git log --format="%gd: %gs" -g --first-parent -m "$@" $ref_stash --
}
$@
部分会插入您指定的任何其他选项(默认情况下没有,但在这种情况下为--date=relative
)。 1
当您使用--date=relative
时,会修改%gd
的输出:而不是带有索引的简短reflog,您会得到一个带有相对时间的简短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
参数。 -g
的{{1}}参数告诉它只查看reflog,而不是提交历史记录,在这种情况下,git log
没有任何意义。同时--first-parent
告诉-m
拆分合并提交,但是我们正在查看提交日志,而不是差异,那么这里做了什么呢?
答案是git diff
可以显示一个补丁,它运行git log
,所以如果你给git diff
作为参数,{{{ 1}}限制此差异来比较存储reflog指向其第一个父级的提交。 reflog条目指向的stash bag提交是工作树提交,其第一个父提交是存储包挂起的原始提交。 (它的第二个父级是索引提交,它的第三个父级,如果存在,则是全部或未跟踪的文件提交。)因此这些选项可以使[{1}}区分存储的工作树提交以防止当前的提交藏匿本身的时候。
这很聪明,但相当模糊! : - )
答案 1 :(得分:10)
You can actually use the stash@<date>
syntax directly when referring to a stash:
$ 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}'
No need to get the ID of the stash at all! This even works with date=relative
as long as the relative dates are unique.