При слиянии ветки не обязательно указывать no-ff если оно нужно?

Во всяких интернетах (в т.ч. на английском SO) пестрят картинки, что если мы хотим сохранить историю коммитов ветки, которую вливаем и не переводить указатель чисто вперёд, то нужно ставить --no-ff. Типичные картинки

введите сюда описание изображения

введите сюда описание изображения

Однако тут говорится о том, что если в ветке уже были коммиты, то --no-ff в любом случае будет происходить

Теперь изменения бранча testbranch идут в отдельной ветке даже без указания no fast-forward.

Вопрос вполне логичный и простой: в итоге, если я нахожусь в какой-то ветке и нужно слить другую и чтобы коммиты сделанные в другой ветке согласно истории принадлежали именно второй, то если я уже делал коммиты в первой, то указаывать --no-ff не обязательно? А если я нахожусь на ветке test1 сливаю себе dev, чтобы обновить данные, делаю ещё небольшую правку, коммит, пуш, а потом перехожу на dev и вливаю себе эту ветку test1 то тоже уже не надо указывать флаг --no-ff?

Мне важна история всегда. Важно чтобы коммиты отображались именно на тех ветках, где были сделаны, а не шли в одной ветке, как прямая дорога.


Ответы (1 шт):

Автор решения: Герман Борисов

К сожалению ваша ссылка «тут» недоступна из моего региона, а ваше цитат не полная.

git может проводить слияние тремя способами:

  • --ff — (по умолчанию) попытаться выполнить перемотку (fast forward), если не удалось, то создать коммит слияния.
  • --no-ff — всегда создавать коммит слияния.
  • --ff-only — попытаться выполнить перемотку, если не удалось, завершить ошибкой.

Подробности: https://git-scm.com/docs/git-merge#Documentation/git-merge.txt---ff

Перемотка может быть выполнена только если ветка, в которую идёт слияние стоит на том коммите, который есть во вливаемой ветке (как правило это точка ветвления, но не обязательно).

Если после точки ветвления в обеих ветках есть свои коммиты (отсутствующие во второй), то будет создан коммит слияния. В этом случае совершенно не обязательно указывать параметр --no-ff. Но и мешать он не будет.

А если я нахожусь на ветке test1 сливаю себе dev, чтобы обновить данные, делаю ещё небольшую правку, коммит, пуш, а потом перехожу на dev и вливаю себе эту ветку test1 то тоже уже не надо указывать флаг --no-ff?

Если после вливание dev в test1 в ветке dev не было новых коммитов, то без указания --no-ff будет выполнена перемотка. Потому что коммит ветки dev находится в ветке test1, вы его сами влили. А так как вы ранее вливали dev в test1, то в истории коммиты из test1 будут отображаться как будто они были сделаны в основной ветке, а коммиты из dev — как из ветки разработки. Тут настоятельно рекомендуется делать --no-ff.

Для того, чтоб не задумываться ставить --no-ff или нет, лучше всегда ставить. А чтоб не забывать, можно указать в настройках git, что по умолчанию нужно использовать --no-ff, а не --ff. Делается это командой git config --add merge.ff false

Подробности: https://git-scm.com/docs/git-config#Documentation/git-config.txt-mergeff

→ Ссылка