Слияние веток git с отображением в дереве изменений (--no-ff)

Часто возникает проблема, когда после сливания ветки в master, а затем выполнения push мастера в репозиторий - в удаленный репозиторий не передаётся информация о том, что было слияние веток. И в дереве изменений коммиты отображаются прямо внутри мастера. Это происходит из-за того, что Git может выполнять слияние веток двумя способами:

  1. ПЕРЕМТОКА. С помощью алгоритма fast-forwarding - без создания отдельного коммита слияния. Применяется в том случае, если с момента нашего "ответвления" в основной ветке никто не делал других коммитов.

     
  2. ИСТИННОЕ СЛИЯНИЕ. С помощью отдельного коммита, который хранит информацию о слиянии.
    Применяется, если  с момента нашего "ответвления" в основной ветке произошли изменения.

Соответственно, в первом случае у нас все изменения отобразятся в репозитории внутри мастера в одну линию. В то время как второй способ позволяет не терять информацию о том, что ветка существовала, и показывает вливание ветки в мастер.

Как же принудительно заставить git выполнять merge вторым способом?

Для этого есть специальный флаг --no-ff. Пример команды:
 git merge --no-ff my-bramch

Либо можно сразу дополнить коммит слияния сообщением (чтобы не открывался текстовый редактор линукса):
 git merge --no-ff my-bramch -m "Сливаю изменения"

Чтобы каждый раз не дополнять команду merge флагом --no-ff и подставлять его автоматически по-умолчанию, следует обновить конфигурацию гита командой:
git config branch.master.mergeoptions "--no-ff"

Которая, в свою очередь, добавляет в файл ~/.git/config следующие строки:

[branch "master"]
    mergeoptions = --no-ff

 

Теперь любой merge в мастер будет создаваться отдельным коммитом! Сравнение двух способов слияния:

 

Хорошая статья на тему процесса работы с GIT: http://habrahabr.ru/post/106912/

Теги: