2015-07-28 3 views
13

Using git stash list zeigt mir die Liste der Speicher mit ihren IDs. Mit git stash list --date=local oder git stash list --date=relative gibt mir ihre Zeiten, aber ich habe keine Ahnung, was ihre entsprechende ID ist.Wie stash date/timestamp neben Stash-ID anzeigen?

Ich möchte zu einer bestimmten Zeit ein Versteck erwerben.

+0

Wie https://stackoverflow.com/questions/23263781/git-stashed-date –

Antwort

11

git stash list einfach läuft git log mit einem bestimmten Satz von Optionen:

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

Die [email protected] Teil Einsätze, was zusätzliche Optionen (keine standardmäßig, aber --date=relative in diesem Fall) angegeben haben.

Wenn Sie --date=relative verwenden, um dies ändert die Ausgabe von %gd: anstelle einem kurzen reflog mit einem Index, Sie mit einem relativen Zeitstempel eine kurze reflog erhalten:

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

Der Lösung in diesem Fall ist es, Ihr eigenes explizites Format zu verwenden, anstatt --date=relative nur ändern zu lassen, wie %gd angezeigt wird. Zum Beispiel:

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

(%cr Einsätze des Committer Zeitstempel des begehen, in relativem Format-das macht Sinn, wenn Sie wissen, dass alle git stash tun, ist ein paar Commits für Sie, mit den Commits auf dem speziellen gespeichert werden stash ref statt auf einem Zweig).


Auf diese Antwort bewerten, stelle ich fest, dass die --first-parent und -m Argumente (wörtlich in dem git stash Code) zunächst überflüssig erscheinen, weil das -g Arguments. Das Argument -g zu git log sagt ihm, dass es sich nur auf den Reflog und nicht auf den Commit-Verlauf richten soll. In diesem Fall bedeutet --first-parent nichts. Unterdessen teilt -mgit diff mit, um eine Zusammenführung zu teilen, aber wir betrachten Festschreibeprotokolle, nicht Diffs, also was tut das hier?

Die Antwort ist, dass git logkann einen Patch zeigen, für die es git diff läuft, also wenn Sie -p als Argument geben, die --first-parent -m dieses diff begrenzt auf dem Vergleich der die Stash reflog Punkte gegen seinen ersten Elternteil, mit dem begehen . Das stash bag Commit, auf das der Reflog-Einstiegspunkt verweist, ist der Work-Tree-Commit, dessen erster Eltern der ursprüngliche Commit ist, an dem der Stash-Bag hängt. (Sein zweites Elternteil ist das Index-Commit und sein drittes Elternteil, falls vorhanden, ist das Commit für alle oder nicht vererbte Dateien.) Diese Optionen dienen also dazu, git stash list -p den Work-Tree-Commit des Stash gegen den Commit zu vertauschen, der beim Stash selbst aktuell war wurde gemacht.

Das ist schlau, aber ziemlich obskur!:-)

9

Sie können tatsächlich die [email protected]<date> Syntax direkt verwenden, wenn auf ein Versteck verweisen:

$ 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}' 

Keine Notwendigkeit, bekommen die ID des Stash an allen! Dies funktioniert sogar mit date=relative, solange die relativen Daten eindeutig sind.

Verwandte Themen