git-checkout ältere Revision einer Datei unter einem neuen Namen

264

Ich habe die Datei " main.cpp" in meinem Editor geöffnet.

Ich möchte die vorherige Version von " main.cpp" auch im Editor sehen.

Die Art, wie ich es jetzt mache, ist so.

close "main.cpp" in the editor

prompt> mv main.cpp tmp
prompt> git checkout HEAD^ main.cpp
prompt> mv main.cpp old_main.cpp
prompt> mv tmp main.cpp
prompt>

open "main.cpp" and "old_main.cpp" in the editor

Kann es vereinfacht werden, damit ich "main.cpp" nicht im Editor schließen muss?

Was ich mir erhoffe, ist eine Variante git-checkout, die dies kann.


UPDATE: Ich benutze Git unter Mac OS 10.5.7

prompt> git --version
git version 1.6.0.4
prompt> 

UPDATE2: Jakub Narębski antwortet:

prompt> git show HEAD^:dir1/dir2/dir3/main.cpp > old_main.cpp
prompt>

UPDATE3: Karmis Antwort für eine bestimmte Revision:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 
neoneye
quelle
Welchen Editor verwenden Sie? Vielleicht hat es Plugin / Addon / Modul, das Unterstützung für Git hinzufügt?
Jakub Narębski
Ich benutze Textmate. Es hat etwas Git-Unterstützung, ich habe jedoch nicht überprüft, ob es das kann.
Neoneye
Textmate hat ein Git-Bundle: github.com/timcharper/git-tmbundle (Sie sollten die Seite InterfacesFrontendsAndTools im Git-Wiki überprüft haben: git.or.cz/gitwiki )
Jakub Narębski
Übrigens hat die VC-Schnittstelle in Emacs (für die Git auch Unterstützung in Form von vc-git.el unterstützt) den Befehl 'Andere Version anzeigen'. Wenn TexMate Git Bundle (git-tmbundle) es nicht hat, wäre es vielleicht wert, es hinzuzufügen.
Jakub Narębski
Ich verwende Symlinks, um mein Projekt in TextMate besser verfolgen zu können. 25 Verzeichnisse, 300 Dateien. Dies hilft, Builddirs und andere irrelevante Verzeichnisse zu verstecken. Allerdings ist git / TextMate nicht sehr glücklich über diese Symlinks, also nein :-(
neoneye

Antworten:

311

Sie können dafür "git show" verwenden:

prompt> git show HEAD^:main.cpp > old_main.cpp

(Beachten Sie, dass :zwischen HEAD^und ein Doppelpunkt [ ] steht main.cpp.) Die <revision>:<path>Syntax wird in der git rev-parse- Manpage vor dem letzten Punkt im Abschnitt "Festlegen von Revisionen" beschrieben:

  • <rev>: <path>, z. B. HEAD: README ,: README, master: ./ README

    Ein Suffix :gefolgt von einem Pfad benennt den Blob oder Baum am angegebenen Pfad im baumartigen Objekt, das von dem Teil vor dem Doppelpunkt benannt wird. :path(mit einem leeren Teil vor dem Doppelpunkt) ist ein Sonderfall der nachfolgend beschriebenen Syntax: Inhalt, der im Index unter dem angegebenen Pfad aufgezeichnet wird.

    Ein Pfad, der mit ./oder ../relativ zum aktuellen Arbeitsverzeichnis beginnt . Der angegebene Pfad wird so konvertiert, dass er relativ zum Stammverzeichnis des Arbeitsbaums ist. Dies ist am nützlichsten, um einen Blob oder Baum aus einem Commit oder Baum zu adressieren, der dieselbe Baumstruktur wie der Arbeitsbaum hat.

Beachten Sie, dass <path>hier der vollständige Pfad relativ zum obersten Verzeichnis Ihres Projekts angegeben ist, dh zum Verzeichnis mit dem .git/Verzeichnis. (Oder genauer gesagt " <revision> " (was im Allgemeinen ein beliebiger <tree-ish> sein kann , dh etwas, das einen Baum darstellt))

Wenn Sie den Pfad relativ zum aktuellen Verzeichnis verwenden möchten, müssen Sie die ./<path>Syntax verwenden (oder ../pathvom aktuellen Verzeichnis aufsteigen).

Bearbeiten 2015-01-15: Informationen zur relativen Pfadsyntax hinzugefügt


In den meisten Fällen können Sie dieselbe Ausgabe mit dem git cat-fileBefehl " Low-Level" (Sanitär) erzielen:

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp
Jakub Narębski
quelle
3
Ich bin an einer vollständigen Kopie interessiert, aber git-show zeigt mir nur die Unterschiede. Ich habe versucht, mit der Option --pretty herumzuspielen. Eingabeaufforderung> git show --pretty = voller HEAD ^ main.cpp, aber es hat nicht geklappt löse es nicht.
Neoneye
7
"git show HEAD ^ main.cpp" (mit Leerzeichen zwischen HEAD ^ und main.cpp) unterscheidet sich von "git show HEAD ^: main.cpp" (mit Doppelpunkt ':' zwischen HEAD ^ und main.cpp).
Jakub Narębski
Hmm, mit Doppelpunkt sehe ich diesen Fehler, also dachte ich, dass der Doppelpunkt ein Fehler war. Ja, es scheint, als wäre Doppelpunkt der richtige Weg, aber wie löse ich das? prompt> git show HEAD ^: main.cpp fatal: mehrdeutiges Argument 'HEAD ^: main.cpp': unbekannte Revision oder Pfad nicht im Arbeitsbaum. Verwenden Sie '-', um Pfade von der Eingabeaufforderung für Revisionen zu trennen>
neoneye
2
Das bedeutet wahrscheinlich, dass Sie einen falschen PATHNAME angegeben haben (leider kann "git show" magic git keine bessere Fehlermeldung geben). Es sollte VOLLSTÄNDIGER Pfadname relativ zum obersten Verzeichnis Ihres Projekts sein: $ (git ls-tree -r - only-only HEAD ^ | grep main.cpp)
Jakub Narębski
3
Anstelle des vollständigen Pfads aus den Dokumenten: "Ein Pfad, der mit ./ oder ../ beginnt, ist relativ zum aktuellen Arbeitsverzeichnis." Funktioniert auf meiner 1.8.5 Version.
LVB
24

Nur um Jakubs Antwort zu ergänzen: Sie müssen die Ausgabe nicht einmal in eine Datei mit umleiten >, wenn Sie nur den Dateiinhalt im Terminal überfliegen möchten. Du kannst einfach rennen $ git show 58a3db6:path/to/your/file.txt.

Karmi
quelle