Почему git запрашивает у меня сообщение о коммите после слияния?

142

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

В прошлом он выполнял бы слияние в молчании со стандартным сообщением о фиксации (по аналогии с Merge branch 'dev' of remote.com:/repo into dev).

Я недавно обновил git до версии 1.7.11.3 (через homebrew), но не могу придумать ничего другого, что я мог бы сделать, чтобы изменить это поведение. Это настройка или есть какой-то способ вернуться к тому, что было?

shanebonham
источник

Ответы:

157

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

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

Кристофер
источник
54
Спасибо за помощь. Я не согласен с тем, что коммиты слияния всегда должны быть описательными. Причина, по которой я искал это, заключается в том, что автоматическое слияние, когда я выполняю извлечение, запрашивает у меня объяснение, почему слияние необходимо, что быстро становится необоснованным, поскольку это происходит даже тогда, когда у меня нет никаких изменений.
Брайан
10
Это также полезный ресурс для избежания такого поведения: longair.net/blog/2009/04/16/git-fetch-and-merge Вы должны избегать git pull; используйте, git merge --ff-onlyесли вы просто пытаетесь обновить, и вы не думаете, что у вас есть какие-либо локальные изменения; используйте, git merge --no-ffесли вы действительно пытаетесь объединить ветку.
Символ
6
Есть ли флаг конфигурации, чтобы отключить это? Раздражает необходимость каждый раз вводить --no-edit.
LandonSchropp
Потрясающие. Спасибо, что поделились @Christopher.
LandonSchropp
3
@SeanCoetzee: Это зависит от ваших $EDITORнастроек, но если вы используете git из коробки на OSX, это, вероятно, программа под названием 'vi' . Введите iдля входа в режим «ВСТАВКА»; введите ваше сообщение. Затем вы можете сохранить и выйти, нажав, ESCа затем набрав :wq.
Кристофер
58

Чтобы создать ярлык для использования в будущем:

Отредактируйте ваш ~/.gitconfigсо следующим:

[core]
    mergeoptions = --no-edit

Или выполните следующее в Терминале

git config --global core.mergeoptions --no-edit

Даллас Кларк
источник
13
Это не сработало для меня (git на OSX), и я установил его правильно, глядя на вывод git config --global core.mergeoptions.
jvannistelrooy
команда терминала должна быть такой, как показано нижеgit config core.mergeoptions --no-edit
С. Мерт
@SimsekMert, который будет редактировать только .gitconfig в текущем репозитории, а не глобально для каждого репозитория git
Даллас Кларк
@AbhishekGoel есть шанс, что вам может понадобиться перезапустить Терминал, чтобы изменения вступили в силу
Даллас Кларк
@jvannistelrooy есть шанс, что вам может понадобиться перезапустить Терминал, чтобы изменения вступили в силу
Даллас Кларк
11

Во-первых, обратите внимание на предупреждения в ответе Кристофера выше.

Затем, если вы все еще хотите отключить автоматическое редактирование сообщения о фиксации слияния, установите эту переменную среды:

    GIT_MERGE_AUTOEDIT=no

Эта переменная окружения и ее настройка «нет» описаны на странице git merge doc. Рекомендуется использовать его только в сценариях, которые необходимо объединить неинтерактивно, но, конечно, его можно установить как часть среды оболочки, чтобы сделать его эффекты более постоянными.

emackey
источник
Можете ли вы объяснить, как это может отличаться от использования --no-editфлага?
Александр Миллс
2
Я не знаю функциональной разницы, но фактор удобства оправдывает это. --no-editФлаг должен быть повторен в командной строке с каждым использованием, так как он не появляется на работу в настройках , как описано в ответ Даллас Кларк здесь. Установка переменной среды - единственный способ, которым я знаю, чтобы сделать эту настройку постоянной.
Emackey