Подтвердить что ты не робот

Как использовать сообщение фиксации по умолчанию git после разрешения конфликтов слияния?

После выполнения слияния и разрешения конфликтов есть ли "простой" способ просто принять сообщение с сообщением о по умолчанию, полученное из командной строки? Один из наших разработчиков разрешит все конфликты, а затем сделает git commit -m"Merge Commit", который заменит сгенерированное сообщение фиксации, в котором перечислены все файлы конфликтов. Я хотел бы иметь другой флаг, который бы просто взял текущий файл без изменений. Я знаю, что есть опция -F или --file =, но это требует знания имени файла все время.

Спасибо

4b9b3361

Ответ 1

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

Может быть, разработчик генерирует комманды слияния, когда он/она следует переустанавливать?

Таким образом, объединение слиянием является результатом git fmt-merge-msg, которому вы должны были бы кормить родителей слиянием.

Ответ 2

Per docs, я просто попробовал эту простую команду, и это сработало для меня:

git commit --no-edit

Затем запустите git log, чтобы подтвердить, что используется сообщение по умолчанию.

Ответ 3

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

Если сообщение не подбирается самостоятельно, оно может быть передано команде git с помощью параметра --file, который считывает сообщение фиксации из файла:

git commit --file .git/MERGE_MSG

Ответ 4

Просто установите редактор на команду, которая ничего не делает:

GIT_EDITOR=true git commit

Ответ 5

git commit --file .git/MERGE_MSG, как уже упоминалось, прекрасно, но он игнорирует несколько моментов:

  • Текущий каталог не самый верхний каталог
  • Текущий репозиторий - это подмодуль Git, не имеющий каталога .git, а файл .git.

И необязательно:

  • MERGE_MSG содержит некоторую информацию о файлах с конфликтами.

Первые две точки можно использовать с git rev-parse:

git commit -F "$(git rev-parse --git-dir)/MERGE_MSG"

Или, альтернативно, с псевдонимом Git:

commit-merge = !cat $(git rev-parse --git-dir)/MERGE_MSG | git commit -F -

Это работает как в "нормальных" репозиториях, так и в подмодулях. Если маркеры конфликта с # -марками должны быть отброшены, для простоты может быть выбрана только первая строка для сообщения слияния:

git commit -m $(head -1 $(git rev-parse --git-dir)/MERGE_MSG)

Или другой псевдоним:

commit-merge = !head -1 $(git rev-parse --git-dir)/MERGE_MSG | git commit -F -

Мне пришлось использовать ключ -F в псевдонимах, потому что я не мог сделать кавычки Git для генерируемых команд с помощью bash (иначе git commit будет жаловаться на частичные коммиты во время слияний).


Git 2.12.0, который был выпущен два дня назад вводит git merge --continue, чтобы сделать фиксацию слияния, которая была остановлена ​​при конфликтах во время слияние. Он отлично работает и для субмодулей, но не принимает --no-edit, по крайней мере, пока что, поэтому редактор предлагает изменить сообщение фиксации до завершения слияния.

Ответ 6

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

Каждый раз, когда возникает конфликт слиянием, тогда "объединенный diff" покажет вам, какие файлы были конфликтующими: git diff HEAD HEAD^1 HEAD^2 --name-only. Я не знаю, насколько технически это возможно для комбинированного diff, чтобы показать больше файлов, чем просто конфликтующих.

Но, полагая, что он работает так, как мы хотим (это предположение), тогда вы можете иметь крюк git commit-msg, который проверяет сообщение, которое пользователь вводил и утверждал

  • - это объединение слиянием?
  • если это так, делает ли файл с объединенными файлами diff?
  • если да, то строка "Конфликты:" следует за этими именами файлов?

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