Jedes Mal, wenn ich eine Fusion mache, brauche ich, dass eine Merge-Commit generiert wird, und ich möchte, dass es mehr als nur eine Zusammenfassung aller Commits gibt.
Meine Frage ist, wie kann ich git-fmt-merge-msg formatieren oder wie diese automatisierte Nachricht bestimmt wird (Ich kann dies nach einem Commit manuell tun, indem ich es korrigiere und git-log --pretty = format: '.. . ')
Zum Beispiel möchte ich es so formatieren:
Merge branch 'test'
* test:
[BZ: #123] fifth commit subject
[BZ: #123] fourth commit subject
[BZ: #123] third commit subject
[BZ: #123] second commit subject
[BZ: #123] first commit subject
__________________________________________
Merge details:
[BZ: #123] fifth commit subject
at 2010-06-30 11:29:00 +0100
- fifth commit body
[BZ: #123] fourth commit subject
at 2010-06-30 11:22:17 +0100
- fourth commit body
[BZ: #123] third commit subject
at 2010-06-30 11:21:43 +0100
- third commit body
[BZ: #123] second commit subject
at 2010-06-30 11:21:30 +0100
- second commit body
[BZ: #123] first commit subject
at 2010-06-30 11:29:57 +0100
- first commit body
Ich wollte etwas so machen. Ich habe keinen vernünftigen Weg gefunden, git fmt-merge-msg
zur Arbeit zu bringen. Ich denke, es funktioniert nicht so, wie ich es mir erhofft hatte (gib einen vollständig benutzerdefinierten Text für die Nachricht ein). Stattdessen habe ich mit den Befehlen -no-commit
und commit -F
einen anderen Weg gefunden. Die Ausgabe ist natürlich anpassbar, spiegelt jedoch fast genau das wider, was Sie als Ausgabe 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 das oben. Die folgende Version enthält Zeilenumbrüche, die Sie nicht möchten, aber ich erkläre, was ich mache:
[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, sodass git weiß, dass es kein git-Befehl ist. Sie setzt den aktuellen Zweig (Master, wenn Sie einen anderen Zweig in Master zusammenführen) auf eine Variable, damit wir sie später verwenden können.
Zeile 2 druckt die erste Zeile mit dem aktuellen Zweig und dem Zweignamen, 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 erhält das Protokoll der Commits im eingehenden Zweig, die sich nicht im aktuellen Zweig befinden, und schreibt nur die Subjekte dieser Commits in die temporäre Datei.
Zeile 4 druckt die nächste Zeile mit Temp.
Zeile 5 erhält das Protokoll der Commits im aktuellen Zweig, die sich nicht im eingehenden Zweig befinden, und schreibt nur die Subjekte dieser Commits in die temporäre Datei.
Zeile 6 gibt ein kleines horizontales Trennzeichen zwischen den Zusammenfassungs- und Detailbereichen aus.
Zeile 7 ruft das Protokoll aller Commits in der aktuellen Verzweigung und in der eingehenden Verzweigung auf die Zeit zurück, kurz nachdem sie voneinander abgezweigt wurden oder zuletzt einen Vorfahren freigegeben hatten. Die linke und rechte Seite zeigt einen Pfeil, der angibt, aus welchem Zweig der Commit stammt. <bedeutet aktueller Zweig und> bedeutet eingehender Zweig.
Zeile 8 führt einen Zusammenführungsbefehl mit dem ankommenden Zweig ohne Schnellvorlauf (damit erhalten Sie ein Commit) und ohne Commit aus (also müssen Sie selbst einen schreiben ... ach aber nicht !)
Zeile 9 führt den Commit-Befehl mit den Parametern -e
und -F
aus, um die Bearbeitung zu ermöglichen und dem Commit mitzuteilen, dass die Nachricht mit dem Text in der angegebenen Datei gefüllt wird. Nachdem Sie die Festschreibungsnachricht wie gewünscht beendet haben, wird die Zusammenführung festgelegt und die temporäre Datei gelöscht.
Tada! Die beiden ;
am Ende dieses langen Befehls bewirken, dass die printf-Funktionen nicht in die Konsole geschrieben werden, sondern nur in die Datei.
Ich bin mir dessen bewusst, dass dies nicht die ursprüngliche Frage beantwortet, aber für git noobs wie mich, der diese Seite erreicht, weil es das erste Google-Ergebnis für "git change merge commit message" ist, möchte ich erwähnen, dass dies möglich ist zu:
git commit --amend -m"New commit message"
Ändern der Commit-Nachricht eines Merge-Commit, ohne den Link zu einem der Eltern des Merge-Commits zu verlieren.
Sieht aus wie ab Version Git 1.7.8 Sie können git merge --edit ...
verwenden, um die Festschreibungsnachricht anzugeben.
Ab 1.7.10 ist das Ablegen in den Bearbeitungsmodus das Standardverhalten
Ab dieser Version startet der Befehl "git merge" in einer interaktiven Sitzung einen Editor, wenn er die Zusammenführung für den Benutzer automatisch auflöst, um das resultierende Commit zu erklären, genau wie der "git commit" -Befehl, wenn er keine gegeben hat Nachricht übermitteln.
(obwohl ich es nicht in msysgit unter Windows sehe).
Ich habe herausgefunden, dass es zwei Möglichkeiten gibt, dieses Problem zu lösen
note: Verwenden Sie nicht beide gleichzeitig, da das Commit nicht zusammengeführt werden kann, wird das Protokoll wieder am Ende hinzugefügt.
persönliche Notiz: Ich verwende die erste Lösung, da sie vollständig auf gits Hooks und config-Eigenschaften basiert, anstatt auf ein externes Skript.
Für eine echte Lösung müsste der Befehl git mit dem Namen 'fmt-merge-msg' erweitert werden, der die Oneline-Beschreibungen generiert, wenn die Option --log übergeben wird (wenn Sie diese Lösung wirklich benötigen, müssen Sie eine eigene erstellen.) Patch (für Git) und kompilieren Sie es aus dem Quellcode).
1. Verwenden der Prepare-Commit-Nachricht als VonC vorgeschlagen
Diese Lösung hat das Problem, dass Sie das Festschreiben unterbrechen und anschließend manuell festschreiben müssen
festlegen eines Alias, der die gewünschte Commit-Nachricht erstellt:
[alias]
lm = log --pretty=format:'%s%n by %C(yellow)%an%Creset (%ad)%n %n%b' --date=local
erstellen des Hooks Prepar-Commit-msg durch Erstellen einer ausführbaren Datei Prep-Commit-msg in $ GIT_DIR/hooks/(Beispielskript unten)
#!/bin/sh
#...
case "$2,$3" in
merge,)
echo "Merge details:" >> $1
echo "" >> $1
git lm ORIG_HEAD..MERGE_HEAD >> "$1" ;;
*) ;;
esac
man sollte eine Alias-Commit-Nachricht definieren, wie zB
[alias]
m = merge --no-ff --no-commit
2. einen benutzerdefinierten Befehl verwenden, der die Zusammenführung automatisch generiert
(unter Verwendung des in 1 erstellten lm-Alias)
#!/bin/sh
echo ""
echo "merge with commit details -- HEAD..$1"
git merge --no-ff --no-log -m "`git lm HEAD..$1`" --no-commit $1
und dann einen ziemlich starren Befehl ausführen:
./cmd-name <branch to merge>
wenn Sie immer noch die oneline-Beschreibung der Commits wünschen, müssen Sie dem -m-Argument neue Befehle hinzufügen oder sonst etwas (wenn Sie --log verwenden, werden sie unten generiert).
Sobald Sie Ihren <branch A>
mit <branch B>
zusammengeführt haben, schreibt git automatisch eine Nachricht mit der Aufschrift "Zusammenführen von Zweig <branch A>
" in <branch B>
.
Wenn Sie die Merit-Commit-Nachricht von git anpassen möchten, können Sie Folgendes versuchen:
$ git commit --amend -m "Your merge message"
Mit diesem Befehl wird die Merge-Commit-Nachricht Ihres Git auf Ihre Commit-Nachricht aktualisiert.
sie können auch versuchen:
$ git merge <branch A> --no-commit
ihr <branch B>
wird mit <branch A>
zusammen mit der Liste der <Branch B>'s
-Commit- und Commit-Nachrichten zusammengeführt
Wenn der Schnellvorlauf fehlschlägt, wird Folgendes angezeigt:
Automatic merge went well; stopped before committing as requested
# check this with git status
$ git status
Es wird Ihnen zeigen, dass Ihre Commits bereits zur Bühne hinzugefügt wurden, aber noch nicht festgeschrieben sind. Sie können also Commit-Commits ausführen, ohne git add
auszuführen:
$ git commit -m "your merge commit message"
Wenn Sie die letzte Commit-Nachricht von <branch B>
ändern möchten, können Sie es erneut versuchen:
$ git commit --amend -m "your new commit message"
Im Allgemeinen aktualisieren wir jedoch andere Commit-Nachrichten nicht, es sei denn, sie sind falsch.
Angenommen, Sie bekommen einen Konflikt nach dem Zusammenführen von Git, dann lösen Sie einfach Ihren Konflikt und tun Sie Folgendes:
$ git add .
$ git commit -m "your commit message"
Es gibt jetzt auch eine --log
-Option für git-merge
, die die Hälfte von dem macht, was Sie möchten - sie fügt das Shortlog (Commit-Zusammenfassungen) in der Zusammenführungsnachricht ein. Eine vollständige Lösung muss jedoch einen Haken wie in der Antwort von VonC verwenden.
Sie könnten versuchen, einen prepar-commit-msg -Hook zu definieren (das sample-one generiert einige benutzerdefinierte "Standard-Commit-Nachrichten")
Wir kommen zu spät zur Party, aber heutzutage können wir es einfach nutzengit merge --squash <branch>
um einen anderen Zweig in einem einzigen Commit in meinem aktuellen Zweig zusammenzuführen und unsere Commit-Nachricht mit allen zusammengeführten Commit-Nachrichten vorab zu füllen - und auch die detaillierten Nachrichten, nicht nur die One-Liner.
Ich habe lange nach diesem Befehl gesucht.
Eine sehr einfache Bash-Funktion, die eine Standardnachricht einstellt und Ihr Argument hinzufügt. Sie öffnet Ihren Editor mit dem Schalter --edit
, wenn Sie Änderungen vornehmen möchten.
bearbeiten Sie ~/.bashrc oder bash_aliases. (Vergessen Sie nicht source ~/.bashrc
), um die Änderungen in Ihrer Bashrc anzuwenden
function mergedevelop()
{
git merge --no-ff --edit -m "master <-- develop: $1" develop;
}
benutzen:
mergedevelop "PR #143..."
Nachricht haben:
master <- Entwickeln: PR # 143 ...