1959 Stimmen

Wie kann ich eine alte Version einer Datei mit Git anzeigen?

Gibt es einen Befehl in Git, um zu sehen (entweder als Dump in stdout, oder in $PAGER o $EDITOR ) eine bestimmte Version einer bestimmten Datei?

3 Stimmen

Wenn Sie zu dieser Frage gekommen sind, weil Sie eine ältere Version einer Binärdatei (z.B. eines Bildes) überprüfen wollen, dann ist es besser, einen Checkout in den alten Commit zu machen, zu sehen, was Sie sehen müssen, und dann zum HEAD zurückzukehren. Dazu machen Sie git checkout <sha1-of-the-commit-you-need> , danach, git checkout HEAD

54voto

Ijas Ameenudeen Punkte 8699

Zusätzlich zu Jim Hunziker die Antwort,

können Sie die Datei aus der Revision exportieren als,

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt

Ich hoffe, das hilft :)

34voto

sanbor Punkte 1214

git log -p zeigt Ihnen nicht nur die Commit-Protokolle, sondern auch den Diff jedes Commits (außer Merge-Commits). Dann können Sie auf / , geben Sie den Dateinamen ein und drücken Sie enter . Drücken Sie n o p um zum nächsten/vorherigen Vorkommen zu gelangen. Auf diese Weise sehen Sie nicht nur die Änderungen in der Datei, sondern auch die Übergabeinformationen.

4 Stimmen

Sieht aus wie git log -pm würde auch Merge Commits anzeigen.

8 Stimmen

Sie können auch Folgendes ausführen git log -p -- filename.txt um den Verlauf nur auf die gewünschte Datei zu beschränken.

9voto

Andrew Punkte 6861

WEG 1: (Ich bevorzuge diesen Weg, da so keine unbestätigten Daten verloren gehen können)

  1. Finden Sie die Commit-ID mit: git reflog

  2. Dateien aus der Übertragung auflisten git diff-tree --no-commit-id --name-only -r <commitHash>

    Exemple :

    git diff-tree --no-commit-id --name-only -r d2f9ba4
    d2f9ba4 ist die Commit-ID aus Schritt 1.

  3. Öffnen Sie die gewünschte Datei mit dem folgenden Befehl:

    git show <commitHash>:/path/to/file

    Exemple :

    git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift
    Src/... ist der Dateipfad aus Schritt 2.


WEG 2: (Möglichkeit des Verlusts nicht gebundener Daten)

  1. Finden Sie die Commit-ID mit: git reflog

  2. Führen Sie einen Hard-Reset zu diesem Commit durch: git reset --hard %commit ID%

    Exemple :

    git reset --hard c14809fa

  3. Nehmen Sie die erforderlichen Änderungen vor und führen Sie eine neue Übertragung in den gewünschten Zweig durch.

0 Stimmen

Ja, das ist in Ordnung mit Hard-Reset. Das ist, weil der Reset ist "hart", aber nicht "weich". Aber Sie müssen hart wegen der Möglichkeiten der Konflikte zu tun.

4voto

Brad Parks Punkte 59613

Sie können ein Skript wie dieses verwenden, um alle Versionen einer Datei in getrennten Dateien abzulegen:

z.B..

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

Holen Sie sich die Skript hier als Antwort auf eine andere ähnliche Frage

1 Stimmen

git_root , git_log_short y git_log_message_for_commit fehlen.

0 Stimmen

Gut gefangen! Ich habe diese Antwort doppelt an 2 verschiedenen Stellen gepostet, und habe diese gerade entfernt und auf die andere verlinkt, wo mir die Leute vorher davon erzählt haben... Danke @mogsie!

0 Stimmen

Dieses Skript ist sehr nützlich!

2voto

Hilfsmittel zum Abrufen mehrerer Dateien aus einer bestimmten Revision

Bei der Lösung von Zusammenführungskonflikten ist dieses Hilfsmittel 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)

GitHub vorgelagert .

Verwendung:

git-show-save other-branch file1.c path/to/file2.cpp

Ergebnis: Im Folgenden finden Sie die alternativen Versionen der Dateien:

file1.old.c
path/to/file2.old.cpp

Auf diese Weise behalten Sie die Dateierweiterung bei, so dass Ihr Editor sich nicht beschweren wird und die alte Datei leicht neben der neuen Datei finden kann.

0 Stimmen

@MickeyPerlstein wenn Sie die gleiche Schnittstelle mit einer besseren Implementierung erreichen können, bin ich ganz Ohr.

0 Stimmen

Vielleicht verstehe ich es nicht (und falls ja, bitte ich um Entschuldigung), aber ist es nicht einfach: "git show version:./path > new_path"?

0 Stimmen

@MickeyPerlstein Hallo, ja, mein Befehl generiert diese CLI, aber er läuft in Schleifen über mehrere Dateien und erzeugt den Ausgabenamen aus der Eingabe, so dass Sie nicht zu viel eingeben müssen. Natürlich nichts Revolutionäres, aber praktisch.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X