Ich möchte eine Commit-Nachricht tiefer in der Geschichte ändern und habe viele neue Commits gepusht.
Wie ändere ich die Commit-Nachricht? Ist es möglich?
Ich möchte eine Commit-Nachricht tiefer in der Geschichte ändern und habe viele neue Commits gepusht.
Wie ändere ich die Commit-Nachricht? Ist es möglich?
Antworten:
Die Nachricht von Linus Torvalds kann Ihre Frage beantworten:
Ändern / bearbeiten Sie alte Commit-Nachrichten
Kurze Antwort: Sie können nicht (wenn gedrückt).
Auszug (Linus bezeichnet BitKeeper als BK):
Randnotiz, nur aus historischem Interesse: In BK könnte man.
Und wenn Sie daran gewöhnt sind (wie ich), war es wirklich sehr praktisch. Ich würde eine Patchbombe von Andrew anwenden, feststellen, dass etwas nicht stimmt, und sie einfach bearbeiten, bevor ich sie herausschiebe.
Ich hätte dasselbe mit git machen können. Es wäre einfach genug gewesen, nur die Festschreibungsnachricht nicht Teil des Namens zu machen und dennoch zu garantieren, dass der Verlauf unberührt blieb, und die Sache "Kommentare später korrigieren" zuzulassen.
Aber ich habe es nicht getan.
Ein Teil davon ist reine "interne Konsistenz". Git ist einfach ein saubereres System, da alles SHA1-geschützt ist und alle Objekte unabhängig vom Objekttyp gleich behandelt werden. Ja, es gibt vier verschiedene Arten von Objekten, und sie sind alle sehr unterschiedlich, und sie können nicht auf die gleiche Weise verwendet werden, aber gleichzeitig funktionieren sie konzeptionell alle genau , auch wenn ihre Codierung auf der Festplatte unterschiedlich sein kann das Gleiche.
Aber interne Konsistenz ist keine Entschuldigung dafür, unflexibel zu sein, und es wäre natürlich sehr flexibel, wenn wir Fehler einfach beheben könnten, nachdem sie aufgetreten sind. Das ist also kein wirklich starkes Argument.
Der wahre Grund, warum Sie mit git die Commit-Nachricht nicht ändern können, ist sehr einfach: Auf diese Weise können Sie den Nachrichten vertrauen. Wenn Sie Personen erlaubt haben, sie später zu ändern, sind die Nachrichten von Natur aus nicht sehr vertrauenswürdig.
Um vollständig zu sein, Sie könnten Ihre lokale begehen Geschichte um umschreiben zu reflektieren , was Sie wollen, wie von sykora vorgeschlagen (mit einer gewissen Fütterungsmaterial und Reset --hard, Keuchen!)
Sobald Sie jedoch Ihren überarbeiteten Verlauf erneut veröffentlichen (mit einem git push origin +master:master
, dem +
Zeichen, das den Push erzwingt, auch wenn dies nicht zu einem "Schnellvorlauf" -Commit führt), können Probleme auftreten .
Auszug aus dieser anderen SO-Frage:
Ich habe tatsächlich einmal mit --force in das git.git-Repository gepusht und wurde von Linus BIG TIME beschimpft. Es wird viele Probleme für andere Menschen schaffen. Eine einfache Antwort lautet "Tu es nicht".
Derzeit könnte ein Git-Ersatz den Trick machen.
Im Detail: Erstellen Sie einen temporären Arbeitszweig
git checkout -b temp
Zum Ersetzen auf das Commit zurücksetzen
git reset --hard <sha1>
Ändern Sie das Commit mit der richtigen Nachricht
git commit --amend -m "<right message>"
Ersetzen Sie das alte Commit durch das neue
git replace <old commit sha1> <new commit sha1>
Geh zurück zu dem Zweig, in dem du warst
git checkout <branch>
temporären Zweig entfernen
git branch -D temp
drücken
guess
getan.
Sie können git rebase -i
'i' (für den Zweig, von dem Sie verzweigt haben) für interaktive Zwecke verwenden .
Ersetzen Sie den pick
neben dem Commit-Kommentar, den Sie ändern möchten, durch r
(oder reword
), speichern und beenden Sie ihn. Anschließend können Sie die Bearbeitung vornehmen.
git push
noch einmal und du bist fertig!
-p
Argument, rebase
welche p
Reserven verschmelzen.
Angenommen, Sie haben einen Baum wie diesen:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
Zunächst checkout
ein temporärer Zweig:
git checkout -b temp
Beim temp
Verzweigen reset --hard
zu einem Commit, dessen Nachricht Sie ändern möchten (z. B. ist dieses Commit 946992
):
git reset --hard 946992
Verwenden Sie amend
diese Option , um die Nachricht zu ändern:
git commit --amend -m "<new_message>"
Danach sieht der Baum folgendermaßen aus:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 [temp]
Verwenden Sie dann cherry-pick
alle Commits, die vor 946992
von master
to liegen, temp
und legen Sie sie fest, amend
wenn Sie auch ihre Nachrichten ändern möchten:
git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>
Der Baum sieht jetzt so aus:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]
Drücken Sie nun den temporären Zweig zwangsweise auf Remote:
git push --force origin temp:master
Der letzte Schritt: Zweig master
auf lokaler Ebene löschen , git fetch origin
Zweig master
vom Server abrufen, dann zu Zweig wechseln und Zweig master
löschen temp
.
Jetzt werden sowohl Ihre lokalen als auch Ihre Remote-Nachrichten alle Nachrichten aktualisiert.
In unserem Shop habe ich die Konvention eingeführt, erkennbar benannte kommentierte Tags zu Commits mit falschen Nachrichten hinzuzufügen und die Anmerkung als Ersatz zu verwenden.
Auch wenn dies Leuten, die gelegentliche "Git Log" -Befehle ausführen, nicht hilft, bietet es uns die Möglichkeit, falsche Bug-Tracker-Referenzen in den Kommentaren zu beheben, und alle meine Build- und Release-Tools verstehen die Konvention.
Dies ist offensichtlich keine generische Antwort, aber es könnte etwas sein, das die Leute in bestimmten Gemeinschaften übernehmen können. Ich bin sicher, wenn dies in größerem Maßstab verwendet wird, kann irgendwann eine Art Porzellanträger dafür auftauchen ...
(Von http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0 )
Wie man Commits ändert, ist tiefer in der Geschichte
Da der Verlauf in Git unveränderlich ist, muss der Verlauf aus dem geänderten Festschreiben und Weiterleiten neu geschrieben werden, um etwas anderes als das letzte Festschreiben (Festschreiben, das kein Zweigkopf ist) zu korrigieren.
Sie können dafür StGIT verwenden, den Zweig bei Bedarf initialisieren, die Festschreibung für das zu ändernde Commit aufheben, bei Bedarf darauf zugreifen, eine Änderung vornehmen und den Patch aktualisieren (mit der Option -e, wenn Sie die Commit-Nachricht korrigieren möchten), und dann drücken alles und stg begehen.
Oder Sie können Rebase verwenden, um dies zu tun. Erstellen Sie einen neuen temporären Zweig, spulen Sie ihn mit git reset --hard auf das Commit zurück, das Sie ändern möchten, ändern Sie dieses Commit (es würde oben auf dem aktuellen Kopf stehen) und setzen Sie dann den Zweig über git rebase --onto neu auf das geänderte Commit.
Oder Sie können git rebase --interactive verwenden, das verschiedene Modifikationen wie Patch-Neuordnung, Reduzieren, ...
Ich denke, das sollte deine Frage beantworten. Beachten Sie jedoch, dass wenn Sie gedrückt Code zu einem Remote - Repository und die Leute von ihm gezogen haben, dann wird dies zu vermasseln ihren Code Geschichten gehen, sowie die Arbeit , die sie getan haben. Also mach es vorsichtig.