Когда использовать параметр слияния '--no-ff ' в Git



Успешная Модель Ветвления Git рекомендует использовать --no-ff при слиянии веток:




The --no-ff флаг заставляет слияние всегда создавать новую фиксацию
объект, даже если слияние может быть выполнено с быстрой перемоткой вперед. Этот
позволяет избежать потери информации об историческом существовании объекта
ветвь и группы вместе все коммиты, которые вместе добавили
особенность. [...]



Да, он создаст еще несколько (пустой) зафиксируйте объекты, но выигрыш будет
гораздо больше затрат. К сожалению, я не нашел способ
сделай --no-ff поведение по умолчанию git слияния еще, но это действительно
должно быть.




понимание рабочего процесса с Git, однако, рекомендует не использовать --no-ff:




Итак, вы добавляете новое правило: "когда вы объединяетесь в своей ветке функций, используйте
–-no-ff в силу новый коммит."Это делает свою работу, и вы двигаетесь
на. [...]



The --no-ff лейкопластырь, разбитый bisect и blame тайны все
симптомы того, что вы используете отвертку в качестве молотка. [...]




оба подхода кажутся разумными для различных сценариев, но что считается " хорошей практикой?"



если вы используете --no-ff, а когда нет, почему?

772   3  

3 ответов:

Это действительно зависит от того, что ты пытаешься сделать. Мое эмпирическое правило заключается в том, что если слияние "что-то значит", я использую опцию --no-ff. Когда слияние на самом деле ничего не значит, и вы, возможно, использовали ребаз, нет причин использовать --no-ff

дело в том, что git является очень мощным инструментом, и вы можете использовать его во многих отношениях - большинство из которых не ошибаются. Спрашивать, каков "правильный путь", это все равно, что спрашивать, Как правильно рисовать изображение.

по крайней мере, для меня это развивающийся набор способов, которые мне нравятся, с частыми обсуждениями в команде того, как мы хотим сотрудничать с кодом - из этого мы пытаемся вывести своего рода стандарт "как это делается здесь", но это просто наш способ сделать это.

в случае готовой ветви с одной фиксацией не используйте --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 фиксации фактически принадлежат вместе как один особенность?

Это действительно зависит от вашего рабочего процесса, и как вы используете филиалы.

Допустим, у вас есть" Мастер "и две ветви функций," foo "и" bar", в разработке.

в этом случае ветви существуют только для того, чтобы позволить разным разработчикам работать без конфликтов, когда функции выполнены, их нужно объединить в master, и не важно, были ли эти функции реализованы в разных ветвях.

но вы могли бы иметь другой рабочий процесс, были ветви, "foo" и "bar", относится к независимым модулям в вашей системе.

в этом случае, некоторые коммиты могут изменять файлы вне рамок модуля. Когда вы объединяете эти две ветви с мастером, журнал файлов, вне определенного модуля, может стать запутанным и трудно понять, откуда происходят эти изменения.

вы должны решить, является ли история слияния ветвей важной для вашего рабочего процесса.

и после комментариев, я предпочитаю rebase и pull --rebase рабочего процесса.

Comments

    Ничего не найдено.