как я могу настроить сообщение о слиянии git?


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

мой вопрос в том, как я могу форматировать 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 57

9 ответов:

Я хотел сделать что-то подобное. Я не нашел никакого разумного способа получить 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'  $var  > temp_merge_msg && git log --format=format:'%s' $var.. >> temp_merge_msg && printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg && git log --format=format:'%s' ..$var >> temp_merge_msg && printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg && git log --left-right $var... >> temp_merge_msg && git merge --no-ff --no-commit  && 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'  $var  > temp_merge_msg && 
3        git log --format=format:'%s' $var.. >> temp_merge_msg && 
4        printf '\n\nBranch %s commits:\n' $var >> temp_merge_msg && 
5        git log --format=format:'%s' ..$var >> temp_merge_msg && 
6        printf '\n\n* * * * * * * * * * * * * * * * * * * * * * * * *\n::DETAILS::\n' >> temp_merge_msg && 
7        git log --left-right $var... >> temp_merge_msg && 
8        git merge --no-ff --no-commit  && 
9        git commit -eF temp_merge_msg; rm -f temp_merge_msg;}; f"

хорошо...

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

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

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

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

чтобы изменить сообщение фиксации фиксации слияния без потери ссылки на какой-либо из родителей фиксации слияния.

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

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

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

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

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

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

личные Примечание: Я использую первое решение, поскольку оно полностью зависит от крючков и свойств конфигурации 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

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

#!/bin/sh
#...

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

следует определить псевдоним commit msg, например

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

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

#!/bin/sh

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

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

./cmd-name <branch to merge>

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

как только вы объедините свой <branch A> до <branch B>, git автоматически зафиксирует сообщение с надписью " merge branch <branch A> на <branch B>.

если вы хотите настроить сообщение о слиянии Git, вы можете попробовать:

$ 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>'s последнее сообщение фиксации, то снова вы можете попробовать:

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

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

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

$ git add .
$ git commit -m "your commit message"

есть еще и на git-merge теперь, что делает половину того, что вы хотите - он помещает shortlog (commit summaries) в сообщение слияния. Однако полное решение должно будет использовать крючок, как в ответе VonC.

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

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

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

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

использование:

mergedevelop "PR #143..." иметь сообщение:

master

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