Подтвердить что ты не робот

Как просмотреть дату или временную привязку рядом с идентификатором stash?

Использование git stash list показывает мне список закладок с их идентификаторами. Использование git stash list --date=local или git stash list --date=relative дает мне свое время, но я понятия не имею, что их соответствующий идентификатор.

Я хочу приобрести тайник в определенное время.

4b9b3361

Ответ 1

git stash list просто запускает git log с определенным набором опций:

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

Часть [email protected] вставляет все дополнительные параметры, которые вы указали (по умолчанию нет, но --date=relative). 1

При использовании --date=relative это изменяет вывод из %gd: вместо короткого рефлога с индексом вы получаете короткий рефлог с относительной отметкой времени:

$ git stash list
[email protected]{0}: ...
$ git stash list --date=relative
[email protected]{4 minutes ago}: ...

Решение в этом случае должно использовать ваш собственный явный формат, а не просто позволить --date=relative изменять способ отображения %gd. Например:

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

(%cr вставляет метку времени коммиттера фиксации в относительном формате - это имеет смысл, как только вы знаете, что все git stash делает для вас несколько коммитов, причем фиксации сохраняются на специальном stash ref вместо ветки).


1 При рассмотрении этого ответа я отмечаю, что аргументы --first-parent и -m (буквально присутствующие в коде git stash) кажутся избыточными сначала из-за аргумента -g, Аргумент -g для git log говорит ему, что он смотрит только на reflog, а не на историю фиксации, и в этом случае --first-parent ничего не значит. Между тем -m сообщает git diff разделить фиксацию слияния, но мы смотрим на журнал фиксации, а не на diff, так что это здесь делает?

Ответ заключается в том, что git log может отображать патч, для которого он запускает git diff, поэтому, если вы даете -p в качестве аргумента, --first-parent -m ограничивает этот diff сопоставлением фиксации, к которой относится stash reflog указывает на его первого родителя. сумка для хранения, для которой точки входа reflog являются фиксацией дерева работы, первым родителем которой является первоначальная фиксация, на которой висит сумка. (Его второй родитель - это фиксация индекса, а его третий родитель, если он есть, - это все или не проверенные файлы.) Таким образом, эти параметры позволяют сделать git stash list -p diff, чтобы дерево рабочих команд было зафиксировано против комманды, которая была текущей, когда сам штамп был сделан.

Это умный, но довольно неясный!: -)

Ответ 2

Фактически вы можете использовать синтаксис [email protected]<date> непосредственно при обращении к кошельку:

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

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

Не нужно вообще вводить идентификатор кошелька! Это даже работает с date=relative, пока относительные даты уникальны.