Когда использовать параметр -no-ff 'merge в Git
Успешная Git ветвящаяся модель рекомендует использовать --no-ff
при слиянии ветвей:
Флаг --no-ff
заставляет слияние всегда создавать новую фиксацию объект, даже если слияние может быть выполнено с быстрой перемоткой вперед. Эта позволяет избежать потери информации об историческом существовании функции ветки и группы вместе фиксируют, что вместе добавили особенность. [...]
Да, он создаст еще несколько (пустых) объектов фиксации, но коэффициент усиления будет намного больше, чем это стоит. К сожалению, я не нашел способ make --no-ff
поведение по умолчанию Git merge еще, но это действительно должен быть.
Понимание Git Workflow, однако, рекомендует не использовать --no-ff
:
Итак, вы добавляете новое правило: "Когда вы объединяетесь в свою ветку функций, используйте –-no-ff
, чтобы заставить новую фиксацию." Это выполняет задание, и вы перемещаетесь на. [...]
Полоса поддержки --no-ff
, сломанная bisect
и blame
таинства все симптомы, которые вы используете отвёрткой как молоток. [...]
Оба подхода кажутся разумными для разностных сценариев, но что считается "хорошей практикой?"
Когда вы используете --no-ff
, когда вы этого не сделаете, почему?
Ответы
Ответ 1
Это действительно зависит от того, что вы пытаетесь сделать. Мое правило состоит в том, что если слияние "означает что-то", я использую параметр -no-ff. Когда слияние ничего не значит, и вы, возможно, использовали rebase, нет оснований для использования --no-ff
Вещь с git заключается в том, что это очень мощный инструмент, и вы можете использовать его разными способами - большинство из которых не ошибаются. Спросить, что "правильный путь" сделать, это спросить, как правильно рисовать картину.
По крайней мере, для меня это эволюционирующий набор способов, которыми я люблю это делать, с частыми обсуждениями в команде того, как мы хотим сотрудничать с кодом, - из этого мы пытаемся получить нечто вроде "как это делается здесь", стандарт, но это просто наш способ сделать это.
Ответ 2
Для случая завершенной ветки с одним фиксатором не используйте --no-ff
, просто перетащите вперед, потому что история будет намного проще и менее загромождена. Трудно утверждать, что --no-ff
дает вам какие-либо преимущества в этом случае, потому что неинтересно видеть параллельную ветвь разработки только с одной фиксацией, а не с одной фиксацией в последовательной строке:
# No fast-forward
$ git merge --no-ff awesome-feature
* 3aa649c Merge branch 'awesome-feature'
|\
| * 35ec88f Add awesome feature
|/
* 89408de Modify feature-001.txt and fix-001.txt
* c1abcde Add feature-003
# versus fast-forward
$ git merge awesome-feature
* 35ec88f Add awesome feature
* 89408de Modify feature-001.txt and fix-001.txt
* c1abcde Add feature-003
В случае с готовой ветвью с более чем одной фиксацией это зависит от вас, независимо от того, хотите ли вы сохранить тот факт, что разветвленное развитие произошло параллельно с последовательным. Я бы использовал --no-ff
для более чем одного коммита, чтобы я мог визуально видеть эту разветвленную работу, и поэтому я могу легко манипулировать ею с помощью одного git revert -m 1 <sha-of-merge-commit>
, если бы мне пришлось.
# No fast-forward
$ git merge --no-ff epic-feature
* d676897 Merge branch 'epic-feature'
|\
| * ba40d93 Add octocat.txt
| * b09d343 Add bye.txt
| * 75e18c8 Add hello.txt
|/
* 89408de Modify feature-001.txt and fix-001.txt
* c1abcde Add feature-003
# versus fast-forward
$ git merge epic-feature
* ba40d93 Add octocat.txt
* b09d343 Add bye.txt
* 75e18c8 Add hello.txt
* 89408de Modify feature-001.txt and fix-001.txt
* c1abcde Add feature-003
Посмотрите, как в этом случае ускоренного слияния, без дополнительной информации в сообщениях фиксации, трудно сказать, что последние 3 коммита действительно принадлежат друг другу в качестве одной функции?
Ответ 3
Это действительно зависит от вашего рабочего процесса и от того, как вы используете ветки.
Предположим, что у вас есть "мастер" и две ветки функций, "foo" и "bar", в разработке.
В этом случае ветки существуют только для того, чтобы разные разработчики работали без конфликтов, когда функции выполняются, их необходимо объединить в master, и не важно знать, были ли эти функции реализованы в разных ветвях.
Но у вас может быть другой рабочий процесс, были ветки, "foo" и "bar", относится к независимым модулям в вашей системе.
В этом случае некоторые коммиты могут изменять файлы за пределами области модуля. Когда вы объединяете эти две ветки с мастером, журнал файлов, вне определенного модуля, может запутываться и трудно узнать, откуда происходят эти изменения.
Вам нужно решить, важно ли историческое слияние ветки для вашего рабочего процесса.
И после комментариев я предпочитаю рабочий процесс rebase
и pull --rebase
.