Ändern der Git-Commit-Nachricht nach dem Push (vorausgesetzt, niemand hat von der Fernbedienung gezogen)

982

Ich habe ein Git Commit und einen anschließenden Push gemacht. Ich möchte die Commit-Nachricht ändern. Wenn ich das richtig verstehe, ist dies nicht ratsam, da möglicherweise jemand aus dem Remote-Repository gezogen hat, bevor ich solche Änderungen vornehme. Was ist, wenn ich weiß, dass niemand gezogen hat?

Gibt es eine Möglichkeit, dies zu tun?

K_U
quelle
Was hast du versucht? Angenommen, Sie wissen, wie Sie die Commit-Nachricht bereits ändern und dann versuchen, sie zu pushen, wird Git Ihnen sagen, was Sie tun müssen, um dies zu erreichen.
Andrew Marshall
1
Siehe Antwort auf Frage "Wie bearbeite ich eine falsche Festschreibungsnachricht in git (ich habe gepusht)?" stackoverflow.com/a/457396/444639
Mike Rylander
4
Deklarieren - Google Frage von Git Commit Rang 1!
Manish Shrivastava
Wenn Sie das HEAD-Commit ändern und normalerweise (ohne --force) pushen, schlägt dies überraschenderweise nicht fehl. Die HEAD-Festschreibungsnachricht wird mit der geänderten Festschreibungs-ID aktualisiert. Dies bedeutet, dass andere Festschreibungs-IDs außer HEAD intakt bleiben. Ich habe dieses Verhalten mit der Version 2.8.1 von Git bemerkt.
Irsis

Antworten:

1374

Geschichte ändern

Wenn es sich um das letzte Commit handelt, können Sie dies einfach tun:

git commit --amend

Dadurch wird der Editor mit der letzten Festschreibungsnachricht aufgerufen und Sie können die Nachricht bearbeiten. (Sie können verwenden, -mwenn Sie die alte Nachricht löschen und eine neue verwenden möchten.)

Schieben

Und wenn Sie dann drücken, tun Sie Folgendes:

git push --force-with-lease <repository> <branch>

Oder Sie können "+" verwenden:

git push <repository> +<branch>

Oder Sie können verwenden --force:

git push --force <repository> <branch>

Seien Sie vorsichtig, wenn Sie diese Befehle verwenden.

  • Wenn jemand anderes Änderungen in denselben Zweig verschoben hat, möchten Sie wahrscheinlich vermeiden, diese Änderungen zu zerstören. Die --force-with-leaseOption ist die sicherste, da sie abgebrochen wird, wenn vorgelagerte Änderungen vorgenommen werden (

  • Wenn Sie den Zweig nicht explizit angeben, verwendet Git die Standard-Push-Einstellungen. Wenn Ihre Standard-Push-Einstellung "Matching" ist, können Sie Änderungen an mehreren Zweigen gleichzeitig zerstören.

Danach ziehen / holen

Jeder, der bereits gezogen hat, erhält jetzt eine Fehlermeldung und muss diese aktualisieren (vorausgesetzt, er nimmt selbst keine Änderungen vor), indem er Folgendes tut:

git fetch origin
git reset --hard origin/master # Loses local commits

Seien Sie vorsichtig bei der Verwendung reset --hard. Wenn Sie Änderungen am Zweig haben, werden diese Änderungen zerstört.

Ein Hinweis zum Ändern des Verlaufs

Die zerstörten Daten sind eigentlich nur die alte Festschreibungsnachricht, --forcewissen das aber nicht und löschen auch gerne andere Daten. Stellen Sie sich also vor --force: "Ich möchte Daten zerstören und weiß genau, welche Daten zerstört werden." Wenn die zerstörten Daten festgeschrieben werden, können Sie häufig alte Festschreibungen aus dem Reflog wiederherstellen. Die Daten werden tatsächlich verwaist anstatt zerstört (obwohl verwaiste Festschreibungen regelmäßig gelöscht werden).

Wenn Sie nicht glauben, dass Sie Daten zerstören, halten Sie sich fern von --force... schlimmen Dingen können passieren .

Deshalb --force-with-leaseist es etwas sicherer.

Dietrich Epp
quelle
13
Seien Sie vorsichtig mit diesem "Fix", als ob sie lokale, nicht gepuschte Commits haben, die "verloren" gehen ( verloren, was wirklich verwaist bedeutet , aber die Wiederherstellung ist nicht offensichtlich).
Andrew Marshall
1
Sie möchten wahrscheinlich den Zweigstellennamen angeben, wenn Sie --force drücken, andernfalls können Sie mehr als erwartet pushen.
user693960
1
@ user693960: Git pusht nur das, was Sie konfigurieren.
Dietrich Epp
10
Einfach git push --forceohne die Optionen <Repository> und <branch> funktioniert es auch, wenn Sie Ihren Upstream eingerichtet haben.
Ahnbizcad
2
Können Sie ein Beispiel geben <repository>? Ist es origin? org/repo? Oder einfach nur repo?
MikeSchinkel
440

Sag nur :

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

und dann

git push --force
Manish Shrivastava
quelle
8
In meinem Fall git push origin <BRANCH-NAME>hat nicht funktioniert, ich musste git push --forcewie in der akzeptierten Antwort erklärt verwenden.
Gabriel
1
das funktioniert bei mir nicht Ich muss uns git push --force, sonst geht der Schub nicht durch.
Ahnbizcad
4
@ahnbizcad, es sollte funktionieren. Stellen Sie einfach sicher, dass der Filialname korrekt ist.
William
3
Ich freue mich über die Einfachheit Ihrer Erklärung! Ich benutze es mehr als oft
Vasikos
3
Ich habe diesen Befehl erst erfolgreich angewendet, nachdem ich meinen Zweig vorübergehend "ungeschützt" hatte, was bei meinem von GitLab gehosteten Projekt der Fall war. Wenn Sie dieses Problem haben, bevor Sie diese Befehle anwenden, lesen Sie bitte diesen stackoverflow.com/a/32267118/1423345, um den Schutz des Zweigs aufzuheben , und Sie können ihn nach dem Ändern der Festschreibungsnachricht erneut "schützen" :)
John
262

So bearbeiten Sie ein anderes Commit als das letzte:

Schritt 1 : git rebase -i HEAD~nInteraktive Rebase für die letzten nbetroffenen Commits durchführen. (dh wenn Sie eine Commit-Nachricht ändern möchten, 3 Commits zurück, tun Sie dies git rebase -i HEAD~3)

git öffnet einen Editor, um diese Commits zu verarbeiten. Beachten Sie diesen Befehl:

#  r, reword = use commit, but edit the commit message

genau das brauchen wir!

Schritt 2 : Wechseln Sie pickzu rfür die Commits, für die Sie die Nachricht aktualisieren möchten. Ändern Sie die Commit-Nachricht hier nicht, sie wird ignoriert. Das machen Sie im nächsten Schritt. Speichern und schließen Sie den Editor.

Beachten Sie, dass Sie Folgendes ausführen müssen, wenn Sie Ihren Rebase-Plan bearbeiten, der Vorgang jedoch nicht umbenannt werden kann:

git rebase --continue

Wenn Sie den für die interaktive Sitzung verwendeten Texteditor ändern möchten (z. B. vom Standard-vi in ​​nano), führen Sie Folgendes aus:

GIT_EDITOR=nano git rebase -i HEAD~n

Schritt 3 : Git öffnet für jede zuvor eingeführte Revision einen weiteren Editor r. Aktualisieren Sie die Commit-Nachricht nach Ihren Wünschen, speichern Sie den Editor und schließen Sie ihn.

Schritt 4 : Nachdem alle Commits aktualisiert wurden, werden die Nachrichten aktualisiert. Möglicherweise möchten Sie git push -fdie Fernbedienung aktualisieren.

Jinsong Li
quelle
21
Diese Antwort sollte akzeptiert werden, da sie im Gegensatz zur akzeptierten Antwort die Möglichkeit bietet, andere Commits als das letzte Commit zu ändern. Du hast meinen Tag gerettet. Vielen Dank!
xZero
1
Wählen Sie n = 3 für die letzten 3 Commits:git rebase -i HEAD~3
HeikoS
Wenn Sie Ihren Rebase-Plan noch nicht bearbeitet haben, können Sie die Dateien nicht umbenennen und ausführen git rebase --continue. Wenn Sie den für die interaktive Sitzung verwendeten Texteditor ändern möchten (z. B. von der Standardeinstellung viauf nano), führen Sie ihn aus GIT_EDITOR=nano git rebase -i HEAD~n.
Jamie Birch
Ich habe dies bearbeitet, um ein wenig mehr Informationen hinzuzufügen. Bitte werfen Sie einen Blick darauf. Dies war die Antwort auf das, was ich tun wollte, aber ich habe daran gescrollt, weil es keinen Header hatte.
Kip
Ich habe eine vorgeschlagene Änderung vorgenommen, um den nützlichen Kommentar von @JamieBirch in die Antwort aufzunehmen. Vielleicht möchten Sie ihn überprüfen.
Notts90 unterstützt Monica
44

Verwenden Sie diese beiden Schritte in der Konsole:

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

und dann

git push -f

Erledigt :)

Abdul Rizwan
quelle
Thx, Sind das nur Schritte zum Ändern des letzten Kommentars oder können sie auch für ältere Kommentare verwendet werden?
Jay
@ Jay Entschuldigung für die verspätete Antwort, diese Schritte nur zum Ändern der letzten Commit-Nachricht.
Abdul Rizwan
19

Es sollte beachtet werden, dass, wenn Sie push --forcemit mehreren Refs verwenden, diese ALLE als Ergebnis geändert werden. Achten Sie darauf, wohin Ihr Git-Repo für den Push konfiguriert ist. Glücklicherweise gibt es eine Möglichkeit, den Prozess geringfügig zu schützen, indem ein einzelner zu aktualisierender Zweig angegeben wird. Lesen Sie von den Git Manpages:

Beachten Sie, dass --force für alle Refs gilt, die gepusht werden. Daher wird es verwendet, wenn push.default auf übereinstimmend eingestellt ist oder wenn mehrere Push-Ziele mit remote konfiguriert sind. *. Push überschreibt möglicherweise andere Refs als den aktuellen Zweig (einschließlich lokaler Refs) streng hinter ihrem entfernten Gegenstück). Um einen Push auf nur einen Zweig zu erzwingen, verwenden Sie ein + vor der Referenzspezifikation, um zu drücken (z. B. Git Push Origin + Master, um einen Push auf den Master-Zweig zu erzwingen).

Steve Benner
quelle
3
Sehr wichtiger Hinweis.
Peterh - Wiedereinsetzung Monica
Keine der Force-Antworten funktioniert für mich, da ich keine ForcePush-Berechtigungen auf dem Server habe. Stattdessen möchte ich ein Commit ausführen, das eine vorherige Commit-Nachricht ändert. Ich könnte "Commit-Nachricht geändert" in den Kommentarbereich dieses Commits schreiben.
Nurettin
11

Wenn Sie eine ältere ändern möchten commit, nicht der letzte, müssen Sie Verwendung rebaseBefehl wie hier erklärt, Github Hilfeseite , auf der Berichtigungs begehen die Nachricht von älteren oder mehrere Nachrichten Abschnitt

Carlos
quelle
11

Befehl 1 .

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

Dann,

Befehl 2 .

git push origin --force
Teo Choong Ping
quelle
8
git commit --amend

Bearbeiten und ändern Sie dann die Nachricht im aktuellen Fenster. Danach tun

git push --force-with-lease
Beu
quelle
2

Eine andere Möglichkeit besteht darin, ein zusätzliches "Errata-Commit" (und Push) zu erstellen, das auf das Commit-Objekt verweist, das den Fehler enthält. Das neue Errata-Commit liefert auch die Korrektur. Ein Errata-Commit ist ein Commit ohne wesentliche Codeänderungen, aber eine wichtige Commit-Nachricht. Fügen Sie beispielsweise Ihrer Readme-Datei ein Leerzeichen hinzu und schreiben Sie diese Änderung mit der wichtigen Commit-Nachricht fest, oder verwenden Sie die Option git --allow-empty. Es ist sicherlich einfacher und sicherer als das erneute Basieren, es ändert nicht den wahren Verlauf und es hält den Zweigbaum sauber (mitamendist auch eine gute Wahl, wenn Sie das letzte Commit korrigieren, aber ein Errata-Commit kann eine gute Wahl für ältere Commits sein. So etwas passiert so selten, dass es gut genug ist, den Fehler einfach zu dokumentieren. Wenn Sie in Zukunft ein Git-Protokoll nach einem Feature-Keyword durchsuchen müssen, wird das ursprüngliche (fehlerhafte) Commit möglicherweise nicht angezeigt, da in diesem ursprünglichen Commit das falsche Keyword verwendet wurde (der ursprüngliche Tippfehler). Das Keyword wird jedoch angezeigt in der Errata-Festschreibung, die Sie dann auf die ursprüngliche Festschreibung mit dem Tippfehler verweist. Hier ist ein Beispiel:

$ git log
Commit 0c28141c68adae276840f17ccd4766542c33cf1d
Autor: First Last 
Datum: Mi Aug 8 15:55:52 2018 -0600

    Errata Commit:
    Dieses Commit hat keine wesentliche Codeänderung.
    Diese Festschreibung wird nur bereitgestellt, um eine Korrektur einer vorherigen Festschreibungsnachricht zu dokumentieren.
    Dies betrifft das Festschreibungsobjekt e083a7abd8deb5776cb304fa13731a4182a24be1
    Ursprüngliche falsche Festschreibungsnachricht:
        Die Hintergrundfarbe wurde in Rot geändert
    Korrektur (* Änderung hervorgehoben *):
        Die Hintergrundfarbe wurde in * blau * geändert.

Commit 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Autor: First Last 
Datum: Mi Aug 8 15:43:16 2018 -0600

    Eine vorläufige Festschreibungsnachricht

Commit e083a7abd8deb5776cb304fa13731a4182a24be1
Autor: First Last 
Datum: Mi Aug 8 13:31:32 2018 -0600

    Die Hintergrundfarbe wurde in Rot geändert
rob_7cc
quelle
Rob, das sieht vielversprechend aus. Können Sie die Befehle anzeigen, die für ein "Errata Commit" erforderlich sind? Nur dieser Beitrag wird in Google zu diesen Bedingungen angezeigt.
Jim
1
Ein „Errata-Commit“ ist einfach ein normales Commit mit einer Nachricht, die auf das vorherige fehlerhafte Commit verweist und den vorherigen Fehler dokumentiert und korrigiert. git commit -m “fixed feature A”(Nehmen wir an, git gibt diesem eine Commit-ID von e3ab7312 ... ... (später stellen Sie fest, dass Ihre Nachricht falsch war. Nehmen Sie nun eine unwichtige Änderung an einer Datei vor, z. B. das Hinzufügen eines Leerzeichens zur Readme-Datei, oder verwenden Sie die —allow-emptyOption git.) .. git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’'' '
rob_7cc
1
... Wenn Sie später im Git-Protokoll nach Verweisen auf "Feature B" suchen müssen, wird das Errata-Commit angezeigt. Die Errata-Commit-Nachricht enthält jedoch einen Verweis auf die ursprüngliche Commit-ID, die eine vollständige Rückverfolgbarkeit bietet. Übrigens ist der Begriff "Errata Commit" nichts Besonderes (es gibt weder einen "Errata" -Befehl noch eine Option in Git) ... es ist nur meine Terminologie für ein normales Commit, die eine Korrektur für ein vorheriges Commit liefert, das einen Fehler / Tippfehler hatte.
rob_7cc
Rob, das hat super funktioniert. Ich konnte mithilfe des SHA ein neues leeres Commit mit der korrekten Beschreibung hinzufügen, die auf das ursprüngliche Commit verweist. Jetzt werden beide in meiner 'Git-Kette' für die Module angezeigt. Vielen Dank!
Jim
Ich bin froh, dass das für dich funktioniert hat. Ich verwende dieselbe Technik, um Fehler in Festschreibungsnachrichten zu korrigieren. Als Alternative habe ich erst kürzlich entdeckt, dass git notes dies dem gleichen Zweck dienen würde wie ein "Errata Commit". Fügen Sie einfach eine Notiz zu einem vorherigen Commit hinzu, um Fehler in der Commit-Nachricht zu kommentieren oder zu korrigieren: https://git-scm.com/docs/git-notes
rob_7cc
0

Das funktioniert bei mir ganz gut,

git checkout origin / branchname

Wenn Sie bereits in der Filiale sind, ist es besser, Pull oder Rebase durchzuführen

git pull

oder

git -c core.quotepath=false fetch origin --progress --prune

Später können Sie einfach verwenden

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

oder wenn Sie den Texteditor öffnen möchten, verwenden Sie

git commit --amend

Ich werde es vorziehen, einen Texteditor zu verwenden, wenn Sie viele Kommentare haben. Sie können Ihren bevorzugten Texteditor mit Befehl einstellen

git config --global core.editor your_preffered_editor_here

Wenn Sie mit dem Ändern der Festschreibungsnachricht fertig sind, speichern Sie sie und beenden Sie sie

und dann laufen

git push --force

Und du bist fertig

Hasasn
quelle
0

Zusätzliche Informationen für dasselbe Problem, wenn Sie eine Bitbucket-Pipeline verwenden

Bearbeiten Sie Ihre Nachricht

git commit --amend

auf den Server drücken

git push --force <repository> <branch>

Fügen Sie dann --force zu Ihrem Push-Befehl in der Pipeline hinzu

git ftp push --force

Dadurch werden Ihre vorherigen Commits gelöscht und Ihre aktuellen Commits verschoben.

Entfernen Sie die --force nach dem ersten Druck

Ich habe es mit der Bitbucket-Pipeline versucht und es funktioniert einwandfrei

Abdallah Awwad Alkhwaldah
quelle