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

Lesezeit: 6 Minuten

git checkout altere Revision einer Datei unter einem neuen Namen
Neonauge

Ich habe die Datei “main.cpp” In meinem Editor öffnen.

Ich möchte die vorherige Überarbeitung von “main.cpp„Auch im Editor.

So mache ich es jetzt.

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” im Editor nicht schließen muss?

Was ich erhoffe, ist eine Variante von git-checkout das kann das.


UPDATE: Ich verwende Git auf Mac OSX 10.5.7

prompt> git --version
git version 1.6.0.4
prompt> 

UPDATE2: Die Antwort von Jakub Narębski lautet:

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

UPDATE3: Karmis Antwort für eine bestimmte Überarbeitung:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 

  • Welchen Editor verwendest du? Vielleicht hat es ein Plugin / Addon / Modul, das Unterstützung für Git hinzufügt?

    – Jakub Narębski

    20. Mai 2009 um 15:25 Uhr

  • Ich benutze Textmate. Es hat etwas Git-Unterstützung, ich habe jedoch nicht überprüft, ob es das kann.

    – Neonauge

    20. Mai 2009 um 15:40 Uhr

  • 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

    20. Mai 2009 um 16:13 Uhr

  • Übrigens hat die VC-Schnittstelle in Emacs (für die Git auch Unterstützung in Form von vc-git.el hat) 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

    20. Mai 2009 um 23:46 Uhr

  • Ich verwende Symlinks, um mein Projekt in TextMate besser verfolgen zu können. 25 Verzeichnisse, 300 Dateien. Dies hilft, Build-Verzeichnisse und andere irrelevante Verzeichnisse zu verbergen. Allerdings ist git/TextMate nicht allzu glücklich über diese Symlinks, also nein 🙁

    – Neonauge

    21. Mai 2009 um 0:30 Uhr

1646170089 347 git checkout altere Revision einer Datei unter einem neuen Namen
Jakub Narębski

Sie können verwenden git show dafür:

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

(Beachten Sie, dass es einen Doppelpunkt gibt [:] Charakter dazwischen HEAD^ und main.cpp.) Die <revision>:<path> Syntax ist beschrieben in git rev-parse Manpage, vorletzter Punkt im Abschnitt “Specifying revisions”:

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

Ein Suffix : gefolgt von einem Pfad benennt den Blob oder Baum am angegebenen Pfad in dem baumähnlichen Objekt, das durch den Teil vor dem Doppelpunkt benannt wird. :path (mit einem leeren Teil vor dem Doppelpunkt) ist ein Sonderfall der als nächstes beschriebenen Syntax: Inhalt, der im Index unter dem angegebenen Pfad aufgezeichnet wird. Ein Weg, der mit beginnt ./ oder ../ ist relativ zum aktuellen Arbeitsverzeichnis. 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 die gleiche Baumstruktur wie der Arbeitsbaum hat.

Beachten Sie, dass <path> hier ist VOLL Pfad relativ zum oberstes Verzeichnis Ihres Projektes, also das Verzeichnis mit .git/ Verzeichnis. (Oder genauer gesagt zu “<Überarbeitung>“, was im Allgemeinen beliebig sein kann dh etwas, das Baum darstellt.)

Wenn Sie den Pfad relativ zum aktuellen Verzeichnis verwenden möchten, müssen Sie verwenden ./<path> Syntax (bzw ../path um vom aktuellen Verzeichnis nach oben zu gehen).

Bearbeiten 15.01.2015: Informationen zur relativen Pfadsyntax hinzugefügt


Sie können in den meisten Fällen die gleiche Ausgabe mit Low-Level (Sanitär) erzielen. git cat-file Befehl:

git cat-file blob HEAD^:main.cpp > old_main.cpp

  • Ich bin an einer vollständigen Kopie interessiert, aber git-show zeigt mir nur die Unterschiede. Ich habe versucht, mit der Option –pretty herumzuspielen.. prompt> git show –pretty=fuller HEAD^ main.cpp, aber das tat es nicht lösen.

    – Neonauge

    20. Mai 2009 um 15:37 Uhr

  • „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

    20. Mai 2009 um 16:01 Uhr

  • 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 Revisionen zu trennen prompt>

    – Neonauge

    20. Mai 2009 um 16:13 Uhr

  • Das bedeutet wahrscheinlich, dass Sie einen falschen PATHNAME angegeben haben (leider kann magischer Git wegen “git show” keine bessere Fehlermeldung geben). Es sollte ein VOLLSTÄNDIGER Pfadname relativ zum obersten Verzeichnis Ihres Projekts sein: $(git ls-tree -r –name-only HEAD^ | grep main.cpp)

    – Jakub Narębski

    20. Mai 2009 um 16:19 Uhr

  • Anstelle des vollständigen Pfads aus den Dokumenten: “Ein Pfad, der mit ./ oder ../ beginnt, ist relativ zum aktuellen Arbeitsverzeichnis.” Funktioniert auf meiner Version 1.8.5.

    – LVB

    14. Januar 2015 um 18:59 Uhr

git checkout altere Revision einer Datei unter einem neuen Namen
karmi

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

1646170091 986 git checkout altere Revision einer Datei unter einem neuen Namen
kxr

Singulärer Anwendungsfall

Um ein konsistentes Checkout-Verhalten zu erhalten, einschließlich autocrlf usw., verwenden Sie einen sekundären Ordner (TEMP als Beispiel) und stellen Sie den Dateistatus von einem älteren / anderen wie folgt wieder her:

git --work-tree TEMP/ restore -s <commit> main.cpp
mv TEMP/main.cpp old_main.cpp

Notiz:

git show <commit>:main.cpp > old_main.cpp

.. erzeugt nur einen rohen Lesevorgang aus dem Repository.

Verwenden Sie einen zweiten Arbeitsbaum – anonym oder verknüpft

Für mehr Komfort beim Arbeiten mit alternativen Dateizuständen (ohne die Notwendigkeit einer Umbenennung) verwenden Sie ein sekundäres “anonymes” Verzeichnis als (langfristigen) parallelen Arbeitsbaum wie folgt:

# one time setup
mkdir WD2
cd WD2
echo gitdir: WD1 > .git

# operate freely here with an alternative file set while the same branch is checked out in git
git restore -s <commit> main.cpp

(WD2: Pfad zum sekundären Verzeichnis. WD1: Pfad zum primären Verzeichnis – absolut oder relativ)

Hinweis: Jede Art von Git-Projektarbeit (Wiederherstellen / Hinzufügen / Festschreiben / Wechseln …, Build-Aufgaben) kann mit diesem alternativen Dateisatz durchgeführt werden – als ob plötzlich die Arbeitsbaumdateien in WD1 ausgetauscht worden wären. Hardlinks könnten verwendet werden, um unveränderte Dateien in riesigen Repos effizient zu spiegeln.

Ebenso kann ein “verknüpfter Arbeitsbaum” über verwendet werden git-worktree (neu seit git v2.6.7). Dies verursacht etwas mehr Git-Overhead, ermöglicht aber das gleichzeitige Auschecken und Arbeiten an einem anderen Zweig (oder getrennten Kopf), ohne ein zusätzliches Repo zu verwenden.

  • Für mich ist dies der beste Ansatz, da ich immer noch den nativen Weg verwende, um Dateiinhalte abzurufen. Mit einer Reihe von Lösungen durch “git show” mache ich mir immer noch Sorgen um die Codierung und andere Dinge. Mit diesem kann ich die gesuchte Datei bei der Revision speichern. Danke!

    – Kyryl

    19. April 2021 um 13:58 Uhr

  • Hinweis: Im ersten Ansatz (“Singulärer Anwendungsfall”) sollte der Ordner “TEMP” vorhanden sein.

    – Kyryl

    19. April 2021 um 13:59 Uhr

905050cookie-checkgit-checkout ältere Revision einer Datei unter einem neuen Namen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy