So brechen Sie ein lokales Git-Commit ab


744

Mein Problem ist, dass ich eine Datei geändert habe, z. B.: README, eine neue Zeile ' this für meine Testzeile ' hinzugefügt und die Datei gespeichert habe. Dann habe ich die folgenden Befehle ausgegeben

 git status

 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #  modified:   README
 #
 no changes added to commit (use "git add" and/or "git commit -a")


 git add README

 git commit -a -m 'To add new line to readme'

Ich habe den Code nicht an github gesendet. Jetzt möchte ich dieses Commit abbrechen.

Dafür habe ich verwendet

   git reset --hard HEAD~1

Aber ich habe die neu hinzugefügte Zeile " Dies für meine Testzeile " aus der README-Datei verloren. Dies sollte nicht passieren. Ich brauche den Inhalt, um da zu sein. Gibt es eine Möglichkeit, den Inhalt beizubehalten und mein lokales Commit abzubrechen?


3
Es hört sich so an, als würden Sie definitiv nicht danach fragen git revert, wodurch ein neues Commit mit dem umgekehrten Unterschied des zurückgesetzten Commits erstellt wird. Durch das Zurücksetzen wird Ihr aktueller Zweig einfach auf ein anderes Commit verwiesen, in diesem Fall auf das vor dem Commit, das Sie "vergessen" möchten.
Cascabel

1
NB: Könnte erwähnenswert sein, dass der git-commitVorgang abgebrochen werden kann, wenn Sie die Nachricht leer lassen. Wenn Sie das Commit also noch nicht abgeschlossen haben, kann dies hilfreich sein.
GKFX

Antworten:


1421

Verwenden Sie einfach git resetohne die --hardFlagge:

git reset HEAD~1

PS: Auf Unix-basierten Systemen können Sie verwenden, HEAD^was gleich ist HEAD~1. Unter Windows HEAD^funktioniert dies nicht, da ^eine Leitungsfortsetzung signalisiert wird. Ihre Eingabeaufforderung fragt Sie also einfach More?.


13
Dies wird übrigens --mixed im Handbuch genannt .
Josh Lee

10
Neuere Versionen von Git erlauben sogar @^als Abkürzung für HEAD^.
Koraktor

Ich weiß nicht, was das getan hat, aber viele Dateien erschienen auf meiner Änderungsliste, Dateien, die ich nicht berührt habe
FRR

@feresr Wenn Sie diese Dateien beim letzten Festschreiben oder im Arbeitsbaum wirklich nicht berührt haben, wird dies durch andere Inkonsistenzen in Ihrem Arbeitsbaum verursacht, z. B. unter Windows, und die Dateienden stimmen nicht überein.
Koraktor

1
Ist es möglich, alle Commits einerseits zurückzusetzen?
Webwoman

185

Verwenden Sie --softanstelle der --hardFlagge:

git reset --soft HEAD^

18
Können Sie den Unterschied zwischen den beiden Flags erklären?
John Giotta

1
Wenn Sie die Package Manager-Konsole öffnen und dieses "git reset --soft HEAD ^" ausführen, wird das getan, was Sie wollen (und was ich brauchte).
David Cornelson

54
@ JohnGiotta - git reset --soft HEAD^entfernt das letzte lokale (nicht gedrückte) Commit, behält aber die Änderungen bei, die Sie vorgenommen haben
fider

@ fider Retter! Ich bin mir nicht sicher, ob die akzeptierte Antwort noch funktioniert, aber dies sollte die genaue Antwort sein, die das OP benötigt.
Babu

git reset --soft HEAD~unter Windows
Jack0fshad0ws

34

Wenn Sie sich mitten in einem Commit befinden (dh bereits in Ihrem Editor), können Sie es abbrechen, indem Sie alle Zeilen über dem ersten löschen #. Dadurch wird das Commit abgebrochen.

Sie können also alle Zeilen löschen, sodass die Festschreibungsnachricht leer ist, und dann die Datei speichern:

Es sollte so aussehen.

Sie erhalten dann eine Nachricht mit der Aufschrift Aborting commit due to empty commit message..

BEARBEITEN :

Sie können auch alle Zeilen löschen und das Ergebnis ist genau das gleiche.

Um alle Zeilen in vim zu löschen (wenn dies Ihr Standardeditor ist), geben Sie im Editor Folgendes ein gg, um zur ersten Zeile zu gelangen, und dGlöschen Sie dann alle Zeilen. Zum Schluss schreiben und beenden Sie die Datei mit wqund Ihr Commit wird abgebrochen.


3
Das ist genau das, was ich gesucht habe! Diese Antwort braucht mehr Upvotes :)
JDunk

FYI, das funktioniert auch , wenn Sie ein abzubrechen versuchenrebase -i mybranchname
inostia

18

Als Erstes sollten Sie festlegen, ob Sie die lokalen Änderungen beibehalten möchten, bevor Sie die Festschreibungsnachricht löschen.

Verwenden Sie git logdiese Option , um aktuelle Festschreibungsnachrichten anzuzeigen, und suchen Sie dann commit_id vor dem Festschreiben, das Sie löschen möchten, und nicht vor dem Festschreiben, das Sie löschen möchten.

Wenn Sie die lokal geänderten Dateien behalten und einfach die Commit-Nachricht löschen möchten:

git reset --soft commit_id

Wenn Sie alle lokal geänderten Dateien und die Festschreibungsnachricht löschen möchten:

git reset --hard commit_id

Das ist der Unterschied zwischen weich und hart


1
Ich denke es ist das Gegenteil.
Ruff9

9

Sie können Git mithilfe eines der folgenden Parameter mitteilen, was mit Ihrem Index (eine Reihe von Dateien, die zum nächsten Commit werden sollen) und Ihrem Arbeitsverzeichnis zu tun ist, wenn Sie das Zurücksetzen von Git durchführen:

--soft: Nur Commits werden zurückgesetzt, während Index und Arbeitsverzeichnis nicht geändert werden.

--mixed: Dadurch wird der Index auf den HEAD zurückgesetzt, während das Arbeitsverzeichnis nicht berührt wird. Alle Änderungen bleiben im Arbeitsverzeichnis und werden als geändert angezeigt.

--hard: Es setzt alles (Commits, Index, Arbeitsverzeichnis) zurück, um mit dem HEAD übereinzustimmen.

In Ihrem Fall würde ich git reset --softIhre geänderten Änderungen im Index und im Arbeitsverzeichnis behalten. Lesen Sie dies für eine detailliertere Erklärung.


1

Verwenden Sie den folgenden Befehl:

$ git reset HEAD~1

Danach können Sie auch Dateien anzeigen, die wie unten beschrieben zurückgesetzt werden.

Unstaged changes after reset:
M   application/config/config.php
M   application/config/database.php
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.