Ich wollte so etwas einfach machen. Ich habe keinen vernünftigen Weg gefunden, um git fmt-merge-msg
zur Arbeit zu kommen. Ich denke, es funktioniert nicht so, wie ich es mir erhofft hatte (Übergabe eines vollständig benutzerdefinierten Textes für die Nachricht). Also habe ich stattdessen mit den Befehlen -no-commit
und einen anderen Weg gefunden commit -F
. Die Ausgabe ist natürlich anpassbar, spiegelt aber fast genau das wider, was Sie sich gewünscht haben.
Beispiel für eine Commit-Nachrichtenausgabe:
Merge branch fix4 into master
::SUMMARY::
Branch fix4 commits:
Add fix4b-4
Add fix4b-3
Add fix4b-2
Add fix4b-1
Branch master commits:
fix4b-5 on master
* * * * * * * * * * * * * * * * * * * * * * * * *
::DETAILS::
commit < 98ffa579e14610b3566e1a3f86556a04dc95a82b
Author: -----
Date: Fri Aug 17 17:23:26 2018 -0400
fix4b-5 on master
commit > 7e386dddee16a7c2588954d25dd6793cdaa1b562
Author: -----
Date: Fri Aug 17 15:18:17 2018 -0400
Add fix4b-4
use log output as commit message
commit 2e630b1998312ec1093d73f9fe77b942407f45e8
Author: -----
Date: Fri Aug 17 15:15:28 2018 -0400
Add fix4b-3
commit > 2e630b1998312ec1093d73f9fe77b942407f45e8
Author: -----
Date: Fri Aug 17 15:15:28 2018 -0400
Add fix4b-3
commit > c9bb199be49c17ca739d019d749263314f05fc46
Author: -----
Date: Fri Aug 17 15:15:27 2018 -0400
Add fix4b-2
commit > 5b622a935c9d078c7d0ef9e195bccf1f98cce5e4
Author: -----
Date: Fri Aug 17 15:15:27 2018 -0400
Add fix4b-1
Und die Verwendung wäre:
$ git mergelogmsg branch-name
Ich werde den Alias hier kopieren:
[alias]
mergelogmsg = "!f() { var=$(git symbolic-ref --short HEAD) && printf 'Merge branch %s into %s\n\n::SUMMARY::\nBranch %s commits:\n' $1 $var $1 > temp_merge_msg && git log --format=format:'%s' $var..$1 >> temp_merge_msg && printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg && git log --format=format:'%s' $1..$var >> temp_merge_msg && printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg && git log --left-right $var...$1 >> temp_merge_msg && git merge --no-ff --no-commit $1 && git commit -eF temp_merge_msg; rm -f temp_merge_msg;}; f"
Wenn Sie es kopieren und einfügen möchten, um es anzupassen, verwenden Sie die oben genannten Schritte. Die folgende Version enthält Zeilenumbrüche, die Sie nicht möchten, aber ich werde verwenden, um zu erklären, was ich tue:
[alias]
1 mergelogmsg = "!f() { var=$(git symbolic-ref --short HEAD) &&
2 printf 'Merge branch %s into %s\n\n::SUMMARY::\nBranch %s commits:\n' $1 $var $1 > temp_merge_msg &&
3 git log --format=format:'%s' $var..$1 >> temp_merge_msg &&
4 printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg &&
5 git log --format=format:'%s' $1..$var >> temp_merge_msg &&
6 printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg &&
7 git log --left-right $var...$1 >> temp_merge_msg &&
8 git merge --no-ff --no-commit $1 &&
9 git commit -eF temp_merge_msg; rm -f temp_merge_msg;}; f"
In Ordung...
Zeile 1 startet die benutzerdefinierte Funktion als Bash-Shell-Skript, damit git weiß, dass es sich nicht um einen git-Befehl handelt. Es setzt den aktuellen Zweig (Master, wenn Sie einen anderen Zweig in Master zusammenführen) auf eine Variable, damit wir ihn später verwenden können.
Zeile 2 druckt die erste Zeile unter Verwendung des aktuellen Zweigs und des Zweignamens, den Sie dem ursprünglichen Befehl gegeben haben (genau wie bei einem normalen Zusammenführungsbefehl). Es schreibt dies in eine temporäre Datei.
Zeile 3 ruft das Protokoll der Commits in der eingehenden Verzweigung ab, die sich nicht in der aktuellen Verzweigung befinden, und schreibt nur die Betreffs dieser Festschreibungen in die temporäre Datei.
Zeile 4 druckt die nächste Zeile nach Temp.
Zeile 5Ruft das Protokoll der Commits im aktuellen Zweig ab, die sich nicht im eingehenden Zweig befinden, und schreibt nur die Betreffs dieser Commits in die temporäre Datei.
Zeile 6 druckt ein kleines horizontales Trennzeichen zwischen dem Zusammenfassungs- und dem Detailteil.
Zeile 7 ruft das Protokoll aller Commits in der aktuellen Verzweigung und der eingehenden Verzweigung auf die Zeit zurück, kurz nachdem sie voneinander abgezweigt oder zuletzt einen Vorfahren geteilt haben. Links-rechts gibt einen Pfeil an, der anzeigt, aus welchem Zweig das Commit stammt. <bedeutet aktuelle Verzweigung und> bedeutet eingehende Verzweigung.
Zeile 8 führt einen Zusammenführungsbefehl mit dem eingehenden Zweig ohne Schnellvorlauf (damit Sie ein Commit erhalten) und ohne Commit (Sie müssen also selbst einen schreiben ... ah, aber Sie tun es nicht!) Aus.
Zeile 9 Führt den Commit-Befehl mit aus das -e
und-F
Parameter, die das Bearbeiten ermöglichen und dem Commit mitteilen, dass die Nachricht mit dem Text in der angegebenen Datei gefüllt werden soll. Sobald Sie die Festschreibungsnachricht wie gewünscht beendet haben, wird die Zusammenführung festgeschrieben und die temporäre Datei gelöscht.
Tada! Die beiden ;
am Ende dieses langen Befehls sorgen dafür, dass die printf-Funktionen nicht in die Konsole, sondern nur in die Datei geschrieben werden.
Ich bin mir bewusst, dass dies nicht die ursprüngliche Frage beantwortet, aber zum Nutzen von Git-Noobs wie mir, die diese Seite erreichen, weil es derzeit das erste Google-Ergebnis für "Git Change Merge Commit-Nachricht" ist, werde ich erwähnen, dass dies möglich ist zu:
um die Commit-Nachricht eines Merge-Commits zu ändern, ohne die Verbindung zu einem der übergeordneten Elemente des Merge-Commits zu verlieren.
quelle
git log --graph
Zeichnen von Verzweigungsgraphen wurde gestoppt.git merge --no-edit -m "your-custom-commit-message"
Ab Version Git 1.7.8 können Sie
git merge --edit ...
die Commit-Nachricht angeben.Und ab 1.7.10 , wird fallen in den Bearbeitungsmodus das Standardverhalten sein
(obwohl ich es in msysgit unter Windows nicht sehe) .
quelle
Ich habe festgestellt, dass es zwei Möglichkeiten gibt, dieses Problem zu lösen
Hinweis : Verwenden Sie nicht beide gleichzeitig. Wenn das Commit nicht zusammengeführt werden kann, wird das Protokoll erneut unten hinzugefügt.
Persönlicher Hinweis : Ich verwende die erste Lösung, da sie sich anstelle eines externen Skripts ausschließlich auf die Hooks und Konfigurationseigenschaften von git stützt.
Für eine echte Lösung müsste man einen git-Befehl mit dem Namen 'fmt-merge-msg' erweitern, der die Online-Beschreibungen generiert, wenn die Option --log übergeben wird (wenn Sie diese Lösung wirklich benötigen, müssen Sie Ihren eigenen Patch erstellen (z git) und kompiliere es aus der Quelle).
1. Verwenden von prepare-commit-message, wie VonC vorgeschlagen hat.
Diese Lösung hat das Problem, dass Sie das Commit unterbrechen und dann manuell festschreiben müssen
Festlegen eines Alias, der die gewünschte Festschreibungsnachricht erstellt:
Erstellen des Prepare-Commit-Msg-Hooks durch Erstellen einer ausführbaren Prepare-Commit-Nachricht in $ GIT_DIR / hooks / (Beispielskript unten)
man sollte eine Alias-Commit-Nachricht wie definieren
2. Verwenden Sie einen benutzerdefinierten Befehl, der die Zusammenführung automatisch generiert
(unter Verwendung des in 1. erstellten lm-Alias).
und dann einen ziemlich starren Befehl ausführen:
Wenn Sie weiterhin die Online-Beschreibung der Commits wünschen, müssen Sie dem Argument -m neue Befehle oder was auch immer hinzufügen (wenn Sie --log verwenden, wird es unten generiert).
quelle
Sobald Sie Ihr
<branch A>
to zusammenführen<branch B>
, schreibt git automatisch eine Nachricht mit der Aufschrift "Zweig zusammenführen<branch A>
in " zusammen<branch B>
.Wenn Sie die Merge-Commit-Nachricht von git anpassen möchten, können Sie Folgendes versuchen:
Dieser Befehl aktualisiert die Merge-Commit-Nachricht Ihres Git auf Ihre Commit-Nachricht.
Sie können auch versuchen:
es wird Ihr verschmelzen
<branch B>
mit<branch A>
, mit der Liste<Branch B>'s
begehen und Commit - NachrichtenWenn der schnelle Vorlauf nicht möglich ist, erhalten Sie Folgendes:
Es zeigt Ihnen, dass Ihre Commits bereits zur Bühne hinzugefügt, aber noch nicht festgeschrieben wurden. Sie können sie also festschreiben, ohne sie auszuführen
git add
:Wenn Sie die
<branch B>
letzte Festschreibungsnachricht ändern möchten, können Sie erneut versuchen:Im Allgemeinen aktualisieren wir jedoch keine anderen Festschreibungsnachrichten, es sei denn, sie sind falsch.
Angenommen, Sie erhalten einen Konflikt nach dem Zusammenführen von Git, lösen dann einfach Ihren Konflikt und führen Folgendes aus:
quelle
--amend
in der letzten Zeile Ihrer Antwort ein Commit durchführen, das noch nicht stattgefunden hat? Sollte es nicht einfach so seingit commit -m "your commit message"
?--no-commit
Flag angeben , wie Sie es getan haben :-)git add .
, aber direkt können Sie die Zusammenführung mitgit commit -m "your commit message"
Es gibt auch eine
--log
Option fürgit-merge
den Moment, die die Hälfte von dem macht, was Sie wollen - sie platziert das Shortlog (Commit-Zusammenfassungen) in der Zusammenführungsnachricht. Eine vollständige Lösung muss jedoch einen Haken wie in VonCs Antwort verwenden.quelle
commit_tree
direkt zusammen.Sie können versuchen, eine Prepare-Commit-Nachricht zu definieren Hook zu definieren (im Beispiel werden einige benutzerdefinierte "Standard-Commit-Nachrichten" generiert).
quelle
commit-msg
hook während eines aktiviert wurdegit merge
?Eine sehr einfache Bash-Funktion, die eine Standardnachricht festlegt und Ihr Argument hinzufügt. Es öffnet Ihren Editor mit dem
--edit
Schalter, wenn Sie Änderungen vornehmen möchten.edit ~ / .bashrc oder bash_aliases. (Vergessen Sie nicht
source ~/.bashrc
), um Änderungen in Ihrem Bashrc anzuwendenverwenden:
mergedevelop "PR #143..."
Nachricht haben:Master <- Entwickeln: PR # 143 ...
quelle
Wir kommen zu spät zur Party, aber heutzutage können wir einfach
git merge --squash <branch>
einen anderen Zweig zu einem einzigen Commit in meinem aktuellen Zweig zusammenführen und unsere Commit-Nachricht mit allen zusammengeführten Commit-Nachrichten vorab füllen - und auch mit den detaillierten Nachrichten, nicht nur mit den Einzeilern .
Ich habe lange nach diesem Befehl gesucht.
quelle
Neben dem
git merge --squash
in der genannten Christian Severin ‚s Antwort , haben Sie jetzt die Configmerge.suppressDest
als neue Art und Weise einen (kleinen Teil der) verpflichten Nachricht anpassen.Mit Git 2.29 (Q4 2020) hat "
git merge
" ( man ) gelernt, "into <branch>
" am Ende des Titels der Standard-Merge-Nachricht mit dermerge.suppressDest
Konfiguration selektiv wegzulassen .Siehe Commit 6e6029a (29. Juli 2020) und Commit 2153192 (30. Juli 2020) von Junio C Hamano (
gitster
) .(Zusammengeführt von Junio C Hamano -
gitster
- in Commit 341a196 , 01. August 2020)git config
enthält jetzt in seiner Manpage :Und:
quelle