webentwicklung-frage-antwort-db.com.de

Git: Wie kann ich die Nachricht eines Merge-Commits bearbeiten / umformulieren?

Wie bearbeite oder umformuliere ich die Nachricht eines Merge-Commits?

git commit --amend funktioniert, wenn es das letzte Commit ist (HEAD), aber was ist, wenn es vor HEAD kommt?

git rebase -i HEAD~5 listet die Merge-Commits nicht auf.

135
ma11hew28

Wenn Sie das --preserve-merges Option (oder deren Synonym -p) zum git rebase -i command then git wird versuchen, die Zusammenführungen beim erneuten Basieren beizubehalten, anstatt den Verlauf zu linearisieren, und Sie sollten auch in der Lage sein, die Zusammenführungs-Commits zu ändern:

git rebase -i -p HEAD~5
181
Mark Longair

Beachten Sie, dass ab git1.7.9.6 (und git1.7.10 +), git merge Selbst immer den Editor auslöst , damit Sie einer Zusammenführung Details hinzufügen können.

"git merge $tag" Zum Zusammenführen eines mit Anmerkungen versehenen Tags öffnet den Editor während einer interaktiven Editiersitzung immer. In der Version 1.7.10 wurde die Umgebungsvariable GIT_MERGE_AUTOEDIT eingeführt, um älteren Skripten dabei zu helfen, dieses Verhalten abzulehnen. Die Wartungsverfolgung sollte dies jedoch ebenfalls unterstützen.

Es wird auch eine Umgebungsvariable GIT_MERGE_AUTOEDIT eingeführt, um älteren Skripten zu helfen ablehnen dieses Verhalten.

Siehe " Anticipating Git 1.7.1 ":

Kürzlich hat Linus in einem Diskussion auf der Git-Mailingliste zugegeben (und ich stimmte zu), dass dies einer der Designfehler war, die wir in der frühen Geschichte von Git gemacht haben.
Ab 1.7.10 wird mit dem Befehl git merge, der in einer interaktiven Sitzung ausgeführt wird (dh sowohl die Standardeingabe als auch die Standardausgabe sind mit einem Terminal verbunden), ein Editor geöffnet, bevor ein Commit zum Aufzeichnen des Befehls erstellt wird Ergebnis der Zusammenführung, um dem Benutzer die Möglichkeit zu geben, die Zusammenführung zu erklären, genau wie der Befehl git commit, den der Benutzer nach dem Lösen eines Konflikts bereits ausführt.

Linus sagte:

Aber es ist mir eigentlich egal, wie es tatsächlich funktioniert - mein Hauptproblem ist, dass es mit git viel zu einfach ist, schlechte Zusammenführungsnachrichten zu haben.
Ich denke, ein Teil davon ist eine noch einfachere Idiotie: Wir starten standardmäßig nicht einmal den Editor für eine "Git-Zusammenführung", sondern für eine "git commit".
Das war ein Designfehler, und es bedeutet, dass Sie zusätzliche Arbeit leisten müssen, wenn Sie einer Zusammenführung tatsächlich eine Notiz hinzufügen möchten. Also die Leute nicht
.


Beachten Sie, dass vor Git 2.17 (Q2 2018) "git rebase -p" Die Protokollnachrichten eines Merge-Commits entstellt wurden, was jetzt behoben ist.

Siehe commit ed5144d (08. Februar 2018) von Gregory Herrero (``) .
Vorgeschlagen von: Vegard Nossum (vegard) und Quentin Casasnovas (casasnovas) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in Festschreiben 8b49408 , 27. Februar 2018)

rebase -p: Fehler beim Aufrufen von git merge Behoben.

Seit commit dd6fb ("rebase -p: Feste Anführungszeichen beim Aufruf von git merge", Januar 2018, Git 2.16.0-rc2) ist die Commit-Nachricht des Merge-Commits rebased wird mit einer Subshell, die 'git rev-parse --sq-quote' ausführt, an den Befehl merge übergeben.

Um diese Subshell werden doppelte Anführungszeichen benötigt, damit für den Befehl git merge Zeilenumbrüche beibehalten werden.

Vor diesem Patch wird folgende Zusammenführungsnachricht angezeigt:

"Merge mybranch into mynewbranch

Awesome commit."

wird:

"Merge mybranch into mynewbranch Awesome commit."

nach einem rebase -p.


Mit Git 2.23 (Q2 2019) sollte eine Anweisung " merge -c " während " git rebase --rebase-merges " dem Benutzer die Möglichkeit geben, das zu bearbeiten Protokollnachricht, auch wenn es ansonsten nicht erforderlich ist, eine neue Zusammenführung zu erstellen und die vorhandene zu ersetzen (dh stattdessen einen schnellen Vorlauf auszuführen), dies jedoch nicht getan hat.
Was korrigiert wurde.

Siehe commit 6df8df (02. Mai 2019) von Phillip Wood (phillipwood) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in Commit c510261 , 13. Juni 2019)

29
VonC

Eine weitere nette Antwort, die nur primitive Befehle verwendet - von knittl https://stackoverflow.com/a/7599522/94687 :

git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch

oder ein besserer (richtigerer) letzter Rebase-Befehl:

git rebase <sha of merge> previous_branch --onto HEAD

Übrigens könnte die Verwendung der primitiven Befehle die nette "Eigenschaft" haben, nicht zu viel CPU zu verbrauchen und Sie warten zu lassen, bis Git fertig ist, über die Liste der Commits nachzudenken, die im Fall von git rebase -p -i HEAD^^^^ (Z. B. Ein Befehl, der eine Liste von nur 4 letzten Commits mit der Zusammenführung als letztes in meinem Fall ergeben würde, dauerte in meinem Fall ungefähr 50 Sekunden!).

git merge --edit
Ermöglicht das Kommentieren auch bei nicht interaktiver Zusammenführung.

git merge --edit --no-ff kann nützlich sein, wenn Sie git flow folgen, indem Sie auf dem Entwicklungszweig neu basieren und ohne schnellen Vorlauf darin zusammenführen.

1
Empus