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 deaktivieren?
Wenn ich tippe git reset --hard
, habe ich festgestellt, dass meine geänderte Version foo.java
auf die ursprüngliche zurückgesetzt wird.
git commit --amend
tut; aber mit einem viel komplizierteren Workflow. Dies beantwortet die gestellte Frage OP nicht, obwohl eine gute Richtung angegeben wurde (git reset
).git reset --soft HEAD~
Verwenden:
Dies führt standardmäßig einen "gemischten" Reset durch, der das tut, was Sie gefragt haben. Setzen Sie foo.java in nicht inszeniert und entfernen Sie das letzte Commit.
quelle
git reset --soft
funktionierte nicht,git reset HEAD^
tat es aberFür mich ist die folgende Methode besser lesbar (daher vorzuziehen):
Stattdessen
1
kann es eine beliebige Anzahl von Commits geben, die Sie aufheben möchten.quelle
git reset --soft
ist nur dafür: es ist wiegit reset --hard
, berührt aber nicht die Dateien.quelle
git reset
"ist wiegit reset --hard
, berührt aber nicht die Dateien." Nichtgit reset --soft
.git reset --soft
Die Änderungen werden inszeniert, sodass Sie sie nicht zur Bereitstellung hinzufügen müssen, wenn Sie sie festschreiben möchten, aber Sie müssengit reset
sie (ja, ein zweites Mal und ohne die--soft
), falls Sie dies nicht tun. Diese Antwort ist also kurz, aber falsch.Zum Aufheben der Bereitstellung aller Dateien in Ihrem letzten Commit -
git reset HEAD~
quelle
"Zurücksetzen" ist der Weg, um Änderungen lokal rückgängig zu machen. Beim Festschreiben wählen Sie zuerst Änderungen aus, die in " git add " aufgenommen werden sollen - das wird als "Staging" bezeichnet. Und sobald die Änderungen inszeniert sind, " git Commit " Sie sie.
Um entweder vom Staging oder vom Commit zurückzutreten, setzen Sie den HEAD zurück. In einem Zweig ist HEAD eine Git-Variable, die auf das letzte Commit verweist. Wenn Sie also inszeniert, aber nicht festgeschrieben haben, setzen Sie " HEAD HEAD zurück ". Dies sichert den aktuellen HEAD, indem Änderungen von der Bühne genommen werden. Es ist eine Abkürzung für " git reset --mixed HEAD ~ 0" ".
Wenn Sie bereits ein Commit durchgeführt haben, ist der HEAD bereits fortgeschritten, sodass Sie zum vorherigen Commit sichern müssen. Hier " setzen Sie HEAD ~ 1 zurück " 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 einen einzelnen Stream vor. Wenn jedes Commit ein einzelnes übergeordnetes Element hat und es sich nur um eine Reihe von Änderungen in der Reihenfolge handelt, können Sie den Stream mithilfe der Tilde als HEAD ~ 1, HEAD ~ 2, HEAD sichern ~ 3, für Eltern, Großeltern, Urgroßeltern usw. (technisch gesehen findet es den ersten Elternteil in früheren Generationen).
Wenn es zu einer Zusammenführung kommt, haben Commits mehr als ein übergeordnetes Element. Dann kommt das ^ caret ins Spiel - Sie können sich erinnern, weil es zeigt, wie 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 nur einen Sprung auf ein Commit mit nur einem Elternteil zurückgehen, sind HEAD ~ und HEAD ^ gleichwertig - Sie können beide verwenden.
Der Reset kann auch --soft , --mixed oder --hard sein . Bei einem Soft-Reset wird nur das Commit zurückgesetzt - der HEAD wird zurückgesetzt, die Dateien aus dem früheren Commit werden jedoch nicht ausgecheckt, sodass alle Änderungen im Arbeitsverzeichnis erhalten bleiben. Und --soft reset löscht nicht einmal die Bühne (auch als Index bezeichnet ), sodass alle bereitgestellten Dateien weiterhin auf der Bühne stehen.
Bei einem --mixed- Reset (Standardeinstellung) werden auch die Dateien aus dem früheren Commit nicht ausgecheckt , sodass alle Änderungen beibehalten werden, die Phase jedoch gelöscht wird. Deshalb wird ein einfacher " Git Reset HEAD " die Bühne räumen.
Ein --hard- Reset setzt den HEAD zurück und löscht die Phase, überprüft aber auch alle Dateien aus dem früheren Commit und überschreibt so alle Änderungen.
Wenn Sie das Commit in ein Remote-Repository verschoben haben, funktioniert das Zurücksetzen nicht so gut. Sie können lokal zurücksetzen, aber wenn Sie versuchen, auf die Fernbedienung zu pushen, erkennt git, dass sich Ihr lokaler HEAD hinter dem HEAD in der Remote-Verzweigung befindet, und weigert sich, zu pushen. Sie können vielleicht den Push erzwingen, aber Git mag das wirklich nicht.
Alternativ können Sie verstauen Sie Ihre Änderungen , wenn Sie sie behalten möchten, überprüfen die früher begehen, un-bunkern die Änderungen, Bühne sie, erstellen Sie eine neue begehen, und dann , dass drücken.
quelle
Nehmen wir an, Sie möchten Änderungen bis zu n Commits aufheben.
Wo Commit-Hashes wie folgt sind:
Führen Sie dann den folgenden Befehl aus:
git reset hn
Jetzt ist der KOPF bei hn + 1. Änderungen von h1 nach hn werden nicht bereitgestellt.
quelle