Entfernen Sie ein Git-Commit, das nicht verschoben wurde


722

Ich habe ein gemacht, git commitaber ich habe es noch nicht in das Repository verschoben. Wenn ich das tue git status, erhalte ich '# Ihr Zweig ist um 1 Commit vor' Master '.

Wenn ich also mein Top-Commit zurücksetzen möchte, kann ich einfach Folgendes tun:

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

wenn ich das git logbekomme, bekomme ich:

Commit eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
Datum: Di 29.09. 11:21:41 2009 -0700


Commit db0c078d5286b837532ff5e276dcf91885df2296
Datum: Di 22.09. 10:31:37 2009 -0700

9
Diese Frage scheint ein Duplikat einer anderen Ihrer eigenen Fragen zu sein: stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Brian Campbell



3
GEFAHR: reset --hardKann zu Arbeitsverlust führen, da dies dazu führt, dass Git Ihre lokalen Dateien (Ihre neue Arbeit) mit denen aus dem Web überschreibt (mir passiert). Fragen und Antworten zu git sollten explizit angeben, was ihre Befehle tun und welche Risiken für die Leser bestehen.
OrangeSherbet

Antworten:


673

Eigentlich , wenn Sie verwenden git reset, sollten Sie sich auf die verpflichten , dass Sie das Zurücksetzen auf ; Sie würden also db0c078wahrscheinlich das Commit wollen .

Eine einfachere Version wäre git reset --hard HEAD^, vor dem aktuellen Kopf auf das vorherige Commit zurückzusetzen. Auf diese Weise müssen Sie keine Commit-IDs kopieren.

Passen Sie auf git reset --hard, wenn Sie etwas tun , da Sie alle nicht festgeschriebenen Änderungen verlieren können, die Sie haben. Möglicherweise möchten Sie überprüfen git status, ob Ihre Arbeitskopie sauber ist oder ob vorhandene Änderungen weggeblasen werden sollen.

Zusätzlich können Sie anstelle von HEAD origin/masterals Referenz verwenden, wie von @bdonlan in den Kommentaren vorgeschlagen:git reset --hard origin/master


374
Oder git reset --hard origin/masterum es auf den Ursprung zurückzusetzen.
Bdonlan

1
Ein weiterer nützlicher Zeiger, auf den Sie zurücksetzen können, ist ORIG_HEAD oder dessen Verallgemeinerung unter Verwendung von Reflog HEAD @ {1} (der letzten Position von HEAD).
Jakub Narębski

12
Leser, bevor Sie git resetIhren Code. Machen Sie Ihre Zukunft selbst einen Gefallen: Der Unterschied zwischen reset, reset --softund reset --hard(Was ist mit Ihrer früheren geschieht git addauch bekannt als „Arbeit“ :) Bild: Link
user18099

3
Beachten Sie, dass dadurch alles gelöscht wird, was in dem Commit enthalten war, das entfernt werden soll (a git statuszeigt also keine Änderungen an und das Commit wird entfernt / Änderungen gehen verloren).
Bjørn Børresen

12
HINWEIS: Seien Sie vorsichtig bei der Verwendung, git reset --hard HEAD^da Sie Änderungen in den festgeschriebenen Dateien verlieren (Ihre Änderungen werden gelöscht). Es gibt zwei Zweige zu dieser Frage: Um ein Commit zurückzusetzen, aber noch Änderungen auf der Festplatte zu haben, tun Sie diesgit reset --soft HEAD~1
Papigee

625

WENN Sie Ihre Änderungen NICHT auf Remote übertragen haben

git reset HEAD~1

Überprüfen Sie, ob die Arbeitskopie von sauber ist git status.

SONST haben Sie Ihre Änderungen auf Remote übertragen

git revert HEAD

Dieser Befehl wird das letzte Festschreiben / Ändern zurücksetzen / entfernen und dann können Sie drücken


34
Dies antwortet auf "Entfernen Sie das letzte Git-Commit, das nicht gepusht wurde" (nächstgelegene Antwort IMHO)
Pierre de LESPINAY

25
Außerdem werden die lokalen Änderungen, die im letzten Commit vorgenommen wurden, beibehalten, während der Git-Reset - hart nicht
Stanimir Stoyanov am

1
Für mich wird es das letzte Push-Commit und das nicht gepusste Commit rückgängig machen
CodyChan

git revert HEAD hat für mich gerade alle Dateien gelöscht, die ich zum Pushen bereit hatte. Achtung!
Jason Bruce

159
git reset --hard origin/master

um es auf den Ursprung zurückzusetzen.

Dies wurde von @bdonlan in den Kommentaren gepostet . Ich habe diese Antwort für Leute hinzugefügt, die keine Kommentare lesen.


4
Diese Frage wurde vor fast 5 Jahren gestellt und ist bereits in einem der Kommentare enthalten.
Anubian Noob

1
Was ist, wenn sich der aktuelle lokale Zweig von unterscheidet master- sollte ich ihn origin/mybranchdann verwenden?
Pavel Vlasov

9
Normalerweise lese ich die Kommentare nicht, wenn ich es eilig habe, eine Antwort zu erhalten ... Danke, dass Sie eine Antwort gegeben haben (eine einfache, die funktioniert)
Leonardo Alves Machado

Warnung: Beachten Sie, dass dadurch alle vorhandenen Codeänderungen entfernt werden, außer git reset HEAD~dass nur das Festschreiben in Code zurückgesetzt wird
Mayer Spitzer

69

Diese Frage besteht aus zwei Zweigen (das Zurücksetzen eines Commits bedeutet nicht, dass ich alle meine lokalen Änderungen verlieren möchte):

1. Um das letzte Festschreiben zurückzusetzen und Änderungen in der festgeschriebenen Datei zu verwerfen , gehen Sie wie folgt vor :

git reset --hard HEAD~1

2. Um das letzte Commit zurückzusetzen, aber die lokalen Änderungen (auf der Festplatte) beizubehalten , gehen Sie wie folgt vor :

git reset --soft HEAD~1

Dies (der spätere Befehl) bringt Sie in den Zustand, in dem Sie gewesen wären, wenn Sie dies getan hätten git add.

Wenn Sie die Dateien danach entfernen möchten, tun Sie dies

git reset

Jetzt können Sie weitere Änderungen vornehmen, bevor Sie sie hinzufügen und dann erneut festschreiben.


47

Geben Sie einfach die Konsole ein:

$ git reset HEAD~

Dieser Befehl verwirft alle lokalen Commits vor dem Remote-HEAD


7
Können Sie erklären, was Ihre Antwort zu den vorhandenen Antworten hinzufügt?
nvoigt

Dies löscht das aktuelle Commit vor dem Push - ohne Änderungen, die Sie vor Ort vorgenommen haben - wie die anderen Antworten -, die ein schwerer Moment des Haarausfalls sein könnten
Grant

42

Ich glaube, dass einer davon Ihren Bedürfnissen entspricht

1 - Machen Sie das Festschreiben rückgängig und lassen Sie alle Dateien bereit: git reset --soft HEAD~;

2 - Commit rückgängig machen und alle Dateien entfernen: git reset HEAD~;

3 - Machen Sie das Commit rückgängig und entfernen Sie alle Änderungen vollständig: git reset --hard HEAD~;

Hier habe ich die Antwort gefunden


Diese Antwort muss akzeptiert werden: D
Aaron John Sabu

30

Entfernen Sie das letzte Commit vor dem Push

git reset --soft HEAD~1

1bedeutet das letzte Festschreiben, wenn Sie zwei letzte Verwendungen entfernen möchten 2, und so weiter *


3
Hallo Karina, die Erwähnung --softist eine großartige Ergänzung zu den möglichen Antworten, aber kannst du auch erwähnen, warum? Es ist immer hilfreich, Ihre Lösung zu erklären. Versuchen Sie auch, bei Englisch zu bleiben. Vielen Dank
Vlastimil Ovčáčík

1
--soft- stellt sicher, dass Sie keine Änderungen in der Datei verlieren, deren Commit Sie rückgängig machen
möchten

19

Ich habe die gleiche Situation wie unten erlebt, da dies viel einfacher ist. Durch Übergeben können commit-IdSie zu dem bestimmten Commit gelangen, zu dem Sie gehen möchten:

git reset --hard {commit-id}

Wenn Sie Ihr letztes Commit entfernen möchten, müssen Sie die Stelle übergeben, an der commit-IdSie Ihren Zeiger bewegen müssen:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296

Nur eine Warnung für Neulinge wie mich - sichern Sie alle Dateien, in denen Sie die Änderungen behalten möchten, da sie auf die frühere Version zurückgesetzt werden. Mein Szenario war, dass ich versehentlich einen Datenbank-Dump in mein Repo-Verzeichnis gestellt und dann festgeschrieben habe - ich wollte diese Dateien offensichtlich nicht für das Repo festschreiben, aber ich wollte die Änderungen beibehalten, die ich an anderen Dateien vorgenommen hatte. Also musste ich die erforderlichen Änderungen aus dem Backup kopieren und einfügen, das ich vor dem Zurücksetzen des Git gemacht hatte.
user1063287

10

Das ist was ich mache:

Überprüfen Sie zuerst Ihre Filiale (für meine masterFallfiliale):

git checkout master

Setzen Sie dann auf Remote-HEAD ^ zurück ( alle lokalen Änderungen werden entfernt ), erzwingen Sie die Reinigung und ziehen Sie:

git reset HEAD^ --hard && git clean -df && git pull

1
Es ist eine sehr nukleare Option. Ich würde einen Soft-Reset auf ein begrenztes Commit vorschlagen.
c0der512

3

Eine Möglichkeit besteht darin, den lokalen Zweig zu löschen und diesen Zweig vom Server auszuchecken, wenn Ihr lokaler Zweig durch mehrere Commits vor dem Remote-Zweig liegt und Sie alle nicht mehr festschreiben müssen.


Geniale Antwort - es ermöglicht ein einfaches Klicken in den Quellbaum :)
Kamil Kiełczewski

1

Ich hatte nur das gleiche Problem und tat am Ende:

git rebase -i HEAD~N

(N ist die Anzahl der Commits, die Git Ihnen zeigt)

Dadurch wird Ihr Texteditor aufgefordert, und Sie können das gewünschte Commit entfernen, indem Sie die damit verbundene Zeile löschen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.