Как я могу настроить сообщение git merge commit?
Каждый раз, когда я делаю слияние, мне нужно создать коммит слияния, и я бы хотел, чтобы в нем было больше, чем просто сводка всех коммитов.
Мой вопрос: как мне отформатировать 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
Ответы
Ответ 1
Я хотел сделать что-то подобное. Я не нашел никакого разумного способа заставить работать 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 выполняет команду слияния с входящей ветвью без быстрого -F или вперед (поэтому вы получаете коммит) и без коммита (так что вы должны написать один самостоятельно... ах, а вы нет!)
Строка 9 выполняет команду фиксации с параметрами -e
и -F
чтобы разрешить редактирование и указать -F
заполнить сообщение текстом в указанном файле. Как только вы закончите сообщение коммита по желанию, оно фиксирует слияние и удаляет временный файл.
Тада! Два ;
в конце этой длинной команды сделайте так, чтобы функции printf не записывали в консоль, а только в файл.
Ответ 2
Я знаю, что это не отвечает на исходный вопрос, но в интересах git noobs, таких как я, которые доходят до этой страницы, потому что в настоящий момент это первый результат Google для "git изменить сообщение об ошибке слияния", я При этом можно сделать следующее:
git commit --amend -m"New commit message"
чтобы изменить сообщение фиксации слияния, не теряя ссылку на кого-либо из родителей слияния.
Ответ 3
Похоже, что с версии Git 1.7.8 вы можете сделать git merge --edit ...
для указания сообщения о фиксации.
И с 1.7.10, переход в режим редактирования будет поведением по умолчанию
В этом выпуске команда "git merge" в интерактивном сеансе запустит редактор, когда он автоматически разрешит слияние для пользователя, чтобы объяснить результирующую фиксацию, точно так же, как команда "git commit" когда ему не было сообщено сообщение фиксации.
(хотя я не вижу его в msysgit на окнах).
Ответ 4
Я нашел два способа решения этой проблемы.
Примечание: не используйте оба одновременно, как если бы коммит не смог слить его, он снова добавит журнал в нижнюю часть.
личное примечание. Я использую первое решение, поскольку оно полностью полагается на git перехваты и свойства конфигурации вместо внешнего script.
Для реального решения нужно было бы расширить команду git с именем "fmt-merge-msg", которая генерирует описания oneline при передаче опции -log (если вам действительно нужно это решение, вам придется создать свой собственный патч (для git) и скомпилировать его из источника).
1. используя сообщение ready-commit-message как VonC
это решение имеет проблему, что вам нужно прервать фиксацию и затем вручную выполнить
установка псевдонима, который будет создавать требуемое сообщение фиксации:
[alias]
lm = log --pretty=format:'%s%n by %C(yellow)%an%Creset (%ad)%n %n%b' --date=local
создание hook-commit-msg путем создания исполняемого файла ready-commit-msg в $GIT_DIR/hooks/(пример script ниже)
#!/bin/sh
#...
case "$2,$3" in
merge,)
echo "Merge details:" >> $1
echo "" >> $1
git lm ORIG_HEAD..MERGE_HEAD >> "$1" ;;
*) ;;
esac
следует определить псевдоним commit msg, например
[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>
если вы все еще хотите иметь описание транзакций online, вам нужно будет добавить новые команды или что-то еще до аргумента -m (если вы используете -log, то он будет создан внизу)
Ответ 5
После объединения вашего <branch A>
в <branch B>
, git автоматически передаст сообщение с сообщением "слияние ветки <branch A>
в <branch B>
.
Если вы хотите настроить сообщение git merge commit, вы можете попробовать:
$ 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>
last commit, а затем повторите попытку:
$ git commit --amend -m "your new commit message"
Но, как правило, мы не обновляем другие сообщения фиксации, если они не являются неправильными.
Предположим, вы столкнулись с конфликтом после git merge, а затем просто разрешите конфликт и выполните:
$ git add .
$ git commit -m "your commit message"
Ответ 6
Также существует опция --log
для git-merge
, которая делает половину того, что вы хотите, - она помещает shortlog (сводки фиксации) в сообщение слияния. Однако полное решение должно использовать крючок, как в ответе VonC.
Ответ 7
Вы можете попробовать определить hook-commit-msg) ( sample one генерирует некоторые пользовательские "сообщения о фиксации по умолчанию" )
Ответ 8
Опаздывает на вечеринку, но в настоящее время мы можем просто использовать
git merge --squash <branch>
объединить другую ветку в один коммит в моей текущей ветке и предварительно заполнить наше сообщение коммитом всеми слитыми сообщениями коммита - и подробными сообщениями, а не только однострочными.
Я искал целую вечность для этой команды.
Ответ 9
Очень простая функция bash, которая устанавливает сообщение по умолчанию и добавляет ваш аргумент.
Он открывает ваш редактор с помощью переключателя --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...