1218 Stimmen

Wie verwende ich "git reset --hard HEAD", um zu einer früheren Übertragung zurückzukehren?

Ich weiß, dass Git die Änderungen, die ich an meiner Anwendung vornehme, verfolgt und so lange speichert, bis ich die Änderungen festschreibe.

Um zu einem früheren Commit zurückzukehren, habe ich verwendet:

$ git reset --hard HEAD

HEAD is now at 820f417 micro

Wie kann ich dann die Dateien auf meiner Festplatte auf die vorherige Übertragung zurücksetzen?

Meine nächsten Schritte waren:

git add .
git commit -m "revert"

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

1404voto

Mark Longair Punkte 412179

Erstens: Es ist immer wichtig zu wissen, dass git reset --hard ist ein potenziell gefährlicher Befehl, da er alle nicht übertragenen Änderungen verwirft. Zur Sicherheit sollten Sie immer überprüfen, ob die Ausgabe von git status sauber (d.h. leer) ist, bevor Sie es benutzen.

Zu Beginn sagen Sie Folgendes:

Ich weiß also, dass Git die Änderungen, die ich an meiner Anwendung vornehme, verfolgt und so lange speichert, bis ich die Änderungen übertrage, aber hier hakt es:

Das ist nicht korrekt. Git zeichnet den Zustand der Dateien nur auf, wenn Sie sie bereitstellen (mit git add ) oder wenn Sie eine Übertragung erstellen. Sobald Sie einen Commit erstellt haben, der Ihre Projektdateien in einen bestimmten Zustand versetzt, sind sie sehr sicher, aber bis dahin "verfolgt" Git nicht wirklich Änderungen an Ihren Dateien. (zum Beispiel, selbst wenn Sie git add um eine neue Version der Datei bereitzustellen, die die zuvor bereitgestellte Version dieser Datei im Bereitstellungsbereich überschreibt).

In Ihrer Frage fragen Sie dann Folgendes:

Wenn ich zu einer früheren Übergabe 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 die vorherige Übertragung zurücksetzen?

Wenn Sie das tun git reset --hard <SOME-COMMIT> dann wird Git:

  • Machen Sie Ihren aktuellen Zweig (normalerweise master ) zurück zum Punkt bei <SOME-COMMIT> .
  • Stellen Sie dann die Dateien in Ihrem Arbeitsbaum und im Index ("staging area") auf die gleichen Versionen ein wie die in <SOME-COMMIT> .

HEAD verweist auf Ihren aktuellen Zweig (oder die aktuelle Übertragung), so dass alles, was git reset --hard HEAD ist es, alle nicht bestätigten Änderungen zu verwerfen.

Nehmen wir also an, der gute Commit, zu dem Sie zurückkehren wollen, ist f414f31 . (Sie finden sie über git log oder einen beliebigen Verlaufsbrowser). Je nachdem, was Sie genau tun möchten, haben Sie dann verschiedene Möglichkeiten:

  • Ändern Sie Ihren aktuellen Zweig so, dass er stattdessen auf den älteren Commit verweist. Das können Sie mit git reset --hard f414f31 . Dies bedeutet jedoch, dass Sie die Geschichte Ihrer Verzweigung neu schreiben, weshalb Sie dies vermeiden sollten, wenn Sie diese Verzweigung mit jemandem geteilt haben. Außerdem werden die Commits, die Sie nach f414f31 wird nicht mehr in der Historie Ihrer master Zweigstelle.
  • Erstellen Sie eine neue Übergabe, die genau denselben Zustand des Projekts repräsentiert wie f414f31 sondern fügt dies einfach der Historie hinzu, so dass Sie keine Historie verlieren. Sie können dies mit den Schritten tun, die in diese Antwort - etwas wie:

    git reset --hard f414f31
    git reset --soft HEAD@{1}
    git commit -m "Reverting to the state of the project at f414f31"

298voto

uday Punkte 8210

WARNUNG: git clean -f entfernt nicht verfolgte Dateien, d.h. sie sind für immer verschwunden, da sie nicht im Repository gespeichert sind. Stellen Sie sicher, dass Sie wirklich alle nicht verfolgten Dateien entfernen wollen, bevor Sie dies tun.


Probieren Sie dies aus und sehen Sie git clean -f .

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

Alternativ können Sie auch Folgendes tun (aber Vorsicht - dabei werden auch alle ignorierten Dateien entfernt)

  • git clean -df
  • git clean -xdf VORSICHT! Dabei werden auch ignorierte Dateien gelöscht

Erläuterung der Flaggen:

-d löscht alle Dateien in Verzeichnissen rekursiv

-f

Wenn die Git-Konfigurationsvariable clean.requireForce nicht auf false gesetzt ist, weigert sich git clean, Dateien oder Verzeichnisse zu löschen, wenn nicht angegeben -f oder -i. Git weigert sich, nicht verfolgte verschachtelte Git Repositories (Verzeichnisse mit einem .git-Unterverzeichnis) zu ändern, es sei denn, ein zweites -f angegeben wird.

-x Verwenden Sie keine Standard-Ignore-Regeln, sondern solche, die von -e . Damit kann ein neuer Build gestartet werden.

Quelle: Mann-Seiten

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