Подтвердить что ты не робот

Когда использовать параметр -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, когда вы этого не сделаете, почему?

4b9b3361

Ответ 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.