Часто возникает проблема, когда после сливания ветки в master, а затем выполнения push мастера в репозиторий - в удаленный репозиторий не передаётся информация о том, что было слияние веток. И в дереве изменений коммиты отображаются прямо внутри мастера. Это происходит из-за того, что Git может выполнять слияние веток двумя способами:
- ПЕРЕМТОКА. С помощью алгоритма fast-forwarding - без создания отдельного коммита слияния. Применяется в том случае, если с момента нашего "ответвления" в основной ветке никто не делал других коммитов.
- ИСТИННОЕ СЛИЯНИЕ. С помощью отдельного коммита, который хранит информацию о слиянии.
Применяется, если с момента нашего "ответвления" в основной ветке произошли изменения.
Соответственно, в первом случае у нас все изменения отобразятся в репозитории внутри мастера в одну линию. В то время как второй способ позволяет не терять информацию о том, что ветка существовала, и показывает вливание ветки в мастер.
Как же принудительно заставить 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/