556 Stimmen

Zurückkehren zu einem bestimmten Commit basierend auf der Commit-ID mit Git?

Mit git log erhalte ich eine Liste der bisher vorgenommenen Übertragungen.

commit f5c5cac0033439c17ebf905d4391dc0705dbd5f1
Author: prosseek 
Date:   Fri Sep 3 14:36:59 2010 -0500

    Added and modified the files.

commit c14809fafb08b9e96ff2879999ba8c807d10fb07
Author: prosseek 
Date:   Tue Aug 31 08:59:32 2010 -0500

    Just simple test for core.editor.

... etc ...
  • Wie kann ich zu einer bestimmten Übertragung zurückkehren? Was sollte ich zum Beispiel tun, wenn ich zurückgehen möchte zu commit c14809fafb08b9e96ff2879999ba8c807d10fb07 ?

  • Gibt es eine andere/bessere Möglichkeit, mit Git zu einem bestimmten Commit zurückzukehren? Kann ich z. B. ein Label für jeden Commit eingeben, um ihn mit dem Label zurückzuholen?

860voto

bwawok Punkte 13962

Wollen Sie Ihr Repo auf diesen Zustand zurücksetzen oder wollen Sie nur, dass Ihr lokales Repo so aussieht?

Wenn Sie reset --hard werden Ihr lokaler Code und Ihre lokale Historie so sein, wie sie zum Zeitpunkt der Übertragung waren. Aber wenn Sie dies an jemand anderen weitergeben wollen, der die neue Historie hat, würde es fehlschlagen:

git reset --hard c14809fa

Und wenn Sie reset --soft wird Ihr HEAD dorthin verschoben, wo er war, aber Ihre lokalen Dateien usw. bleiben unverändert:

git reset --soft c14809fa

Was genau wollen Sie also mit diesem Reset erreichen?

Bearbeiten -

Sie können "Tags" zu Ihrem Repo hinzufügen und dann zu einem Tag zurückkehren. Aber ein Tag ist eigentlich nur eine Abkürzung zum sha1.

Sie können dies als TAG1.. markieren und dann eine git reset --soft c14809fa , git reset --soft TAG1 , oder git reset --soft c14809fafb08b9e96ff2879999ba8c807d10fb07 würden alle das Gleiche tun.

240voto

Peter A Punkte 2393

Ich denke, dass die Antwort von bwawok an einer Stelle falsch ist:

wenn Sie es tun

git reset --soft c14809fa

Dadurch werden Ihre lokalen Dateien so geändert, wie sie damals waren, aber Ihr Verlauf usw. bleibt unverändert.

Nach Angaben von Handbuch: git-reset , "git reset --soft"...

berührt weder die Indexdatei noch den Arbeitsbaum (sondern setzt den Kopf auf <commit> zurück, wie alle anderen Modi auch). Dadurch bleiben alle geänderten Dateien "Änderungen, die übertragen werden sollen", wie es der Git-Status ausdrücken würde.

Dadurch werden neuere Commits aus dem Zweig "entfernt". Das bedeutet, dass Sie, nachdem Sie sich Ihren alten Code angesehen haben, nicht mehr ohne weiteres zum neuesten Commit in diesem Zweig wechseln können. Es macht also das Gegenteil, wie von bwawok beschrieben: Die lokalen Dateien werden nicht verändert (sie sehen genauso aus wie vor "git reset --soft"), aber die Historie wird verändert (der Zweig wird nach dem angegebenen Commit abgeschnitten).

Der Befehl für bwawoks Antwort könnte lauten:

git checkout <commit>

Sie können diese Funktion nutzen, um alte Revisionen einzusehen: Wie sah mein Code gestern aus?

(Ich weiß, ich sollte das in die Kommentare zu dieser Antwort schreiben, aber Stackoverflow erlaubt mir das nicht! Mein Ansehen ist zu gering).

53voto

Doches Punkte 3056

git reset c14809fafb08b9e96ff2879999ba8c807d10fb07 ist das, was Sie suchen...

29voto

kenzaraque Punkte 268

Wenn Sie das Thema erzwingen wollen, können Sie das tun:

git reset --hard c14809fafb08b9e96ff2879999ba8c807d10fb07

Sie auf den Stand zurücksetzen, den Ihr Git-Klon zum Zeitpunkt des Checkin hatte

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