2014-10-16 3 views
6

Was ich möchte so etwas wie -
git checkout FHEAD~ path/filenameGibt es eine Kurzschrift für die vorherige Version einer Datei in Git?

Was tun ist, ich zur Zeit über die vorherige Version der Datei finden -
git log -1 --skip=1 path/filename

und dann
git checkout <previous-commit-hash> path/filename

+0

Was fragst du hier? Ein Alias ​​zum Auschecken der Version einer Datei, die in einem Elternteil von 'HEAD' aufgezeichnet wurde? Bitte klären Sie. – Jubobs

+0

Was ist 'FHEAD'? – Jubobs

+2

@Jubobs Die Frage scheint mir klar genug zu sein: finde die vorherige Version einer bestimmten Datei, wobei "vorheriges" bedeutet "wie es gerade vor dem letzten Commit war, das diese Datei geändert hat" (und andere Commits ignorierend, die sich nicht ändern) diese Datei). – hvd

Antwort

0

Trivial Beispiel ein Alias, um die vorherige Version einer Datei abzurufen.

Der hier Trick ist, die Protokollausgabe mit --format zu formatieren, die nur zurückgeben Hash begehen

[alias] 
    prev = "!f(){ git checkout $(git log -1 --format="%H" --skip=1 -- ${GIT_PREFIX:-.}/$1) -- ${GIT_PREFIX:-.}/$1; git reset ${GIT_PREFIX:-}/$1; }; f" 

Die Verwendung von git log -1 sorgt dafür, dass git prev immer das unmittelbar übergeordnete Datei zurückgibt. Die Auswahl des nächsten Elternteils kann komplexer sein.

Beachten Sie auch, dass die einmal ausgecheckte Datei sofort zum Index hinzugefügt wird. Es wird nicht in Ihre vorhandene Kopie integriert und warnt nicht vor dem Überschreiben lokaler Änderungen. Ich habe einen Aufruf von git-reset eingefügt, um sicherzustellen, dass sich die auscheckende Datei nur im Arbeitsverzeichnis und nicht im Index befindet.

Die Verwendung von GIT_PREFIX ermöglicht die Eingabe relativer Pfade, obwohl nur relativ neue Versionen von git GIT_PREFIX unterstützen.

bearbeiten ..

Der gleiche Sache mit git rev-Liste .. einen sehr leistungsfähigen Befehl git entworfen für Graphen traversieren git Abstammung, wenn Scripting und Automatisierung ...

[alias] 
    prev = "!f(){ git checkout $(git rev-list --max-count=1 --skip=1 HEAD -- ${GIT_PREFIX:-.}/$1) -- ${GIT_PREFIX:-.}/$1; git reset ${GIT_PREFIX:-}/$1; }; f" 
+1

Oder verwenden Sie 'rev-list' anstelle von' log' für Scripting! – knittl

+0

Sicher, warum nicht. 'git rev-Liste --max-count = 1 --skip = 1 HEAD - $ {GIT_PREFIX: -.}/$ 1' kann das git-Protokoll ersetzen und das gleiche Ergebnis liefern. – Dave

Verwandte Themen