7648 Stimmen

Wie können bestehende, aber noch nicht gepushte Commit-Nachrichten geändert werden?

Ich habe im Commit-Nachricht das falsche geschrieben.

Wie kann ich die Nachricht ändern? Der Commit wurde noch nicht gepusht.

868 Stimmen

Für diejenigen, die noch neu in Git sind: Lauries Hinweis darauf, dass noch nicht gepusht wurde, ist wichtig. Wie beim Rebasieren ändert sich dadurch die Historie. Wenn jemand zwischen der originalen und der umgeschriebenen Historie von deinem Repository geklont/gezogen hat, wird er nach der Änderung nicht mehr in der Lage sein, zu ziehen (für diesen Branch).

267voto

sebers Punkte 2866

Wenn Sie eine alte Commit-Nachricht über mehrere Branches ändern müssen (d. h. der Commit mit der fehlerhaften Nachricht ist in mehreren Branches vorhanden), möchten Sie möglicherweise verwenden:

git filter-branch -f --msg-filter \
'sed "s///g"' -- --all

Git erstellt ein temporäres Verzeichnis zum Neuschreiben und erstellt zusätzlich Sicherungen alter Verweise in refs/original/.

  • -f erzwingt die Ausführung der Operation. Dies ist erforderlich, wenn das temporäre Verzeichnis bereits vorhanden ist oder wenn bereits Verweise unter refs/original gespeichert sind. Wenn das nicht der Fall ist, können Sie diese Flagge fallen lassen.

  • -- trennt filter-branch-Optionen von Revisions-Optionen.

  • --all stellt sicher, dass alle Branches und Tags neu geschrieben werden.

Aufgrund des Backups Ihrer alten Verweise können Sie leicht zum Zustand vor Ausführung des Befehls zurückkehren.

Sagen wir, Sie möchten Ihren Master wiederherstellen und darauf im Branch old_master zugreifen:

git checkout -b old_master refs/original/refs/heads/master

4 Stimmen

Diese Antwort bezieht sich nicht auf die Frage des Fragestellers, da es ihnen nur darum geht, einen Commit zu reparieren, den sie gerade erst gemacht haben. Ich benutze regelmäßig git commit --amend, um Kommentare zu korrigieren oder Dateien hinzuzufügen, die ich vergessen habe zu git add, aber immer nur *vor*dem Pushen mit git push. Ich benutze auch git filter-branch, wenn ich vollständig mit der Versionshistorie herumspielen möchte, aber der Fragesteller möchte das nicht, daher braucht diese Antwort eine große Warnung - bitte versucht das nicht zu Hause, Leute!!

262voto

Zaz Punkte 42583

Wenn es Ihr letzter Commit ist, ändern Sie einfach den Commit:

git commit --amend -o -m "Neue Commit-Nachricht"

(Verwenden Sie die -o (--only) Flagge, um sicherzustellen, dass Sie nur die Commit-Nachricht ändern)

Wenn es sich um einen vergrabenen Commit handelt, verwenden Sie das fantastische interaktive Rebase:

git rebase -i @~9   # Zeige die letzten 9 Commits in einem Texteditor

Finden Sie den Commit, den Sie möchten, ändern Sie pick in r (reword) und speichern und schließen Sie die Datei. Fertig!


Miniatur-Vim-Tutorial (oder, wie man mit nur 8 Tastenschlägen neu basiert <code>3j</code><code>cw</code>rEsc<code>ZZ</code>):

  • Führen Sie vimtutor aus, wenn Sie Zeit haben
  • <code>h</code><code>j</code><code>k</code><code>l</code> entsprechen den Bewegungstasten
  • Alle Befehle können mit einem "Bereich" versehen werden, z.B. <code>3j</code> bewegt sich drei Zeilen nach unten
  • <code>i</code> um den Einfügemodus zu betreten - der von Ihnen eingegebene Text erscheint in der Datei
  • Esc oder Strg<code>c</code> um den Einfügemodus zu verlassen und in den "normalen" Modus zurückzukehren
  • <code>u</code> zum Rückgängig machen
  • Strg<code>r</code> zum Wiederholen
  • <code>dd</code>, <code>dw</code>, <code>dl</code> um eine Zeile, ein Wort oder einen Buchstaben zu löschen
  • <code>cc</code>, <code>cw</code>, <code>cl</code> um eine Zeile, ein Wort oder einen Buchstaben zu ändern (das Gleiche wie <code>dd</code><code>i</code>)
  • <code>yy</code>, <code>yw</code>, <code>yl</code> um eine Zeile, ein Wort oder einen Buchstaben zu kopieren ("yank")
  • <code>p</code> oder <code>P</code> um nach dem aktuellen Standort einzufügen oder davor
  • <code>:w</code>Enter um eine Datei zu speichern (schreiben)
  • <code>:q!</code>Enter um ohne Speichern zu beenden
  • <code>:wq</code>Enter oder <code>ZZ</code> um zu speichern und zu beenden

Wenn Sie viel Text bearbeiten, wechseln Sie zur Dvorak-Tastaturbelegung, lernen Sie das Blindschreiben und lernen Sie Vim. Ist der Aufwand es wert? Ja.


ProTip™: Haben Sie keine Angst, mit "gefährlichen" Befehlen zu experimentieren, die die Historie neu schreiben* — Git löscht Ihre Commits standardmäßig nicht für 90 Tage; Sie finden sie im Reflog:

$ git reset @~3   # Gehen Sie drei Commits zurück
$ git reflog
c4f708b HEAD@{0}: reset: Bewegung zu @~3
2c52489 HEAD@{1}: commit: weitere Änderungen
4a5246d HEAD@{2}: commit: wichtige Änderungen vornehmen
e8571e4 HEAD@{3}: commit: einige Änderungen vornehmen
... frühere Commits ...
$ git reset 2c52489
... und Sie sind wieder am Ausgangspunkt

* _Passen Sie jedoch auf Optionen wie --hard und --force * _Außerdem, ändern Sie die Historie nicht von Branches, an denen Sie zusammenarbeiten.__

5 Stimmen

Der vim-Teil ist völlig off-topic, und anstatt die Benutzer dazu zu ermutigen, Zeit damit zu verbringen, zu lernen, wie man einen geheimnisvollen Editor verwendet, warum nicht etwas mehr zum Thema beibringen, wie man den standardmäßigen Git-Editor so einrichtet, dass er benutzerfreundlich ist, wie z.B. nano? Wir sprechen hier von trivialen Änderungen, die an einer Textdatei vorgenommen werden müssen, nicht von Hardcore-Coding, das einen Flächenkrieg über den "besten" Texteditor auslösen würde.

5 Stimmen

@DanDascalescu: Weil es schneller ist, Vim mithilfe der obigen Anweisungen zu lernen, als mehrere Rebasen mit nano durchzuführen. Der Grund, warum git einen Texteditor öffnet und nicht seine eigene Schnittstelle für das Rebasen bereitstellt, liegt darin, dass Vim existiert: Es ist leichtgewichtig, standardmäßig auf den meisten Systemen installiert und sehr einfach zu erlernen, um ein Rebase leicht durchführen zu können: z.B. ddjjpZZ verschiebt ein Commit um 2 nach unten. Es gibt nichts Geheimnisvolles an grundlegendem Vim-Wissen; es dauert 10min, um mit Vim vertrauter zu werden als mit nano.

5 Stimmen

Das -o-Flag ist genau das, wonach ich gesucht habe: Wie ändere ich die Commit-Nachricht ohne hinzugefügte Dateien zu berücksichtigen. Danke!

229voto

skin Punkte 2540

Verwenden

git commit --amend

Um es im Detail zu verstehen, ist ein ausgezeichneter Beitrag 4. Git-Geschichte umschreiben. Es spricht auch darüber, wann nicht git commit --amend zu verwenden.

2 Stimmen

Gibt es einen guten Weg, um Commit-Nachrichten zu korrigieren, die bereits in einem öffentlichen Repository gepusht wurden? Bisher bin ich zu dem Schluss gekommen, dass meine Tippfehler und Denkfehler in den Commit-Nachrichten, sobald sie gepusht wurden, für immer bestehen bleiben müssen.

2 Stimmen

In einem Wort, NEIN! Es gibt keinen GUTEN Weg, etwas zurückzuziehen, was Sie veröffentlicht haben. Alle Rücknahmen sind in einem größeren oder kleineren Maße SCHLECHT. Sie müssen die Disziplin annehmen, in einem eigenen privaten Repository in einem Zweig zu arbeiten, mehrere einzureichen, während Sie etwas hinzufügen, ein wenig testen, ein wenig optimieren. Dann fügen Sie Ihren gesamten Zweig in einen einzelnen Commit zusammen, schreiben Sie eine neue Commit-Nachricht, die die Gesamtänderung beschreibt, KORREKTURLESEN Sie es und drücken Sie es.

1 Stimmen

Nur um auf das Offensichtliche hinzuweisen, dass man nicht bei jedem Zurückkehren von einem Feature-Zweig einen einzigen Commit machen muss. Was viele Leute tun, ist ein Rebase auf den Zielzweig (um die Dinge sauber aussehen zu lassen) und dann zusammenführen mit der Option, das Fast-Forwarding zu unterdrücken. Stimme dem Hauptpunkt zu, vorsichtig zu sein, bevor du allerdings pushst.

201voto

wallerjake Punkte 3969

Ändern

Hier haben Sie ein paar Optionen. Sie können Folgendes tun

git commit --amend

solange es Ihr letzter Commit ist.

Interaktives Rebase

Ansonsten, wenn es nicht Ihr letzter Commit ist, können Sie ein interaktives Rebase durchführen,

git rebase -i [verzweigt_von] [Hash vor dem Commit]

Dann fügen Sie einfach im interaktiven Rebase edit zu diesem Commit hinzu. Wenn es erscheint, führen Sie ein git commit --amend durch und ändern Sie die Commit-Nachricht. Wenn Sie vor diesem Commit-Punkt zurückrollen möchten, könnten Sie auch git reflog verwenden und einfach diesen Commit löschen. Dann führen Sie einfach erneut ein git commit durch.

186voto

gulchrider Punkte 4255

Wenn Sie die Git-GUI verwenden, können Sie den letzten Commit, der noch nicht gepusht wurde, mit folgendem Befehl ändern:

Commit/Amend Last Commit

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