384 Stimmen

Wie kann ich meine Dateien nach einer lokalen Übergabe wieder freigeben?

Ich habe den folgenden Befehl ausgeführt

git add <foo.java>
git commit -m "add the foo.java file"

Wie kann ich mein lokales Commit jetzt löschen und foo.java aus der Versenkung holen?

Wenn ich tippe git reset --hard habe ich festgestellt, dass es meine geänderten foo.java zum Original.

17voto

HieroB Punkte 3439

"Zurücksetzen" ist der Weg, um Änderungen lokal rückgängig zu machen. Beim Übertragen wählen Sie zunächst die Änderungen aus, die Sie mit " Git hinzufügen " - das nennt man "Staging". Und sobald die Änderungen bereitgestellt sind, können Sie " Git Commit " sie.

Um den Staging- oder Commit-Prozess abzubrechen, setzen Sie den HEAD zurück. Bei einer Verzweigung ist HEAD eine Git-Variable, die auf die letzte Übertragung verweist. Wenn Sie also ein Staging durchgeführt, aber noch keine Übertragung vorgenommen haben, können Sie " git reset HEAD ." Damit wird der aktuelle HEAD unterstützt, indem Änderungen von der Bühne genommen werden. Das ist die Kurzform für " git reset --mixed HEAD~0 ."

Wenn Sie bereits einen Commit durchgeführt haben, ist der HEAD bereits fortgeschritten, so dass Sie zum vorherigen Commit zurückkehren müssen. Hier müssen Sie " HEAD~1 zurücksetzen " oder " HEAD^1 zurücksetzen " oder " HEAD~ zurücksetzen " oder " HEAD^ zurücksetzen "-- alle Referenz-HEAD minus eins.

Welches ist das bessere Symbol, ~ oder ^? Stellen Sie sich die Tilde ~ als eine einzelner Strom -- wenn jede Übergabe einen einzelnen Elternteil hat und es sich nur um eine Reihe von Änderungen in Folge handelt, dann können Sie mit der Tilde zurück in den Stream referenzieren, als HEAD~1, HEAD~2, HEAD~3, für Elternteil, Großeltern, Urgroßeltern, usw. (technisch gesehen ist es das Finden der erste Eltern in früheren Generationen).

Wenn es eine Zusammenführung gibt, haben Commits mehr als einen Elternteil. Dann kommt das ^-Kürzel ins Spiel - Sie können es sich merken, weil es zeigt, dass die Zweige zusammenkommen. Mit dem Caret wäre HEAD^1 der erste Elternteil und HEAD^2 der zweite Elternteil eines einzelnen Commits - Mutter und Vater, zum Beispiel.

Wenn Sie also bei einem Single-Parent-Commit nur einen Schritt zurückgehen, dann sind HEAD~ und HEAD^ gleichwertig - Sie können beide verwenden.

Außerdem kann das Zurücksetzen sein -weich , --mixed 或いは --hart . Ein Soft-Reset macht nur den Commit rückgängig - es setzt den HEAD zurück, aber es checkt die Dateien des früheren Commits nicht aus, so dass alle Änderungen im Arbeitsverzeichnis erhalten bleiben. Und -weich zurückgesetzt wird, nicht einmal die Bühne frei (auch bekannt als die Index ), so dass alle Dateien, die bereitgestellt wurden, noch auf der Bühne sind.

A --mixed zurücksetzen (die Voreinstellung) checkt auch nicht die Dateien der früheren Übergabe aus, so dass alle Änderungen erhalten bleiben, aber der Stand wird geleert. Deshalb ist ein einfaches " git reset HEAD " von der Bühne verschwinden wird.

A --hart reset setzt den HEAD zurück und löscht die Stage, aber es checkt auch alle Dateien des früheren Commits aus und überschreibt somit alle Änderungen.

Wenn Sie den Commit in ein entferntes Repository verschoben haben, dann zurücksetzen funktioniert nicht so gut. Sie können lokal zurücksetzen, aber wenn Sie versuchen, an den entfernten Zweig zu pushen, wird Git feststellen, dass Ihr lokaler HEAD hinter dem HEAD im entfernten Zweig liegt und sich weigern, zu pushen. Sie können den Push zwar erzwingen, aber Git tut das nicht gerne.

Alternativ können Sie auch Versteck Ihre Änderungen, wenn Sie sie beibehalten wollen, auschecken die frühere Übertragung, entpacken Sie die Änderungen, stellen Sie sie bereit, erstellen Sie eine neue Übertragung und pushen Sie diese dann.

6voto

Vasantha Ganesh Punkte 3960

Angenommen, Sie möchten Änderungen bis zu n Commits rückgängig machen,

Die Commit-Hashes lauten dabei wie folgt:

  • h1
  • h2 ...
  • hn
  • hn+1

Führen Sie dann den folgenden Befehl aus:
git reset hn

Der HEAD liegt nun bei hn+1. Änderungen von h1 nach hn werden nicht verschoben.

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