как настроить сообщение слияния 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 ответов
Я хотел сделать что-то подобное. Я не нашел никакого разумного способа получить 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, если вы объединяете другую ветвь into master) к переменной, чтобы мы могли использовать ее позже.
строка 2 печатает первую строку, используя текущую ветвь и имя ветви, которое вы дали исходной команде (так же, как и в обычной команде слияния). Он записывает это в временный файл.
строка 3 получает журнал коммитов во входящей ветви, которые не находятся в текущей ветви, и записывает только темы этих коммитов во временный файл.
строка 4 печать следующая строка-temp.
строка 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).
я обнаружил, что есть два способа решения этой проблемы
Примечание: не используйте оба одновременно, как если бы фиксация не удалось объединить, он добавит журнал снова в нижней части.
личные Примечание: Я использую первое решение, поскольку оно полностью зависит от свойств hooks И config 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 "," 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>
to <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
commit и commit сообщения
если он не сможет сделать перемотку вперед, то вы получите что-то вроде этого:
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, затем просто разрешаете свой конфликт и делаете:
$ git add .
$ git commit -m "your commit message"
там же на git-merge
теперь, что делает половину того, что вы хотите - он помещает shortlog (commit summaries) в сообщение слияния. Однако полное решение должно будет использовать крюк, как в ответе VonC.
вы можете попробовать определить подготовка-фиксация-msg крючком (the образца создает некоторые пользовательские "по умолчанию сообщения")
очень простая функция bash, которая устанавливает сообщение по умолчанию и добавляет ваш аргумент.
Он открывает редактор с помощью --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>
чтобы объединить другую ветвь в одну фиксацию на моей текущей ветви и правопопулистского наш совершение со всеми объединенными сообщениями фиксации - и подробными сообщениями, а не только однострочными.
Я целую вечность искал эту команду.