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?
Antworten:
Geschichte ändern
Wenn es sich um das letzte Commit handelt, können Sie dies einfach tun:
Dadurch wird der Editor mit der letzten Festschreibungsnachricht aufgerufen und Sie können die Nachricht bearbeiten. (Sie können verwenden,
-m
wenn Sie die alte Nachricht löschen und eine neue verwenden möchten.)Schieben
Und wenn Sie dann drücken, tun Sie Folgendes:
Oder Sie können "+" verwenden:
Oder Sie können verwenden
--force
: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-lease
Option 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:
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,
--force
wissen 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-lease
ist es etwas sicherer.quelle
git push --force
ohne die Optionen <Repository> und <branch> funktioniert es auch, wenn Sie Ihren Upstream eingerichtet haben.<repository>
? Ist esorigin
?org/repo
? Oder einfach nurrepo
?Sag nur :
und dann
quelle
git push origin <BRANCH-NAME>
hat nicht funktioniert, ich musstegit push --force
wie in der akzeptierten Antwort erklärt verwenden.git push --force
, sonst geht der Schub nicht durch.So bearbeiten Sie ein anderes Commit als das letzte:
Schritt 1 :
git rebase -i HEAD~n
Interaktive Rebase für die letztenn
betroffenen Commits durchführen. (dh wenn Sie eine Commit-Nachricht ändern möchten, 3 Commits zurück, tun Sie diesgit rebase -i HEAD~3
)git öffnet einen Editor, um diese Commits zu verarbeiten. Beachten Sie diesen Befehl:
genau das brauchen wir!
Schritt 2 : Wechseln Sie
pick
zur
fü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:
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:
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 -f
die Fernbedienung aktualisieren.quelle
git rebase -i HEAD~3
git rebase --continue
. Wenn Sie den für die interaktive Sitzung verwendeten Texteditor ändern möchten (z. B. von der Standardeinstellungvi
aufnano
), führen Sie ihn ausGIT_EDITOR=nano git rebase -i HEAD~n
.Verwenden Sie diese beiden Schritte in der Konsole:
und dann
Erledigt :)
quelle
Es sollte beachtet werden, dass, wenn Sie
push --force
mit 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:quelle
Wenn Sie eine ältere ändern möchten commit, nicht der letzte, müssen Sie Verwendung
rebase
Befehl wie hier erklärt, Github Hilfeseite , auf der Berichtigungs begehen die Nachricht von älteren oder mehrere Nachrichten Abschnittquelle
Befehl 1 .
Dann,
Befehl 2 .
quelle
Bearbeiten und ändern Sie dann die Nachricht im aktuellen Fenster. Danach tun
quelle
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 (mitamend
ist 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:quelle
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-empty
Option git.) ..git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’
'' '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
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
oder
Später können Sie einfach verwenden
oder wenn Sie den Texteditor öffnen möchten, verwenden Sie
Ich werde es vorziehen, einen Texteditor zu verwenden, wenn Sie viele Kommentare haben. Sie können Ihren bevorzugten Texteditor mit Befehl einstellen
Wenn Sie mit dem Ändern der Festschreibungsnachricht fertig sind, speichern Sie sie und beenden Sie sie
und dann laufen
Und du bist fertig
quelle
Zusätzliche Informationen für dasselbe Problem, wenn Sie eine Bitbucket-Pipeline verwenden
Bearbeiten Sie Ihre Nachricht
auf den Server drücken
Fügen Sie dann --force zu Ihrem Push-Befehl in der Pipeline hinzu
Dadurch werden Ihre vorherigen Commits gelöscht und Ihre aktuellen Commits verschoben.
Ich habe es mit der Bitbucket-Pipeline versucht und es funktioniert einwandfrei
quelle