Ich habe ein Git-Repository und möchte sehen, wie einige Dateien vor einigen Monaten ausgesehen haben. Ich fand die Überarbeitung zu diesem Zeitpunkt; es ist 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
. Ich muss sehen, wie eine Datei aussieht, und sie auch als ("neue") Datei speichern.
Ich habe es geschafft, die Datei mit zu sehen gitk
, aber es gibt keine Option zum Speichern. Ich habe es mit Befehlszeilentools versucht. Das nächste, was ich bekam, war:
git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt
Dieser Befehl zeigt jedoch einen Unterschied und nicht den Dateiinhalt. Ich weiß, dass ich später so etwas wie eine PAGER=cat
Ausgabe verwenden und in eine Datei umleiten kann, aber ich weiß nicht, wie ich zum eigentlichen Dateiinhalt komme.
Grundsätzlich suche ich so etwas wie svn cat .
git
single-file
Milan Babuškov
quelle
quelle
git show
(nicht hilfreich) verwendet eine andere Syntax mit einem Doppelpunkt.git show 2c7cf:my_file.txt
>
Antworten:
Um Ihre eigene Antwort zu vervollständigen, lautet die Syntax in der Tat
Der Befehl verwendet den üblichen Revisionsstil, dh Sie können eine der folgenden Optionen verwenden:
HEAD
+ x Anzahl der^
ZeichenTipp Beachten Sie, dass Sie bei Verwendung von "
git show
" immer einen Pfad aus dem Stammverzeichnis des Repositorys angeben müssen , nicht Ihre aktuelle Verzeichnisposition.(Obwohl Mike Morearty erwähnt, dass Sie zumindest mit git 1.7.5.4 einen relativen Pfad angeben können, indem Sie "
./
" am Anfang des Pfads einfügen - zum Beispiel:)
Mit Git 2.23+ (August 2019) können Sie auch den verwirrenden Befehl
git restore
ersetzengit checkout
Das würde im Arbeitsbaum nur die Datei wiederherstellen, die in der "source" (
-s
) - Festschreibung von SHA1 oder Zweig vorhanden istsomebranch
.So stellen Sie auch den Index wieder her:
(
-SW
: kurz für--staged --worktree
)Vor git1.5.x wurde dies mit einigen Sanitärinstallationen durchgeführt:
git ls-tree <rev>
Zeigen Sie eine Liste eines oder mehrerer "Blob" -Objekte innerhalb eines Commits an
git cat-file blob <file-SHA1>
cat eine Datei, wie sie innerhalb einer bestimmten Revision festgeschrieben wurde (ähnlich wie bei svn cat). Verwenden Sie git ls-tree, um den Wert einer bestimmten Datei-sha1 abzurufen
git-ls-tree listet die Objekt-ID für $ file in Revision $ REV auf. Diese wird aus der Ausgabe herausgeschnitten und als Argument für git-cat-file verwendet, die eigentlich als git-cat-object bezeichnet werden sollte, und wird einfach ausgegeben das Objekt zu stdout.
Hinweis: Seit Git 2.11 (Q4 2016) können Sie einen Inhaltsfilter auf die
git cat-file
Ausgabe anwenden !Siehe Commit 3214594 , Commit 7bcf341 ( 09.09.2016 ), Commit 7bcf341 ( 09.09.2016 ) und Commit b9e62f6 , Commit 16dcc29 (24. August 2016) von Johannes Schindelin (
dscho
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 7889ed2 , 21. September 2016)Hinweis: "
git cat-file --textconv
" hat vor kurzem (2017) mit dem Segfaulting begonnen, was in Git 2.15 (Q4 2017) korrigiert wurde.Siehe Commit cc0ea7c (21. September 2017) von Jeff King (
peff
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit bfbc2fc , 28. September 2017)Beachten Sie, dass Sie zum Überschreiben / Ersetzen einer Datei durch einen früheren Inhalt den verwirrenden
git checkout
Befehl nicht mehr verwenden sollten, sonderngit restore
(Git 2.23+, August 2019).Das würde im Arbeitsbaum nur die Datei wiederherstellen, die im "source" (
-s
) Commit SHA1 vorhanden ist.So stellen Sie auch den Index wieder her:
(
-SW
: kurz für--staged --worktree
)quelle
git show
der Inhalt im Wesentlichen auf derstdout
(Standardausgabe) ausgegeben wird, können Sie diese Ausgabe einfach in eine beliebige Datei umleiten ( tldp.org/LDP/abs/html/io-redirection.html ).git checkout [branch | revision] filepath
ist der richtige Befehlgit checkout
würde aber Ihre Datei durch eine andere Version überschreiben , im Gegensatz zugit show
, wodurch Sie sie unter einem anderen Namen speichern können, damit Sie beide (die aktuelle Version und die alte Version) erhalten und sehen können . Aus der Frage geht nicht hervor, ob das OP seine aktuelle Version durch eine alte ersetzen möchte .^^^
dies auch allgemeiner als~~~
oder besser geschrieben werden kann~3
. Die Verwendung von Tildes hat auch den Vorteil, dass der Dateinamenabgleich einiger Shells (z. B. zsh) nicht ausgelöst wird.git rev-parse
dierev:path
Syntax? (In einem neueren Git können Siegit cat-file -p $REV:path
. Funktioniert jedoch auchgit show
für Verzeichnispfade, so dass es nicht nur kürzer ist, sondern normalerweise näher an dem, was man will.)Wenn Sie den Inhalt einer Datei in Ihrem aktuellen Zweig durch den Inhalt der Datei aus einem vorherigen Commit oder einem anderen Zweig ersetzen / überschreiben möchten , können Sie dies mit den folgenden Befehlen tun:
oder
Sie müssen diese Änderungen dann festschreiben, damit sie in der aktuellen Branche wirksam werden.
quelle
git show SHA1:PATH
Lösung nur in stdout gedruckt wird.git help checkout
. Ich musste ab einem bestimmten Datum ein Unterverzeichnisgit checkout @{YYYY-MM-DD} sub-dir
Sie müssen den vollständigen Pfad zur Datei angeben:
quelle
git show --name-only
sind auch genugfull/repo/path/to
und es versuchen :git show 27cf8e84:my_file.txt
, werden Sie mit einer Nachricht belohnt wie: fatal: Pfad 'full / repo / path / to / my_file.txt' existiert, aber nicht 'my_file.txt' . Meinten Sie '27cf8e84: full / repo / path / to / my_file.txt' aka '27cf8e84: ./ my_file.txt'? Es ist so, als hätte Git direkt helfen können, aber er hat sich entschieden, hier pedantisch zu sein.Der einfachste Weg ist zu schreiben:
wo:
Beispiel
Dadurch wird my_file.txt aus Revision 27cf8e als neue Datei mit dem Namen my_file.txt.OLD gespeichert
Es wurde mit Git 2.4.5 getestet.
Wenn Sie gelöschte Dateien abrufen möchten, können Sie diese verwenden
HASH~1
(ein Commit vor dem angegebenen HASH).BEISPIEL:
quelle
git log file/path/name.ext
In Windows mit Git Bash:
git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
quelle
Und um es schön in eine Datei zu kopieren (zumindest unter Windows) - Git Bash:
Die
"
Anführungszeichen werden benötigt, damit Zeilenumbrüche erhalten bleiben.quelle
git show
oben erwähnten Syntax.Auf diese Weise können Sie alle gelöschten Dateien zwischen Commits abrufen, ohne den Pfad anzugeben. Dies ist hilfreich, wenn viele Dateien gelöscht wurden.
quelle
Dieser Befehl ruft die kopierte Datei von einem bestimmten Commit ab.
quelle
Rufen Sie die Datei aus einem vorherigen Commit ab, indem Sie das vorherige Commit auschecken und die Datei kopieren.
git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
git checkout theBranchYouNoted
git commit -m "added file ?? from previous commit"
quelle