Gibt es in Git einen Befehl zum Anzeigen (entweder in stdout oder in $PAGER
oder $EDITOR
) einer bestimmten Version einer bestimmten Datei?
git checkout <sha1-of-the-commit-you-need>
, danachgit checkout HEAD
Gibt es in Git einen Befehl zum Anzeigen (entweder in stdout oder in $PAGER
oder $EDITOR
) einer bestimmten Version einer bestimmten Datei?
git checkout <sha1-of-the-commit-you-need>
, danachgit checkout HEAD
Antworten:
Sie können git show
mit einem Pfad aus dem Stammverzeichnis des Repositorys ( ./
oder ../
für die relative Pfadbildung) Folgendes verwenden:
$ git show REVISION:path/to/file
Durch REVISION
Ihre tatsächliche Revision ersetzen (kann ein Git-Commit-SHA, ein Tag-Name, ein Zweigname, ein relativer Commit-Name oder eine andere Methode zum Identifizieren eines Commits in Git sein).
<repository-root>/src/main.c
Verwenden Sie beispielsweise Folgendes, um die Version der Datei von vor 4 Commits anzuzeigen :
$ git show HEAD~4:src/main.c
Git für Windows erfordert Schrägstriche auch in Pfaden relativ zum aktuellen Verzeichnis. Weitere Informationen finden Sie in der Manpage für git-show
.
Dies nach Datum zu tun sieht folgendermaßen aus:
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt
Beachten Sie, dass HEAD@{2013-02-25}
in diesem Repository (unter Verwendung des Reflogs ) "wo HEAD am 25.02.2013 war" bedeutet , nicht "das letzte Commit vor dem 25.02.2013 in diesem Zweig in der Geschichte".
master
statt HEAD@{2013-02-25}
, wenn Sie auf einem Zweig sind
git log --since='2016-04-28 23:59:59 +0100'
angeben?
Wenn Sie GUIs mögen, können Sie gitk verwenden:
starte gitk mit:
gitk /path/to/file
Wählen Sie die Revision im oberen Teil des Bildschirms, z. B. nach Beschreibung oder Datum. Standardmäßig zeigt der untere Teil des Bildschirms den Unterschied für diese Revision (entsprechend dem Optionsfeld "Patch").
So zeigen Sie die Datei für die ausgewählte Revision an:
gitk REVISION /path/to/file
. Dies kann nützlich sein, wenn Sie beispielsweise mit einer bestimmten Version vergleichen möchten.
Sie können mit dem Befehl auch eine commit hash
(häufig auch aufgerufene commit ID
) angeben .git show
git show <commitHash>:/path/to/file
git log /path/to/file
commit hash
solche wie commit 06c98...
(06c98 ... als Commit-Hash) angezeigt.commit hash
git show <commitHash>:/path/to/file
mit commit hash
Schritt 3 und path/to/file
Schritt 1 aus.Hinweis: Das Hinzufügen des ./
bei Angabe eines relativen Pfads erscheinenden Pfads scheint wichtig zu sein, d git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html
. H.
git show <SHA1> --name-only
, um ihn abzurufen.
Zusätzlich zu Jim Hunzikers Antwort
Sie können die Datei aus der Revision exportieren als:
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt
Hoffe das hilft :)
So erkennen Sie schnell die Unterschiede zu älteren Revisionen einer Datei:
git show -1 filename.txt
> zum Vergleich mit der letzten Revision der Datei
git show -2 filename.txt
> zum Vergleich mit der vorletzten Revision
git show -3 fielname.txt
> zum Vergleich mit der letzten vorletzten Revision
git log -p
zeigt Ihnen nicht nur die Festschreibungsprotokolle, sondern auch die Unterschiede der einzelnen Festschreibungen (mit Ausnahme der Festschreibungs-Festschreibungen). Dann können Sie drücken /
, Dateinamen eingeben und drücken enter
. Drücken Sie n
oder p
, um zum nächsten / vorherigen Ereignis zu gelangen. Auf diese Weise sehen Sie nicht nur die Änderungen in der Datei, sondern auch die Festschreibungsinformationen.
git log -pm
würde auch Merge-Commits angezeigt.
git log -p -- filename.txt
, um den Verlauf nur auf die gewünschte Datei zu beschränken.
Mit einem solchen Skript können Sie alle Versionen einer Datei in separate Dateien sichern:
z.B
git_dump_all_versions_of_a_file.sh path/to/somefile.txt
Holen Sie sich das Skript hier als Antwort auf eine andere ähnliche Frage
git_root
, git_log_short
Und git_log_message_for_commit
fehlen.
WEG 1: (Ich bevorzuge diesen Weg)
git reflog
git diff-tree --no-commit-id --name-only -r <commitHash>
Beispiel:
git diff-tree --no-commit-id --name-only -r d2f9ba4
// "d2f9ba4" ist eine Festschreibungs-ID von "1".
git show <commitHash>:/path/to/file
Beispiel:
git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift
// "Src / ..." ist der Dateipfad von "2".
WEG 2:
git reflog
git reset --hard %commit ID%
git reset --hard c14809fa
Hilfsprogramm zum Abrufen mehrerer Dateien aus einer bestimmten Revision
Wenn Sie versuchen, Zusammenführungskonflikte zu lösen, ist dieser Helfer sehr nützlich:
#!/usr/bin/env python3
import argparse
import os
import subprocess
parser = argparse.ArgumentParser()
parser.add_argument('revision')
parser.add_argument('files', nargs='+')
args = parser.parse_args()
toplevel = subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).rstrip().decode()
for path in args.files:
file_relative = os.path.relpath(os.path.abspath(path), toplevel)
base, ext = os.path.splitext(path)
new_path = base + '.old' + ext
with open(new_path, 'w') as f:
subprocess.call(['git', 'show', '{}:./{}'.format(args.revision, path)], stdout=f)
Verwendungszweck:
git-show-save other-branch file1.c path/to/file2.cpp
Ergebnis: Die folgenden Versionen enthalten die alternativen Versionen der Dateien:
file1.old.c
path/to/file2.old.cpp
Auf diese Weise behalten Sie die Dateierweiterung bei, damit sich Ihr Editor nicht beschwert und die alte Datei direkt neben der neueren Datei leicht findet.