git: Commit mitten in der Eingabe der Nachricht abbrechen

131

Ich bin gerade dabei, mich zu verpflichten. Ich habe meine Commit-Nachricht in vim eingegeben. Ich erinnerte mich jetzt, dass ich etwas ändern musste. Mir ist klar, dass es andere Möglichkeiten gibt, um das zu erreichen, was ich will, aber ich möchte wissen, ob es eine Möglichkeit gibt, das Festschreiben abzubrechen, aber dennoch die Festschreibungsnachricht zu speichern, die ich bisher eingegeben habe.

Alexander Bird
quelle

Antworten:

85

Ja. Schreiben Sie die Commit-Nachricht in eine andere Datei ( :w /some/other/path.txt). Beenden Sie dann den Editor ohne Speichern ( :q!). Wenn Sie die Datei zuvor unter ihrem ursprünglichen Pfad gespeichert haben, löschen Sie alles und schreiben Sie zuerst die leere Datei (eine leere Festschreibungsnachricht bricht die Festschreibung ab).

Wenn Sie nun bereit sind, "for reals" festzuschreiben, verwenden Sie die Nachrichtendatei, die Sie unter dem alternativen Pfad gespeichert haben.

Kopieren Sie alternativ die Festschreibungsnachricht in einen der Puffer von vim.

Es ist erwähnenswert, dass Sie dies wirklich überhaupt nicht tun müssen : commit --amendSie können das Commit nach dem Erstellen ändern. Die einfache Lösung besteht darin, das Commit mit dem zu erstellen, was Sie haben, und es dann vor dem Push zu reparieren. Sie können das Commit sogar einfach in seinem fehlerhaften Zustand beenden reset HEAD~(setzt Sie auf den Zustand zurück, in dem sich Ihre Arbeitskopie vor dem Commit befand), Ihre Arbeitskopie reparieren und dann commit -a -c HEAD@{1}die alte Commit-Nachricht verwenden.

Borealid
quelle
7
Hinweis: Beenden von vim mit ": q!" Der Commit wird nicht abgebrochen, wenn eine automatisch ausgefüllte Zusammenführungskonfliktnachricht vorliegt. Stattdessen wird das Festschreiben fortgesetzt und in der Nachricht wird nicht aufgeführt, bei welchen Dateien Konflikte aufgetreten sind.
Stephenbez
write the empty file (an empty commit message will abort the commit)Teil funktionierte wie ein Zauber, danke!
22аша Давиденко
182

Wenn Ihr Editor mit einem Fehlercode beendet werden kann, bricht Git das Commit ab. Geben Sie bei Verwendung von VIM Folgendes ein

:cq

Beenden mit einem Fehlercode ungleich Null und Abbrechen des Commits.

Nimrodm
quelle
5
Dies ist ein guter Trick, um a abzubrechen, commit --amendda Sie sonst die vorhandene Commit-Nachricht und löschen müssten :wq.
Alex Jasmin
2
Guter Trick! Die Frage war jedoch, wie die Festschreibungsnachricht gespeichert und nicht gelöscht werden kann.
Elijah Lynn
Wie schafft es SVN, dies zu tun? Was sieht es außer dem Exit-Code aus?
Chaim Geretz
1
Großartig, wenn Sie eine interaktive Rebase durchführen, auch bekannt als Squashing Commits
hellatan
rettete mein Leben, als ich eine git commit --amendstatt git rebase --continuewährend der Rebase tat.
Weishi Zeng
68

Wenn Sie vim geöffnet haben, um Ihre Commit-Nachricht zu schreiben, löschen Sie einfach die Zeilen, die nicht mit # beginnen, und git bricht Ihr Commit ab

Aborting commit due to empty commit message.
Zetta
quelle
11
Dies ist besonders nützlich, wenn Sie ein Git Commit --amend abbrechen möchten.
Edsko
1
Die Frage war, wie das Festschreiben abgebrochen, aber die Festschreibungsnachricht gespeichert werden kann. Durch das Löschen von Zeilen, die nicht mit # beginnen, wird die Festschreibungsnachricht effektiv gelöscht und die Festschreibungsnachricht nicht gespeichert. Ich bin mir nicht sicher, wie viele Stimmen dies hat.
Elijah Lynn
2
ggdGschneidet den gesamten Inhalt der Nachricht ab. Beim nächsten Ausführen können vimSie nur Pden Text ausschneiden, den Sie zuvor ausgeschnitten haben.
Oromoiluig
funktioniert mit nano, Strg + k alle Zeilen, dann speichern und
beenden
9

Während Sie das Commit abbrechen können, besteht ein anderer Ansatz darin, das Commit anschließend zu ändern . Übernehmen Sie einfach Ihre aktuelle Arbeit, nehmen Sie die gewünschten zusätzlichen Änderungen vor und führen Sie git addsie aus git commit --amend. Sie werden wieder in den Commit-Nachrichten-Editor aufgenommen. Wenn Sie speichern, wird das Commit so geändert, dass es die zusätzlichen Änderungen und Ihre neue Commit-Nachricht enthält.

bdonlan
quelle
7

Ja es ist möglich. Zum Festschreiben MUSS Ihr Editor die Festschreibungsnachricht in die Datei schreiben .git/COMMIT_EDITMSGund mit einem 0-Statuscode beenden.

Wenn Sie also VI / VIM verwenden, möchten Sie möglicherweise Folgendes tun ...

  1. Schreiben Sie Ihre Commit-Nachricht.
  2. Speichern Sie die Commit-Nachricht mit :w(standardmäßig wird der aktuelle Inhalt in gespeichert .git/COMMIT_EDITMSG)
  3. Beenden Sie den Editor mit einem Fehler :cq
  4. ... tun, was Sie tun müssen ... sogar Dateien zum Staging-Bereich hinzufügen / entfernen.
  5. Fahren Sie mit der Bearbeitung Ihrer vorhandenen Festschreibungsnachricht mit fort git commit -eF .git/COMMIT_MESSAGE

Das -F /path/to/filefüllt den Editor mit einem bestimmten Inhalt aus / path / to / file. Standardmäßig wird das Commit jedoch sofort ausgeführt, es sei denn, Sie geben das -eFlag zusätzlich zur Bearbeitung an .

Rudolf Tucek
quelle
Dies funktioniert, ist jedoch weniger vorzuziehen, da 1) davon ausgegangen wird , dass sich im CWD der .git-Ordner befindet. 2) Ich verwende Git-Arbeitsbäume , und bei Git-Arbeitsbäumen ist .git tatsächlich eine Datei , die angibt, wo sich der echte .git-Ordner befindet.
Alexander Bird
@AlexanderBird das ist nicht wahr ... wenn Sie die alte Festschreibungsnachricht in Schritt 5 abrufen möchten, müssen Sie nur einen relativen Pfad angeben (sagen wir, Sie befinden sich im /foo/bar/Verzeichnis, relativ zum Projektstamm)git commit -eF ../../.git/COMMIT_MESSAGE
Rudolf Tucek
@AlexanderBird cool, habe noch nicht mit der Funktion von mehreren Arbeitsbäumen in Git bemerkt. Danke für den Hinweis! Ich glaube, der einzige Nachteil dabei ist, dass Sie einen allgemeinen Überblick im Kopf behalten müssen, der Sie daran hindert, sich auf den eigentlichen Code zu konzentrieren. Und nur um die Commit-Nachricht auf "Wo ich aufgehört habe" aufzunehmen, ist es ein bisschen schwer :)
Rudolf Tucek
1
@ AlexanderBird dann statt zu :wtun :sav committmpundgit commit -eF committmp
Hashbrown
0

Normalerweise mache ich meine Verpflichtungen innerhalb IntelliJder bereitgestellten Terminals. Leider sind meine Commits manuell:

git commit -m'my message' // etc

Das einzige, was ich für sicher halte, ist das Schließen des Terminalfensters! Markieren Sie einfach Ihren Text, wenn Sie ihn speichern möchten, kopieren Sie ihn und schließen Sie das Terminalfenster.

Sowjetisches Frontier
quelle
-2

Die Antwort von @bdonlan ist genau für diese Frage gut, aber ich werde auf eine Situation hinweisen, in der Sie möglicherweise eine bessere Lösung wünschen.

Angenommen, Sie möchten Änderungen zum letzten Commit hinzufügen. Sie tun also, was @bdolan vorgeschlagen hat:

git add files
git commit --amend

Stellen Sie sich vor, dass Sie beim Schreiben der neuen Nachricht das Hinzufügen dieser Dateien zu diesem Commit bedauern. Das Problem ist, dass Sie mit einer bereits gespeicherten Commit-Nachricht nicht weiterkommen. Wenn Sie den Editor verlassen (mit oder ohne Speichern), werden diese Änderungen zum letzten Commit hinzugefügt. Wenn Sie zu dem Punkt zurückkehren, an dem Sie sich vor diesen Aktionen befanden, müssen Sie das letzte Commit aufteilen. Ich wette, Sie möchten es vermeiden.

Der Trick besteht darin, den Editor zu speichern und zu beenden, während nur Zeilen beginnen, die mit #oder überhaupt nicht beginnen . Beim Beenden werden Sie mit der folgenden Nachricht begrüßt:

Aborting commit due to empty commit message.

Und Sie haben das letzte Commit überhaupt nicht geändert.

Doron Behar
quelle
Wenn ich verstehe, was Sie sagen, ist ein Problem, dann sind Sie falsch; wie hier gezeigt : git commit; vim ....; git commit --amend; git reset HEAD@{1}. Das heißt: Wenn ich den Änderungsantrag "rückgängig machen" möchte, muss ich das vorherige Commit nicht aufteilen. Das Commit-Objekt, das vor der Änderung HEAD war, wird als gespeichert HEAD@{1}. Außerdem hat zetta bereits vorgeschlagen, alle nicht kommentierten Zeilen zu löschen.
Alexander Bird