Wie ändere ich vorhandene, nicht gepusste Commit-Nachrichten?

7664

Ich habe das Falsche in eine Commit-Nachricht geschrieben.

Wie kann ich die Nachricht ändern? Das Commit wurde noch nicht verschoben.

Laurie Young
quelle
868
Für diejenigen, die etwas Neues zu tun haben: Lauries Argument, noch nicht gepusht zu haben, ist wichtig. Wie eine Neugründung verändert dies die Geschichte. Wenn jemand zwischen dem ursprünglichen und dem neu geschriebenen Verlauf aus Ihrem Repo geklont / gezogen hat, kann er nach dem Umschreiben (für diesen Zweig) nicht mehr ziehen.
Pat Notz

Antworten:

16130

Ändern der neuesten Festschreibungsnachricht

git commit --amend

öffnet Ihren Editor und ermöglicht es Ihnen, die Commit-Nachricht des letzten Commits zu ändern. Darüber hinaus können Sie die Festschreibungsnachricht direkt in der Befehlszeile festlegen mit:

git commit --amend -m "New commit message"

… Dies kann jedoch die Eingabe von mehrzeiligen Festschreibungsnachrichten oder kleinen Korrekturen erschweren.

Stellen Sie sicher, dass Sie keine Änderungen an Arbeitskopien vorgenommen haben , bevor Sie dies tun. Andernfalls werden sie auch festgeschrieben. ( Nicht bereitgestellte Änderungen werden nicht festgeschrieben.)

Ändern der Nachricht eines Commits, das Sie bereits an Ihren Remote-Zweig gesendet haben

Wenn Sie Ihr Commit bereits auf Ihren Remote-Zweig übertragen haben, müssen Sie nach dem lokalen Ändern Ihres Commits (wie oben beschrieben) auch das Push-Commit erzwingen mit:

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

Warnung: Durch Force-Push wird der Remote-Zweig mit dem Status Ihres lokalen Zweigs überschrieben . Wenn es Commits auf dem Remote - Zweig sind , dass Sie nicht in Ihrem lokalen Niederlassung haben, Sie werden diese Commits verlieren.

Warnung: Seien Sie vorsichtig bei der Änderung von Commits, die Sie bereits mit anderen Personen geteilt haben. Zur Änderung der Commits im Wesentlichen umschreibt sie anders haben SHA - IDs, die ein Problem darstellt , wenn andere Leute haben Kopien der alten verpflichten , dass Sie neu geschrieben haben. Jeder, der über eine Kopie des alten Commits verfügt, muss seine Arbeit mit Ihrem neu geschriebenen Commit synchronisieren, was manchmal schwierig sein kann. Stellen Sie daher sicher, dass Sie sich mit anderen koordinieren, wenn Sie versuchen, den Verlauf des gemeinsam genutzten Commits neu zu schreiben, oder vermeiden Sie es einfach, gemeinsam genutzte Commits neu zu schreiben insgesamt.


Führen Sie eine interaktive Rebase durch

Eine weitere Option ist die Verwendung der interaktiven Rebase. Auf diese Weise können Sie jede Nachricht bearbeiten, die Sie aktualisieren möchten, auch wenn es sich nicht um die neueste Nachricht handelt.

Gehen Sie folgendermaßen vor, um einen Git-Squash zu erstellen:

// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n

Sobald Sie Ihre Commits gequetscht haben, wählen Sie die e/rzum Bearbeiten der Nachricht:

Geben Sie hier die Bildbeschreibung ein

Wichtiger Hinweis zur interaktiven Rebase

Wenn Sie verwenden, git rebase -i HEAD~nkann es mehr als n Commits geben. Git "sammelt" alle Commits in den letzten n Commits, und wenn irgendwo zwischen diesem Bereich eine Zusammenführung stattgefunden hat, werden auch alle Commits angezeigt, sodass das Ergebnis n + ist.

Guter Tipp:

Wenn Sie dies für mehr als einen Zweig tun müssen und beim Ändern des Inhalts möglicherweise Konflikte auftreten, richten git rerereSie Git ein und lassen Sie diese Konflikte automatisch für Sie lösen.


Dokumentation

Benutzer456814
quelle
257
git commit --amendIst jedoch nicht so mächtig wie git rebase -i.
Jeffrey Jose
76
@ Jeffjose, das muss definitiv nicht sein. Außerdem git commit --amendkönnen die (a?) Meister reparieren begehen.
Strager
116
Wenn Sie bereits gedrückt haben, drücken Sie einfach erneut:git push -f origin branchname
Hughes
177
@hughes ist nicht git push -fein bisschen gefährlich, wenn andere Leute das gleiche Repository verwenden?
Armand
91
Wenn Sie nicht die gesamte Festschreibungsnachricht neu schreiben möchten, wählen Sie git commit --amend -c HEAD. Dadurch wird der Editor geöffnet, der mit Ihrer alten Festschreibungsnachricht gefüllt ist, sodass Sie sie ändern können.
Sam
2506
git commit --amend -m "your new message"
lfx_cool
quelle
7
Ich habe git commit --amend -m "Neue Nachricht", aber durch Drücken auf Github wurde "Zusammenführen der Remote-Änderungen vor dem erneuten Drücken" generiert. Nach dem Ziehen, Festschreiben - Ändern und erneuten Drücken wird die neue Nachricht nicht angezeigt. Stattdessen habe ich "Merge Branch 'Master' von github.com:[myrepo]"
Dave Everitt
8
@ DaveEveritt Sie haben höchstwahrscheinlich Ihr Commit in den Upstream verschoben, bevor Sie versucht haben, es zu beheben.
Thorbjørn Ravn Andersen
12
@ Kyralessa nicht wahr. In bash können Sie problemlos mehrzeilige Festschreibungsnachrichten verfassen, indem Sie das Anführungszeichen erst schließen, wenn Sie fertig sind (drücken Sie am Ende jeder Zeile innerhalb der Anführungszeichen die Eingabetaste).
Kochfelder
32
Ich verstehe nicht, wie eine Antwort, die nur der Hauptidee einer Antwort ähnelt, die vor zwei Jahren geschrieben wurde, und auch die akzeptierte Antwort so viele Stimmen bekommt. Seltsam. (nichts falsch mit der Antwort)
Happy Coder
7
@AmalMurali, gut. Mein Punkt war nicht so sehr die Popularität der Frage, noch die Nützlichkeit der Antwort. Diese spezielle Antwort ist jedoch weder die älteste noch bietet sie einen weiteren Einblick in die akzeptierte Antwort. Es scheint eine Kopie eines Abschnitts der akzeptierten Antwort zu sein. Das war mein Punkt. PROST!
Happy Coder
2376

Wenn das Commit, das Sie beheben möchten, nicht das aktuellste ist:

  1. git rebase --interactive $parent_of_flawed_commit

    Wenn Sie mehrere fehlerhafte Commits beheben möchten, übergeben Sie das übergeordnete Element des ältesten.

  2. Es erscheint ein Editor mit einer Liste aller Commits seit dem von Ihnen angegebenen.

    1. Wechseln Sie vor allen Commits, die Sie korrigieren möchten, pickzu reword(oder bei alten Versionen von Git zu edit).
    2. Nach dem Speichern spielt Git die aufgelisteten Commits erneut ab.

  3. Für jedes Commit, das Sie umformulieren möchten, werden Sie von Git wieder in Ihren Editor verschoben . Für jedes Commit, das Sie bearbeiten möchten , werden Sie von Git in die Shell eingefügt. Wenn Sie in der Shell sind:

    1. Ändern Sie das Commit nach Belieben.
    2. git commit --amend
    3. git rebase --continue

Der größte Teil dieser Sequenz wird Ihnen durch die Ausgabe der verschiedenen Befehle erklärt. Es ist sehr leicht; Sie müssen es sich nicht merken - denken git rebase --interactiveSie daran, dass Sie Commits korrigieren können, egal wie lange sie her sind.


Beachten Sie, dass Sie Commits, die Sie bereits gepusht haben, nicht ändern möchten. Oder vielleicht doch, aber in diesem Fall müssen Sie sehr vorsichtig sein, um mit allen zu kommunizieren, die möglicherweise Ihre Verpflichtungen eingegangen sind und darüber gearbeitet haben. Wie kann ich wiederherstellen / neu synchronisieren, nachdem jemand eine Rebase oder ein Reset in einen veröffentlichten Zweig verschoben hat?

Aristoteles Pagaltzis
quelle
39
Kann man die Nachricht des ersten Commits ändern (das kein Elternteil hat)?
13ren
27
Dies wird in einer der anderen Antworten erwähnt, aber ich werde es hier notieren. Seit Git 1.6.6 können Sie rewordanstelle von pickdie Protokollnachricht bearbeiten.
MitMaro
89
Ist übrigens $parent_of_flawed_commitgleichbedeutend mit $flawed_commit^.
Peeja
67
Tun Sie dies NIEMALS (oder generell neu), wenn Sie bereits vorgelagert haben!
Daniel Rinser
20
Verwenden Sie -p( --preserve-merges), wenn nach dem fehlerhaften Commit eine Zusammenführung stattgefunden hat.
Ahven
778

Um das vorherige Commit zu ändern, nehmen Sie die gewünschten Änderungen vor, führen Sie diese Änderungen durch und führen Sie sie aus

git commit --amend

Dadurch wird eine Datei in Ihrem Texteditor geöffnet, die Ihre neue Festschreibungsnachricht darstellt. Es beginnt mit dem Text aus Ihrer alten Festschreibungsnachricht. Ändern Sie die Festschreibungsnachricht wie gewünscht, speichern Sie die Datei und beenden Sie den Editor, um den Vorgang abzuschließen.

Führen Sie aus, um das vorherige Commit zu ändern und dieselbe Protokollnachricht beizubehalten

git commit --amend -C HEAD

Führen Sie aus, um das vorherige Commit durch vollständiges Entfernen zu beheben

git reset --hard HEAD^

Wenn Sie mehr als eine Festschreibungsnachricht bearbeiten möchten, führen Sie sie aus

git rebase -i HEAD~commit_count

(Ersetzen Sie commit_count durch die Anzahl der Commits, die Sie bearbeiten möchten.) Dieser Befehl startet Ihren Editor. Markieren Sie das erste Commit (das Sie ändern möchten) als "Bearbeiten" anstelle von "Auswählen", speichern Sie den Editor und beenden Sie ihn. Nehmen Sie die Änderung vor, die Sie festschreiben möchten, und führen Sie sie dann aus

git commit --amend
git rebase --continue

Hinweis: Sie können die gewünschte Änderung auch über den von geöffneten Editor vornehmen git commit --amend

Fatih Acet
quelle
18
git rebase -i HEAD~commit_countAußerdem können Sie die Festschreibungsnachrichten für beliebig viele Festschreibungen ändern. Markieren Sie einfach die ausgewählten Commits als "Reword" anstelle von "Pick".
Joe
2
Was ist, wenn Sie nicht neu gründen möchten? Sie möchten nur eine ältere Nachricht ändern?
SuperUberDuper
3
git reset --hardvernichtet nicht festgeschriebene Änderungen. Bitte ersetzen Sie --hardmit --soft.
Aal Gheez
1
Einverstanden, git reset --hardist ein absolut legitimer Befehl, aber angesichts der Frage irreführend. Sie verwenden, --hardwenn Sie Änderungen festgeschrieben haben, die Sie wegwerfen möchten, und nicht, wenn Sie in der Festschreibungsnachricht einen Tippfehler gemacht haben!
Soren Bjornstad
398

Wie bereits erwähnt, git commit --amendist dies der Weg, um das letzte Commit zu überschreiben. Ein Hinweis: Wenn Sie die Dateien auch überschreiben möchten, lautet der Befehl

git commit -a --amend -m "My new commit message"
John
quelle
4
Und wenn Sie nicht wollen , alles addieren, können Sie zunächst tun git add file.extdann nurgit commit --amend
MalcolmOcean
358

Sie können auch dafür verwenden git filter-branch.

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

Es ist nicht so einfach wie ein Trivial git commit --amend, aber es ist besonders nützlich, wenn Sie nach Ihrer fehlerhaften Festschreibungsnachricht bereits einige Zusammenführungen haben.

Beachten Sie, dass dies versucht, jedes Commit zwischen HEADund das fehlerhafte Commit neu zu schreiben , daher sollten Sie Ihren msg-filterBefehl mit Bedacht auswählen ;-)

Kennzeichen
quelle
4
Gibt es eine Version davon, die das Commit nicht ändert, wenn der reguläre Ausdruck nichts findet?
Sjakubowski
3
AFAIK filter-branch --msg-filter generiert auf jeden Fall neue Commits. Sie können jedoch innerhalb des Nachrichtenfilters überprüfen, ob die Sed erfolgreich war, und diese Informationen verwenden, wenn die Filterverzweigungsoperation endet, um Ihren Baum auf refs / original zurückzusetzen.
Mark
4
@DavidHogue Dies gilt nur bei Verwendung der Filter-Branch-Methode. Die Commit-IDs nach einem geänderten Commit ändern sich nicht, wenn Sie die interaktive Rebase verwenden.
Mark
6
@ Mark Ja, das tun sie, sie müssen. Commit-IDs hängen von vorherigen Commits ab. Wenn sie sich nicht ändern würden, wäre Git nutzlos.
Miles Rout
2
Du brauchst $flawed_commit^..HEADnicht $flawed_commit..HEAD. wie in der Manpage angegeben: « Der Befehl schreibt nur die in der Befehlszeile genannten positiven Verweise neu (z. B. wenn Sie a..b übergeben, wird nur b neu geschrieben). »
Ángel
319

Ich bevorzuge diesen Weg:

git commit --amend -c <commit ID>

Andernfalls erfolgt ein neues Commit mit einer neuen Commit-ID.

krevedko
quelle
7
Wenn Sie den obigen Befehl verwenden, wird für mich tatsächlich ein neues Commit mit einer neuen Commit-ID sowie einem zusätzlichen Commit mit der Aufschrift "Zweig zusammenführen" als Standard-Commit-Nachricht erstellt.
Jan
46
Durch das Ändern wird immer ein neues Commit mit einer neuen Commit-ID erstellt. Die Festschreibungs-ID ist der SHA-Hash des Inhalts der Festschreibung, einschließlich der Festschreibungsnachricht und der erstellten / festgeschriebenen Zeitstempel. Dies ist eine Funktion von Git, die, abgesehen von Hash-Kollisionen, sicherstellt, dass zwei Commits mit derselben ID genau dasselbe Commit mit genau demselben Inhalt, demselben Verlauf usw. sind.
Emil Lundberg
7
Stimme Emil zu. Lesen Sie außerdem die Dokumente - anscheinend teilt "-c" git lediglich mit, welche Commit-Nachricht als Standard / Vorlage für Ihr neues Commit verwendet werden soll. Eigentlich wird standardmäßig bereits "-c <Commit-ID>" ausgeführt , also keine Notwendigkeit, es anzugeben.
Gal
2
Das -cmacht ein paar Dinge. Standardmäßig wird die alte Nachricht verwendet, es werden jedoch auch Informationen zur Urheberschaft (Person und Zeit) kopiert. -Cmacht dasselbe, außer dass Sie nicht aufgefordert werden, die Nachricht zu bearbeiten.
Joseph K. Strauss
1
Wie bei @SantanuDey hat es bei mir nicht funktioniert. Ich habefatal: Option -m cannot be combined with -c/-C/-F/--fixup.
Andrew Grimm
312

Wenn Sie das Git-GUI-Tool verwenden, gibt es eine Schaltfläche mit dem Namen Letzte Festschreibung ändern . Klicken Sie auf diese Schaltfläche, um Ihre letzten Festschreibungsdateien und Nachrichten anzuzeigen. Bearbeiten Sie einfach diese Nachricht, und Sie können sie mit einer neuen Festschreibungsnachricht festschreiben.

Oder verwenden Sie diesen Befehl von einer Konsole / einem Terminal aus:

git commit -a --amend -m "My new commit message"
Akhilraj NS
quelle
4
Diese Antwort ist buchstäblich identisch mit dieser älteren . Haben Sie vorhandene Antworten überprüft, bevor Sie eine andere geliefert haben?
Dan Dascalescu
284

Sie können Git Rebasing verwenden . Wenn Sie beispielsweise zurück ändern möchten, um bbc643cd festzuschreiben, führen Sie aus

$ git rebase bbc643cd^ --interactive

Ändern Sie im Standardeditor "Auswählen" in "Bearbeiten" in der Zeile, deren Commit Sie ändern möchten. Nehmen Sie Ihre Änderungen vor und inszenieren Sie sie dann mit

$ git add <filepattern>

Jetzt können Sie verwenden

$ git commit --amend

um das Commit zu ändern, und danach

$ git rebase --continue

um zum vorherigen Head Commit zurückzukehren.

Shoaib Ud-Din
quelle
1
Wenn Sie sicherstellen möchten, dass Ihre Änderung von git commit --amendwirksam wurde, können Sie sie verwenden git showund die neue Nachricht wird angezeigt.
Steve Tauber
279
  1. Wenn Sie nur Ihre letzte Festschreibungsnachricht ändern möchten, gehen Sie wie folgt vor:

    git commit --amend
    

Dadurch werden Sie in Ihren Texteditor eingefügt und können die letzte Festschreibungsnachricht ändern.

  1. Wenn Sie die letzten drei Festschreibungsnachrichten oder eine der Festschreibungsnachrichten bis zu diesem Punkt ändern möchten, geben Sie HEAD~3den folgenden git rebase -iBefehl ein:

    git rebase -i HEAD~3
    
Heena Hussain
quelle
6
Diese frühere Antwort schon sagt , dass Sie verwenden können git commit --amend, und es sagt auch , dass Sie verwenden können git rebase -i HEAD~commit_count, alles , was Sie taten , war Plug in 3für commit_count.
Auch herabgestimmt. Die Leute machen sich einfach nicht die Mühe, vorhandene Antworten zu lesen .
Dan Dascalescu
261

Wenn Sie eine alte Festschreibungsnachricht über mehrere Zweige hinweg ändern müssen (dh das Festschreiben mit der fehlerhaften Nachricht ist in mehreren Zweigen vorhanden), möchten Sie möglicherweise Folgendes verwenden:

git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all

Git erstellt ein temporäres Verzeichnis zum Umschreiben und sichert zusätzlich alte Referenzen in refs/original/.

  • -ferzwingt die Ausführung der Operation. Dies ist erforderlich, wenn das temporäre Verzeichnis bereits vorhanden ist oder wenn bereits Referenzen unter gespeichert sind refs/original. Ist dies nicht der Fall, können Sie dieses Flag löschen.

  • -- trennt Filterverzweigungsoptionen von Revisionsoptionen.

  • --allstellt sicher, dass alle Zweige und Tags neu geschrieben werden.

Aufgrund der Sicherung Ihrer alten Referenzen können Sie problemlos zum Status zurückkehren, bevor Sie den Befehl ausführen.

Angenommen, Sie möchten Ihren Master wiederherstellen und im Zweig darauf zugreifen old_master:

git checkout -b old_master refs/original/refs/heads/master
sebers
quelle
3
Diese Antwort geht nicht auf die Frage des OP ein, da sie nur daran interessiert sind, ein Commit zu korrigieren, das sie gerade erst ausgeführt haben. Ich verwende regelmäßig git commit --amend, um Kommentare zu korrigieren oder Dateien hinzuzufügen, die ich vergessen habe git add, aber immer, bevor ich sie bearbeitet habe git push. Ich benutze es auch, git filter-branchwenn ich mich total mit dem Versionsverlauf anlegen möchte, aber das OP will das nicht, deshalb braucht diese Antwort eine große Gesundheitswarnung - versuche das nicht zu Hause, guck mal !!
Kbro
226

Verwenden

git commit --amend

Um es im Detail zu verstehen, ist ein ausgezeichneter Beitrag 4. Git History neu schreiben . Es wird auch darüber gesprochen, wann nicht verwendet werden soll git commit --amend .

Haut
quelle
2
Gibt es eine gute Möglichkeit, Commit-Nachrichten zu korrigieren, die bereits in ein öffentliches Repository übertragen wurden? Bisher bin ich zu dem Schluss gekommen, dass meine Commit-Message-Tippfehler und Thinkos für immer leben müssen, wenn sie einmal gedrückt wurden.
Stackunderflow
2
Mit einem Wort, NOPE! Es gibt keine gute Möglichkeit, etwas zurückzuziehen, das Sie gedrückt haben. Alle Retraktionen sind mehr oder weniger schlecht. Sie müssen die Disziplin der Arbeit in einer Zweigstelle in Ihrem eigenen privaten Repository übernehmen und mehrere Commits ausführen, während Sie ein bisschen hinzufügen, ein bisschen testen, ein bisschen optimieren. Führen Sie dann Ihren gesamten Zweig zu einem einzigen Commit zusammen, schreiben Sie eine neue Commit-Nachricht, die die Gesamtänderung beschreibt, PROOFREAD und drücken Sie.
Kbro
1
Nur um darauf hinzuweisen, dass man beim Zurückkehren von einem Feature-Zweig kein einziges Commit durchführen muss. Was viele Leute tun, ist, den Zielzweig neu zu gründen (damit die Dinge sauber aussehen) und dann mit der Option zusammenzuführen, den schnellen Vorlauf zu unterdrücken. Stimmen Sie dem Hauptpunkt zu, vorsichtig zu sein, bevor Sie nach oben drücken.
ShawnFumo
1
Die git commit --amendAntwort wurde bereits (mehrmals) gegeben, bevor Sie Ihre geschrieben haben. Warum hast du es wieder gepostet? Wenn Sie einen Link zu "Rewriting Git History" hinzufügen möchten, können Sie eine der vorhandenen Antworten bearbeiten oder einen Kommentar hinterlassen.
Dan Dascalescu
199

Ändern

Sie haben hier einige Möglichkeiten. Du kannst tun

git commit --amend

solange es dein letztes Commit ist.

Interaktive Rebase

Andernfalls können Sie eine interaktive Rebase durchführen, wenn dies nicht Ihr letztes Commit ist.

git rebase -i [branched_from] [hash before commit]

Dann fügen Sie innerhalb der interaktiven Rebase diesem Commit einfach eine Bearbeitung hinzu. Wenn es angezeigt wird, führen Sie eine git commit --amendund ändern Sie die Festschreibungsnachricht. Wenn Sie vor diesem Festschreibungspunkt ein Rollback durchführen möchten, können Sie dieses Festschreiben auch verwenden git reflogund einfach löschen. Dann machst du einfach git commitnochmal einen.

Wallerjake
quelle
191

Wenn es Ihr letztes Commit ist, ändern Sie einfach das Commit:

git commit --amend -o -m "New commit message"

(Verwenden Sie das Flag -o( --only), um sicherzustellen, dass Sie nur die Festschreibungsnachricht ändern.)


Wenn es sich um ein vergrabenes Commit handelt, verwenden Sie die fantastische interaktive Rebase :

git rebase -i @~9   # Show the last 9 commits in a text editor

Suchen Sie das gewünschte Commit, ändern Sie es pickin r( reword) und speichern und schließen Sie die Datei. Erledigt!



Miniatur-Vim-Tutorial (oder wie man mit nur 8 Tastenanschlägen neu basiert 3jcwrEscZZ):

  • Laufen vimtutorSie, wenn Sie Zeit haben
  • hjkl Bewegungstasten entsprechen
  • Allen Befehlen kann ein "Bereich" vorangestellt werden, z. B. 3jdrei Zeilen nach unten
  • i Um in den Einfügemodus zu gelangen, wird der von Ihnen eingegebene Text in der Datei angezeigt
  • Escoder Ctrlcum den Einfügemodus zu verlassen und zum "normalen" Modus zurückzukehren
  • u rückgängig machen
  • Ctrlr wiederholen
  • dd, dw, dlUm eine Linie, ein Wort oder Buchstaben zu löschen, bzw.
  • cc, cw, clUm eine Linie, ein Wort oder Buchstaben zu ändern, bzw. (gleich wie ddi)
  • yy, yw, ylZu kopieren ( „Ruck“) , um eine Linie, ein Wort oder Buchstaben bzw.
  • poder Pnach bzw. vor der aktuellen Position einfügen
  • :wEnter eine Datei speichern (schreiben)
  • :q!Enter ohne zu speichern zu beenden
  • :wqEnteroder ZZzu speichern und zu beenden

Wenn Sie häufig Text bearbeiten, wechseln Sie zum Dvorak-Tastaturlayout , lernen Sie das Tippen und lernen Sie Vim. Lohnt sich die Mühe? Ja.



ProTip ™: Haben Sie keine Angst, mit "gefährlichen" Befehlen zu experimentieren, die den Verlauf neu schreiben. * - Git löscht Ihre Commits standardmäßig 90 Tage lang nicht. Sie finden sie im Reflog:

$ git reset @~3   # Go back three commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

* Achten Sie auf Optionen wie --hardund --forceobwohl - sie können Daten verwerfen. * Schreiben Sie den Verlauf auch nicht in Zweigen neu, in denen Sie zusammenarbeiten.

Zaz
quelle
3
Der vim-Teil ist völlig themenunabhängig. Anstatt die Benutzer zu ermutigen, Zeit mit dem Erlernen eines arkanen Editors zu verbringen, sollten Sie ihnen etwas mehr über das Thema beibringen, z. B. wie Sie den Standard-Git-Editor so einrichten, dass er benutzerfreundlich ist nano? Wir sprechen von trivialen Änderungen, die an einer Textdatei vorgenommen werden müssen, nicht von Hardcore-Codierung, die einen Flammenkrieg um den "besten" Texteditor erzeugen würde.
Dan Dascalescu
1
@DanDascalescu: Weil es schneller ist, Vim anhand der obigen Anweisungen zu lernen, als mehrere Rebases mit Nano durchzuführen. Der ganze Grund, warum git einen Texteditor öffnet und keine eigene Schnittstelle für die Neubasierung, liegt darin, dass Vim vorhanden ist: Es ist leichtgewichtig, auf den meisten Systemen standardmäßig installiert und sehr einfach zu erlernen, um eine Neubasis problemlos durchzuführen: z. B. wird ddjjpZZein Commit 2 nach unten verschoben . Das grundlegende Vim-Wissen ist nichts Arkanes. Es dauert 10 Minuten, um sich mit Vim besser vertraut zu machen als mit Nano.
Zaz
185

Wenn Sie die Git-GUI verwenden, können Sie das letzte Commit ändern, mit dem nicht gepusht wurde:

Commit/Amend Last Commit
Gulchrider
quelle
168

Ich benutze die Git-GUI so oft ich kann, und das gibt dir die Möglichkeit, das letzte Commit zu ändern:

Kreuzen Sie dieses Kästchen an

Außerdem gibt git rebase -i origin/masteres ein nettes Mantra, das Ihnen immer die Commits präsentiert, die Sie zusätzlich zum Master ausgeführt haben, und Ihnen die Möglichkeit gibt, Änderungen vorzunehmen, zu löschen, neu zu ordnen oder zu quetschen. Sie müssen diesen Hash nicht zuerst in die Hand nehmen.

Havard Graff
quelle
4
Wie komme ich zu dem Bildschirm, den Sie in Ihrem Beispiel angezeigt haben?
Marwan
2
Es ist der untere rechte Teil der Windows Git Gui. Wählen Sie einfach den Schalter "Letztes Commit ändern" und es werden die neuesten Commit-Informationen angezeigt.
wbdarby
138

Wow, es gibt viele Möglichkeiten, dies zu tun.

Eine weitere Möglichkeit besteht darin, das letzte Commit zu löschen, die Änderungen jedoch beizubehalten, damit Sie Ihre Arbeit nicht verlieren. Sie können dann mit der korrigierten Nachricht ein weiteres Commit durchführen. Das würde ungefähr so ​​aussehen:

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

Ich mache das immer, wenn ich vergesse, eine Datei hinzuzufügen oder eine Änderung vorzunehmen.

Denken Sie daran, --softanstelle von anzugeben --hard, da Sie sonst das Commit vollständig verlieren.

Radu Murzea
quelle
5
Dies macht genau das Gleiche wie mit der git commit --amendAusnahme, dass es sich um einen zweistufigen Prozess handelt.
Joseph K. Strauss
3
@ JosephK.Strauss Ich glaube, dass durch die Änderung des Commits auch die ursprünglichen Informationen zu Autor und Datum des Commits beibehalten werden, wobei der neue Commiter und die Datumsinformationen separat angezeigt werden. Ich bin mir nicht sicher, ob dieser Ansatz das tut.
Everton
4
@EvertonAgner Du bist richtig. --amendbehält die Autoreninformationen bei, aber die Frage fragt nur, ob die Nachricht geändert werden soll.
Joseph K. Strauss
131

Für alle, die nach einer Windows / Mac-Benutzeroberfläche suchen, die beim Bearbeiten älterer Nachrichten (dh nicht nur der neuesten Nachricht) hilft , würde ich Sourcetree empfehlen . Die folgenden Schritte sind unten aufgeführt.

Sourcetree interaktive Rebase

Für Commits, die noch nicht auf eine Fernbedienung übertragen wurden:

  1. Stellen Sie sicher, dass Sie alle aktuellen Änderungen festgeschrieben oder gespeichert haben (dh, auf der Registerkarte "Dateistatus" sind keine Dateien aufgeführt). Andernfalls funktioniert dies nicht.
  2. Klicken Sie auf der Registerkarte "Protokoll / Verlauf" mit der rechten Maustaste auf den Eintrag mit einer angrenzenden Zeile in der Grafik unter den Commits, die Sie bearbeiten möchten, und wählen Sie "Kinder von <Commit Ref> interaktiv neu erstellen ..." aus.
  3. Wählen Sie die gesamte Zeile für eine Commit-Nachricht aus, die Sie ändern möchten (klicken Sie auf die Spalte "Nachricht") .
  4. Klicken Sie auf die Schaltfläche "Nachricht bearbeiten".
  5. Bearbeiten Sie die Nachricht wie gewünscht im daraufhin angezeigten Dialogfeld und klicken Sie dann auf OK.
  6. Wiederholen Sie die Schritte 3-4, wenn andere Festschreibungsnachrichten geändert werden müssen.
  7. Klicken Sie auf OK: Der Neustart beginnt. Wenn alles in Ordnung ist, endet die Ausgabe mit "Erfolgreich abgeschlossen". HINWEIS: Ich habe manchmal festgestellt, dass dies fehlschlägt, Unable to create 'project_path/.git/index.lock': File exists.wenn versucht wird, mehrere Festschreibungsnachrichten gleichzeitig zu ändern. Sie sind sich nicht sicher, um welches Problem es sich handelt oder ob es in einer zukünftigen Version von Sourcetree behoben wird. In diesem Fall wird jedoch empfohlen, sie einzeln neu zu starten (langsamer, aber zuverlässiger).

... oder ... für Commits, die bereits verschoben wurden:

Befolgen Sie die Schritte in dieser Antwort , die den obigen ähnlich sind, für die jedoch ein weiterer Befehl über die Befehlszeile ( git push origin <branch> -f) ausgeführt werden muss, um den Zweig zwangsweise zu drücken. Ich würde empfehlen, alles zu lesen und die notwendige Vorsicht walten zu lassen!

Steve Chambers
quelle
von allen Antworten - dies ist am besten für alle Git-Neulinge geeignet ^^^ (benutze ein kostenloses Programm SourceTree und wende "Rebase Kinder von" auf ein Commit vor demjenigen an, das du bearbeiten
möchtest
127

Wenn Sie nur das letzte Commit bearbeiten möchten, verwenden Sie:

git commit --amend

oder

git commit --amend -m 'one line message'

Wenn Sie jedoch mehrere Commits hintereinander bearbeiten möchten, sollten Sie stattdessen die Neubasierung verwenden:

git rebase -i <hash of one commit before the wrong commit>

Git Rebase Bearbeitung

Schreiben Sie in eine Datei wie die oben beschriebene edit/eoder eine der anderen Optionen und klicken Sie auf Speichern und beenden.

Jetzt sind Sie beim ersten falschen Commit. Nehmen Sie Änderungen an den Dateien vor, und diese werden automatisch für Sie bereitgestellt. Art

git commit --amend

Speichern und beenden Sie das und geben Sie ein

git rebase --continue

um zur nächsten Auswahl zu gelangen, bis alle Ihre Auswahlen abgeschlossen sind.

Beachten Sie, dass diese Dinge alle Ihre SHA-Hashes nach diesem bestimmten Commit ändern.

Shubham Chaudhary
quelle
2
git rebase -i <Hash eines Commits vor dem falschen Commit> funktioniert für mich. Vielen Dank.
Viraths
127

Wenn Sie nur Ihre letzte Nachricht ändern möchten, sollten Sie das --onlyFlag oder dessen Verknüpfung verwenden -omit commit --amend:

git commit --amend -o -m "New commit message"

Dies stellt sicher, dass Sie Ihr Commit nicht versehentlich durch inszenierte Inhalte verbessern. Natürlich ist es am besten, eine richtige $EDITORKonfiguration zu haben . Dann können Sie die -mOption weglassen, und Git füllt die Commit-Nachricht mit der alten vor. Auf diese Weise kann es leicht bearbeitet werden.

David Ongaro
quelle
1
Die "Top" -Antwort beantwortet die Frage nicht. Es gibt nur eine allgemeine Einführung zu git commit --amend. Die Frage war sehr spezifisch, daher länger! = Besser. Die entscheidende Erwähnung der -oFlagge würde wahrscheinlich im Rest der Informationen vergraben sein. Ich bin auch nicht zufrieden damit, eine Antwort zu bearbeiten, die bereits so viele Stimmen hat.
David Ongaro
2
Davon abgesehen können Sie die Top-Antwort bearbeiten, da die reale Gefahr besteht, dass die Leute diese als "richtige" Antwort verwenden. Es kann leicht passieren, dass Sie Ihr Commit mit inszenierten Dingen ändern - es ist mir passiert, und es ist wirklich ärgerlich, wenn Sie das vorantreiben. Die Menge ist jedoch keine Garantie für die Richtigkeit. Weder in der Anzahl der Antworten noch in der Anzahl der Stimmen.
David Ongaro
1
Ich würde nicht so weit gehen zu sagen, dass die Top-Antwort "falsch" ist und dass sie "die Frage nicht beantwortet". Es funktioniert definitiv und beantwortet die Frage. Sie müssen nur sicherstellen, dass Sie keine Änderungen vorgenommen haben, wenn Sie versuchen, Änderungen vorzunehmen. Aber ich verstehe Ihren Standpunkt, dass Sie die Leute davor warnen müssen. Ich werde es später bearbeiten, wenn ich Zeit habe.
1
Um fair zu sein: Obwohl die --onlyOption mit --amendseit Git 1.3.0 verfügbar ist, hat sie nicht richtig funktioniert, bis sie in 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ) behoben wurde . Die richtige Antwort im Jahr 2008 wäre also wahrscheinlich so gewesen : git stash; git commit --amend; git stash pop.
David Ongaro
103

Aktualisieren Sie Ihre letzte falsche Festschreibungsnachricht mit der neuen Festschreibungsnachricht in einer Zeile:

git commit --amend -m "your new commit message"

Oder versuchen Sie es mit einem Git-Reset wie folgt:

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message,
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# It will reset you last commit. Now, you
# can re-commit it with new commit message.

Verwenden von Reset zum Aufteilen von Commits in kleinere Commits

git reset kann Ihnen helfen, ein Commit auch in mehrere Commits aufzuteilen:

# Reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (You can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# Add and commit your files separately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

Hier haben Sie Ihr letztes Commit erfolgreich in zwei Commits aufgeteilt.

przbadu
quelle
3
Wenn Sie nur die Nachricht Ihres letzten Commits bearbeiten möchten, ist die Verwendung eines Soft-Reset zu diesem Zweck zu viel . Verwenden Sie einfach git commit --amend, genau wie es in der Antwort mit der höchsten Abstimmung steht . Funktioniert außerdem git reset --soft HEAD^identisch mit dem Soft-Reset in dieser früheren Antwort , da beide auf das erste übergeordnete Commit zurückgesetzt werden.
3
Ich mache mir nur die Mühe, git resetdie Lösung hinzuzufügen , um eine Idee zu geben, eine Commit-Nachricht in mehrere Commit-Nachrichten aufzuteilen. Weil ich mit diesem Problem konfrontiert war, als ich anfing, es zu benutzen git. Manchmal kann dies sehr hilfreich sein. :)
Przbadu
87

Auf diese Frage gibt es viele Antworten, aber keine erklärt ausführlich, wie ältere Commit-Nachrichten mit Vim geändert werden können . Ich war festgefahren, dies selbst zu tun, deshalb werde ich hier detailliert aufschreiben, wie ich dies speziell für Leute getan habe, die keine Erfahrung in Vim haben!

Ich wollte meine fünf letzten Commits ändern, die ich bereits auf den Server übertragen habe. Dies ist ziemlich "gefährlich", denn wenn jemand anderes bereits davon profitiert hat, können Sie die Dinge durcheinander bringen, indem Sie die Festschreibungsnachrichten ändern. Wenn Sie jedoch an Ihrem eigenen kleinen Zweig arbeiten und sicher sind, dass niemand daran gezogen hat, können Sie ihn folgendermaßen ändern:

Angenommen, Sie möchten Ihre fünf letzten Commits ändern und geben dies dann in das Terminal ein:

git rebase -i HEAD~5

* Wobei 5 die Anzahl der Festschreibungsnachrichten ist, die Sie ändern möchten (wenn Sie also die 10. bis zur letzten Festschreibung ändern möchten, geben Sie 10 ein).

Mit diesem Befehl gelangen Sie zu Vim. Dort können Sie Ihren Commit-Verlauf bearbeiten. Oben sehen Sie Ihre letzten fünf Commits wie folgt:

pick <commit hash> commit message

Stattdessen pickmusst du schreiben reword. Sie können dies in Vim tun, indem Sie eingeben i. Dadurch gelangen Sie in den Einfügemodus . (Sie sehen, dass Sie sich im Einfügemodus befinden, indem Sie das Wort INSERT unten verwenden.) Geben Sie für die Commits, die Sie ändern möchten, rewordanstelle von einpick .

Dann müssen Sie diesen Bildschirm speichern und beenden. Sie tun dies, indem Sie zuerst durch Drücken der EscTaste in den Befehlsmodus wechseln (Sie können überprüfen, ob Sie sich im Befehlsmodus befinden, wenn das Wort INSERT unten verschwunden ist). Dann können Sie einen Befehl durch Eingabe eingeben :. Der Befehl zum Speichern und Beenden lautet wq. Wenn Sie also eingeben, sind :wqSie auf dem richtigen Weg.

Dann geht Vim jede Commit-Nachricht durch, die Sie umformulieren möchten, und hier können Sie die Commit-Nachrichten tatsächlich ändern. Sie tun dies, indem Sie in den Einfügemodus wechseln, die Festschreibungsnachricht ändern, in den Befehlsmodus wechseln und speichern und beenden. Tun Sie dies fünf Mal und Sie sind aus Vim!

Wenn Sie Ihre falschen Commits bereits gepusht haben, müssen Sie git push --forcesie überschreiben. Denken Sie daran, dass dies git push --forceeine ziemlich gefährliche Sache ist. Stellen Sie also sicher, dass niemand vom Server gezogen wird, da Sie Ihre falschen Commits ausgeführt haben!

Jetzt haben Sie Ihre Commit-Nachrichten geändert!

(Wie Sie sehen, bin ich in Vim nicht so erfahren. Wenn ich also den falschen Jargon verwendet habe, um zu erklären, was passiert, können Sie mich gerne korrigieren!)

Marijn
quelle
4
<nitpick>Es gibt keine "Threads" zu Stack Overflow, da es sich nicht um ein Diskussionsforum handelt, sondern nur um "Fragen", "Antworten" und "Beiträge". </nitpick>. Außerdem sind nicht alle Versionen von Vim gleich. Mit nicht allen können Sie Zeichen im Einfügemodus löschen (macht in gewisser Weise Sinn, oder?). Wenn Sie immer in der Lage sein möchten, Zeichen in Vim zu löschen, Xund dies xtun wird (kleine Löschzeichen xvor dem Cursor Xwerden dahinter gelöscht). Wenn Sie Fehler machen, können Sie diese uwiederholt zum Rückgängigmachen verwenden. Schließlich rist Abkürzung für rewordim interaktiven Rebase-Editor.
1
Das Ändern eines Wortes in vim wird cwam Anfang eingegeben (obwohl die Frage nicht vim betrifft, stimme ich zu).
Jaroslaw Nikitenko
Sie müssen diesen Gräuel nicht verwenden . Sie können Ihren Git-Editor auf etwas Vernünftiges und Benutzerfreundliches nanoeinstellen , wie z. B. Midnight Commanders Mcedit.
Dan Dascalescu
79

Sie können git-rebase-reword verwenden

Es wurde entwickelt, um jedes Commit (nicht nur das letzte) auf die gleiche Weise zu bearbeiten wie commit --amend

$ git rebase-reword <commit-or-refname>

Es ist nach der Aktion auf Rebase Interactive benannt, um ein Commit zu ändern: "reword". Siehe diesen Beitrag und man- Abschnitt interaktiver Modus-

Beispiele:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^
Albfan
quelle
6
Dies erfordert die Installation eines externen Programms. Meiner Meinung nach ist es besser zu lernen, die integrierten Tools und Aliase effektiver zu nutzen. Ich würde g c; g rb -i @~9Folgendes eingeben : (Festschreiben und erneutes Basieren), das neue Festschreiben an die gewünschte Stelle verschieben, commitzu f( fixup) ändern und speichern. Wenn Sie etwas schneller als das wollten, könnten Sie alias git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
Zaz
79

Ich habe die Aliase hinzugefügt reciund recmdafür recommit (amend). Jetzt kann ich es machen mit git recmoder git recm -m:

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......
Chu-Siang Lai
quelle
57

Mir wurde klar, dass ich ein Commit mit einem Tippfehler verschoben hatte. Um rückgängig zu machen, habe ich Folgendes getan:

git commit --amend -m "T-1000, advanced prototype"
git push --force

Warnung: Wenn Sie Ihre Änderungen erzwingen, wird der Remote-Zweig mit Ihrem lokalen Zweig überschrieben. Stellen Sie sicher, dass Sie nichts überschreiben, was Sie behalten möchten. Seien Sie auch vorsichtig, wenn Sie ein geändertes (umgeschriebenes) Commit erzwingen, wenn jemand anderes den Zweig mit Ihnen teilt, da er seinen eigenen Verlauf neu schreiben muss, wenn er die alte Kopie des Commits hat, die Sie gerade umgeschrieben haben.

neoneye
quelle
7
Nichts wird jemals in Git "überschrieben". In diesem Fall wird der Verzweigungszeiger auf Ihr neues Commit gesetzt und das alte Commit wird veraltet, wenn keine Referenzen mehr vorhanden sind, und es wird möglicherweise nach einigen Wochen bereinigt. (Bis dahin können andere es noch finden und referenzieren, z. B. indem sie in das Reflog schauen.)
David Ongaro
51

Ich benutze gerne folgendes:

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <origin master>
  5. git push <origin master>
Kedar Adhikari
quelle
46

Wenn Sie den Code nicht in Ihren Remote-Zweig ( GitHub / Bitbucket ) übertragen haben, können Sie die Commit-Nachricht in der Befehlszeile wie folgt ändern.

 git commit --amend -m "Your new message"

Wenn Sie an einem bestimmten Zweig arbeiten, gehen Sie wie folgt vor:

git commit --amend -m "BRANCH-NAME: new message"

Wenn Sie den Code bereits mit der falschen Nachricht gepusht haben und beim Ändern der Nachricht vorsichtig sein müssen. Das heißt, nachdem Sie die Festschreibungsnachricht geändert und erneut versucht haben, Probleme zu verursachen, treten Probleme auf. Befolgen Sie diese Schritte, um den Vorgang zu vereinfachen.

Bitte lesen Sie meine gesamte Antwort, bevor Sie es tun.

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

Wichtiger Hinweis: Wenn Sie den Force Push direkt verwenden, können Codeprobleme auftreten, an denen andere Entwickler in demselben Zweig arbeiten. Um diese Konflikte zu vermeiden, müssen Sie den Code aus Ihrem Zweig ziehen, bevor Sie den Force-Push ausführen :

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

Dies ist die beste Vorgehensweise beim Ändern der Festschreibungsnachricht, wenn diese bereits übertragen wurde.

Prabhakar Undurthi
quelle