Stellen Sie die Datei aus dem alten Commit in Git wieder her

Antworten:

218
git checkout 'master@{7 days ago}' -- path/to/file.txt

Dadurch wird HEAD nicht geändert, sondern nur die lokale Datei überschrieben path/to/file.txt

Siehe man git-rev-parse für mögliche Revisionsspezifikationen dort (natürlich wird ein einfacher Hash (wie dd9bacb) gut tun)

Vergessen Sie nicht, die Änderung zu übernehmen (nach einer Überprüfung ...)

sehe sehen
quelle
15
Wow, @heneryville und sehe, ich dachte tatsächlich, 'vor 7 Tagen' wäre Meta für dich, um herauszufinden, was zu begehen ist. ty!
AnneTheAgile
7
Teil 2 Wenn Sie ein bestimmtes Commit auswählen möchten, funktioniert das obige Format nicht. Verwenden Sie stattdessen das, was Urs unten gezeigt hat, git checkout commitShaNumber - path / to / file.txt per stackoverflow.com/questions/215718/…
AnneTheAgile
2
@AnneTheAgile in der Tat, das ist immer noch genau die gleiche Syntax, ich habe gerade ein "komplexes" Beispiel für eine gegeben, revision-specificationda das, was das OP gefragt hat :)
sehe
1
Wenn Ihr Commit zum Löschen der Datei verwendet wurde, die Sie wiederherstellen möchten, verwenden Sie einfach shacommit~1(Beispiel :) git checkout 0f4bbdcd~1 -- path/to/file.txt, um das Commit unmittelbar zuvor abzurufen.
SDLINS
89
  1. Überprüfen Sie die Datei von Ihrem alten Commit über git checkout [Revision_Key] -- path/to/file.
  2. Hinzufügen, Festschreiben, Drücken nach Bedarf.
Urs Reupke
quelle
3
git checkoutkann einzelne Dateien verarbeiten (siehe Antwort von sehe), kein Kopieren und Einfügen erforderlich.
Koraktor
1
Sind Revisionsschlüssel immer der SHA1 für das Commit?
IslandCow
1
Sie sind es, aber normalerweise reichen die ersten 6 bis 8 Zeichen des SHA1 aus, um die Revision zu identifizieren.
Urs Reupke
2
@IslandCow nein, können sie SHA1, sondern auch Zweig, Tag oder jede andere Sache , die Punkte zu einem Commit, zum Beispiel HEAD, ORIG_HEADoder irgendwelche von denen in Kombination mit ^/ ~/ @-Stil Notation.
Alois Mahdal
2
Sie geben an, dass man die Datei danach "hinzufügen" soll. Das ist aber falsch. Die Datei wird nicht im Staging-Bereich abgelegt. Es ist bereits hinzugefügt.
xApple
8

Ich musste eine kürzlich in git festgeschriebene Datei wiederherstellen. Um dies zu wiederholen und eine andere Perspektive zu geben, müssen Sie dazu die folgenden zwei Schritte ausführen:

  1. git log -3
    Hier werden die drei letzten Commits angezeigt. Lesen Sie die Kommentare und den Namen des Autors, damit Sie die gewünschte Version eingrenzen können. Notieren Sie sich diese lange Festschreibungs-ID (dh b6b94f2c19c456336d60b9409fb1e373036d3d71) für die gewünschte Festschreibungsversion.

  2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 - myfile.java Übergeben Sie
    die Commit-ID UND den Dateinamen, den Sie wiederherstellen möchten. Stellen Sie sicher, dass vor und nach dem doppelten Bindestrich ein Leerzeichen steht.

Es gibt viele andere Möglichkeiten, dies zu tun. Aber dieser ist der einfachere, an den ich mich erinnern kann. Hoffentlich hilft das.

HINWEIS: Wenn Sie sich in Ihrem Projektpfad / -ordner befinden, müssen Sie den Pfad der vollständigen Datei nicht in den Befehl checkout eingeben.

Salvador Valencia
quelle
Bester Kommentar überhaupt. Da die akzeptierte Antwort davon ausgeht, dass die abzurufende Datei nach oben verschoben wird, ruft dieser Befehl die nur lokal vorhandene Datei ab / stellt sie wieder her.
ot0
1
Ich habe es gerade im Stammordner meines lokalen Git-Repos versucht. Ich musste immer noch den relativen Pfad zur Datei angeben. Nur die Angabe des - [Dateinamens] allein hat nicht funktioniert.
user2784627
@ ot0 Nein, das wird nicht vorausgesetzt. Sie sind genau die gleiche Antwort.
Matt
4

Alle Antworten erwähnen git checkout <tree-ish> -- <pathspec>. Ab git v2.23.0 gibt es eine neue git-Wiederherstellungsmethode , die einen Teil dessen übernehmen soll, wofür git checkoutverantwortlich war. Die Höhepunkte der Änderungen finden Sie im Github-Blog .

Das Standardverhalten dieses Befehls besteht darin, den Status eines Arbeitsbaums mit dem Inhalt wiederherzustellen, der aus dem sourceParameter stammt (in Ihrem Fall handelt es sich um einen Commit-Hash).

Angenommen, der Commit-Hash ist, würde abcdefder Befehl folgendermaßen aussehen:

git restore --source=abcdef file_name

was es (standardmäßig) in den Arbeitsbaum setzt. Wenn Sie die Änderung direkt in den Index aufnehmen möchten, damit sie sofort festgeschrieben werden kann:

git restore --source=abcdef --worktree --staged file_name

oder mit kurzen Optionsnamen:

git restore -s=abcdef -W -S file_name
mjarosie
quelle