it-swarm.com.de

Wie verwende ich "git reset --hard HEAD", um zu einem vorherigen Commit zurückzukehren?

Ich weiß, dass Git die Änderungen, die ich an meiner Anwendung vorgenommen habe, protokolliert und sie so lange beibehält, bis ich die Änderungen festschreibe.

Wenn ich zu einem vorherigen Commit zurückkehren möchte, verwende ich:

git reset --hard HEAD

Und Git kehrt zurück:

HEAD is now at 820f417 micro

Wie kann ich dann die Dateien auf meiner Festplatte auf den vorherigen Commit zurücksetzen?

Meine nächsten Schritte waren:

git add .
git commit -m "revert"

Aber keine der Dateien auf meiner Festplatte hat sich geändert ...

Was mache ich richtig/falsch?

842
Brian McDonough

Erstens ist es immer erwähnenswert, dass git reset --hard ein potenziell gefährlicher Befehl ist, da alle nicht festgeschriebenen Änderungen verworfen werden. Aus Sicherheitsgründen sollten Sie immer überprüfen, ob die Ausgabe von git status sauber (dh leer) ist, bevor Sie sie verwenden.

Zunächst sagen Sie Folgendes:

Ich weiß also, dass Git die Änderungen, die ich an meiner Anwendung vorgenommen habe, protokolliert und sie beibehält, bis ich die Änderungen festschreibe. Aber hier habe ich aufgelegt:

Das ist falsch Git zeichnet den Status der Dateien nur auf, wenn Sie sie bereitstellen (mit git add) oder wenn Sie ein Commit erstellen. Sobald Sie ein Commit erstellt haben, dessen Projektdateien sich in einem bestimmten Zustand befinden, sind sie sehr sicher, aber bis dahin "verfolgt" GIT Änderungen an Ihren Dateien nicht wirklich. (Auch wenn Sie zum Bereitstellen einer neuen Version der Datei git add ausführen, wird die zuvor bereitgestellte Version dieser Datei im Staging-Bereich überschrieben.)

In Ihrer Frage stellen Sie dann folgende Fragen:

Wenn ich zu einem vorherigen Commit zurückkehren möchte, verwende ich: git reset --hard HEAD Und git gibt zurück: HEAD ist jetzt bei 820f417 micro

Wie kann ich dann die Dateien auf meiner Festplatte auf den vorherigen Commit zurücksetzen?

Wenn du git reset --hard <SOME-COMMIT> machst, wird Git:

  • Stellen Sie Ihren aktuellen Zweig (normalerweise master) auf <SOME-COMMIT> zurück.
  • Stellen Sie dann die Dateien in Ihrem Arbeitsbaum und dem Index ("Staging-Bereich") auf die gleichen Werte wie die in <SOME-COMMIT> festgeschriebenen Versionen.

HEAD verweist auf Ihren aktuellen Zweig (oder Ihr aktuelles Commit), sodass git reset --hard HEAD lediglich alle nicht festgeschriebenen Änderungen verwirft, die Sie vorgenommen haben.

Nehmen wir also an, das gute Commit, zu dem Sie zurückkehren möchten, ist f414f31. (Sie können das über git log oder einen beliebigen Verlaufsbrowser finden.) Sie haben dann ein paar verschiedene Optionen, je nachdem, was Sie genau tun möchten:

  • Ändern Sie Ihren aktuellen Zweig so, dass er stattdessen auf das ältere Commit verweist. Du könntest das mit git reset --hard f414f31 machen. Dadurch wird jedoch der Verlauf Ihrer Zweigstelle neu geschrieben. Sie sollten ihn daher vermeiden, wenn Sie diese Zweigstelle für andere Personen freigegeben haben. Außerdem sind die Commits, die Sie nach f414f31 ausgeführt haben, nicht mehr in der Historie Ihres master Zweigs enthalten.
  • Erstellen Sie ein neues Commit, das genau den gleichen Status des Projekts wie f414f31 darstellt, das jedoch nur dem Verlauf hinzugefügt wird, sodass Sie keinen Verlauf verlieren. Sie können dies mit den in diese Antwort - vorgeschlagenen Schritten tun.

    git reset --hard f414f31
    git reset --soft [email protected]{1}
    git commit -m "Reverting to the state of the project at f414f31"
    
969
Mark Longair

WARNUNG: git clean -f entfernt nicht verfolgte Dateien, was bedeutet, dass sie endgültig gelöscht sind, da sie nicht im Repository gespeichert sind. Stellen Sie sicher, dass Sie wirklich alle nicht verfolgten Dateien entfernen möchten, bevor Sie dies tun.


Versuchen Sie dies und sehen Sie git clean -f.

git reset --hard entfernt keine nicht verfolgten Dateien, während git-clean alle Dateien aus dem verfolgten Stammverzeichnis entfernt, die nicht unter Git-Tracking stehen.

Alternativ können Sie dies, wie @Paul Betts bereits sagte, tun (Vorsicht - dies entfernt auch alle ignorierten Dateien).

  • git clean -df
  • git clean -xdfACHTUNG! Dadurch werden auch ignorierte Dateien gelöscht
191
uday