Как я могу настроить сообщение коммит слияния в Git? - PullRequest
63 голосов
/ 30 июня 2010

Каждый раз, когда я делаю слияние, мне нужно генерировать коммит слияния, и я бы хотел, чтобы он имел больше, чем просто сводка всех коммитов.

Мой вопрос: как мнеформат git-fmt-merge-msg или что определяет это автоматическое сообщение (я могу сделать это вручную после коммита, изменив его и используя git-log --pretty = format: '...')

Например, я хотел бы отформатировать его так:

 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

Ответы [ 9 ]

51 голосов
/ 17 апреля 2012

Я знаю, что это не ответ на первоначальный вопрос, но в интересах таких же мерзавцев, как и я, которые попадают на эту страницу, потому что в настоящее время это первый результат Google для "git change merge commit message", я отмечуможно:

git commit --amend -m"New commit message"

изменить сообщение о коммите коммита слияния без потери ссылки на любого из родителей коммита слияния.

18 голосов
/ 13 ноября 2012

Похоже на версию Git 1.7.8 , которую вы можете сделать git merge --edit ... указать сообщение фиксации.

А с 1.7.10 переход в режим редактирования будет по умолчанию

Начиная с этого выпуска, команда "git merge" в интерактивном сеансе запускает редактор, когда он автоматически разрешает слияние для пользователя, чтобы объяснить результирующий коммит, точно так же, как команда "git commit", когда это не было. t получил сообщение коммита.

(хотя я не вижу его в msysgit на windows) .

15 голосов
/ 16 июля 2010

Я обнаружил, что есть два способа решения этой проблемы

note : не используйте оба одновременно, так как если фиксация не удастся объединить, она снова добавит журнал в конец.

личное примечание : я использую первое решение, так как оно полностью полагается на хуки git и свойства конфигурации, а не на внешний скрипт.
Для реального решения нужно было бы расширить команду git с именем 'fmt-merge-msg', которая генерирует описания oneline при передаче опции --log (если вам действительно нужно это решение, вам придется создать свой собственный патч (для git) и скомпилируйте его из исходного кода).

1. с использованием prepare-commit-message, как предложил VonC
В этом решении есть проблема, которая заключается в том, что вам нужно прервать коммит, а затем зафиксировать вручную

установка псевдонима, который создаст желаемое сообщение о коммите:

[alias]  
lm = log --pretty=format:'%s%n   by %C(yellow)%an%Creset (%ad)%n %n%b' --date=local

создание ловушки prepare-commit-msg путем создания исполняемого файла prepare-commit-msg в $ GIT_DIR / hooks / (пример скрипта ниже)

#!/bin/sh
#...

case "$2,$3" in  
  merge,)  
  echo "Merge details:" >> $1  
  echo "" >> $1  
  git lm ORIG_HEAD..MERGE_HEAD >> "$1" ;;  
*) ;;  
esac  

необходимо определить сообщение с псевдонимом, например

[alias]  
m = merge --no-ff --no-commit

2. используя пользовательскую команду, которая автоматически сгенерирует слияние
(используя псевдоним lm, созданный в 1.)

#!/bin/sh

echo ""
echo "merge with commit details -- HEAD..$1"
git merge --no-ff --no-log -m "`git lm HEAD..$1`" --no-commit $1

и затем выполните довольно жесткую команду:

./cmd-name <branch to merge>

если вы все еще хотите иметь on-line описание коммитов, вам нужно добавить новые команды или что-то еще в аргумент -m (если вы используете --log, то он будет сгенерирован снизу)

11 голосов
/ 20 августа 2018

Я хотел сделать что-то подобное.Я не нашел разумного способа заставить git fmt-merge-msg работать.Я думаю, что это не работает так, как я надеялся (передавая совершенно другой текст, который можно использовать для сообщения).Поэтому вместо этого я нашел другой способ, используя команды -no-commit и commit -F.Вывод, конечно, настраиваемый, но он почти точно отражает то, что вы сказали, что хотите, чтобы вывод был.

Пример вывода сообщения о фиксации:

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

И использование будет:

$ git mergelogmsg branch-name

Я скопирую псевдоним здесь:

[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" 

Если вы хотите скопировать и вставить его, чтобы настроить его, используйте выше.В приведенной ниже версии есть разрывы строк, которые вам не нужны, но я буду объяснять, что я делаю:

[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"

Хорошо ...

Строка 1 запускает пользовательскую функцию как скрипт оболочки bash, поэтому git знает, что это не команда git.Он устанавливает текущую ветку (master, если вы объединяете другую ветку в master) в переменную, чтобы мы могли использовать ее позже.
Строка 2 печатает первую строку, используя текущую ветку и имя ветвиВы дали исходную команду (так же, как и в обычной команде слияния).Он записывает это во временный файл.
Строка 3 получает журнал коммитов во входящей ветви, которых нет в текущей ветке, и записывает только темы этих коммитов во временный файл.
Строка 4 выводит следующую строку в темп.
Строка 5 получает журнал коммитов в текущей ветви, которых нет во входящей ветви, и записываеттолько темы этих коммитов во временный файл.
Строка 6 печатает небольшой горизонтальный разделитель между частями суммирования и детализации.
Строка 7 получает журналвсе коммиты в текущем и входящем ветвях возвращаются ко времени сразу после того, как они разветвились друг от друга или в последний раз поделились с предком.Слева направо показывает стрелку, которая показывает, из какой ветви происходит коммит.<означает текущую ветвь, а> означает входящую ветвь.
Строка 8 выполняет команду слияния с входящей ветвью без быстрой перемотки вперед (поэтому вы получаете фиксацию) и без фиксации (так что вам нужноНапишите один сам ... ах, но вы этого не сделаете!)
Строка 9 выполняет команду фиксации с параметрами -e и -F, чтобы разрешить редактирование и сообщить о фиксации для заполнениясообщение с текстом в указанном файле.Как только вы закончите сообщение коммита, как вам нужно, оно завершит слияние и удалит временный файл.

Tada!Два ; в конце этой длинной команды делают так, чтобы функции printf не записывали в консоль, а только в файл.

8 голосов
/ 22 января 2014

После слияния вашего <branch A> в <branch B>, git автоматически отправит сообщение «ветвь слияния <branch A> в <branch B>.

.try:

$ git commit --amend -m "Your merge message"

Эта команда обновит сообщение о коммите слияния вашего git до вашего сообщения о коммите.

вы также можете попробовать:

$ git merge <branch A> --no-commit

оно объединит ваш <branch B> с <branch A>, со списком <Branch B>'s сообщений о фиксации и фиксации

Если не удается выполнить быструю перемотку вперед, вы получите что-то вроде этого:

Automatic merge went well; stopped before committing as requested

# check this with git status 
$ git status

Этопокажет вам, ваши коммиты уже добавлены на сцену, но еще не зафиксированы, поэтому вы можете коммитить их без запуска git add:

$ git commit -m "your merge commit message"

Если вы хотите изменить последнее сообщение коммита <branch B>, тоснова вы можете попробовать:

$ git commit --amend -m "your new commit message"

Но, как правило, мы не обновляем другие сообщения коммита, если они не являются правильными.

Предположим, вы получите конфликт после git merge, затем просто решитесвой конфликт и сделай:

$ git add .
$ git commit -m "your commit message"
6 голосов
/ 01 июля 2010

Есть также опция --log для git-merge, которая делает половину того, что вы хотите - она ​​помещает шортлог (фиксацию итогов) в сообщение о слиянии. Полное решение должно будет использовать ловушку, как в ответе VonC.

3 голосов
/ 30 июня 2010

Вы можете попробовать определить prepare-commit-msg hook ( sample one действительно генерирует некоторые пользовательские "сообщения фиксации по умолчанию")

1 голос
/ 14 мая 2018

Опаздывает на вечеринку, но в настоящее время мы можем просто использовать
git merge --squash <branch>
, чтобы объединить другую ветку в один коммит в моей текущей ветке и предварительно заполнить наше сообщение коммита всемиобъединенные сообщения коммита - и подробные сообщения, а не только однострочные.
Я искал целую вечность для этой команды.

0 голосов
/ 17 марта 2017

Очень простая bash-функция, которая устанавливает сообщение по умолчанию и добавляет ваш аргумент.Он открывает ваш редактор с переключателем --edit, если вы хотите внести изменения.

edit ~ / .bashrc или bash_aliases.(Не забудьте source ~/.bashrc), чтобы применить изменения в вашем bashrc

function mergedevelop()
{
    git merge --no-ff --edit -m "master <-- develop: $1" develop;
}

, используйте:

mergedevelop "PR #143...", чтобы получить сообщение:

master <-разработка: PR № 143 ... </p>

...