Когда использовать параметр слияния '--no-ff ' в Git
Успешная Модель Ветвления Git рекомендует использовать --no-ff при слиянии веток:
The
--no-ffфлаг заставляет слияние всегда создавать новую фиксацию
объект, даже если слияние может быть выполнено с быстрой перемоткой вперед. Этот
позволяет избежать потери информации об историческом существовании объекта
ветвь и группы вместе все коммиты, которые вместе добавили
особенность. [...]
Да, он создаст еще несколько (пустой) зафиксируйте объекты, но выигрыш будет
гораздо больше затрат. К сожалению, я не нашел способ
сделай--no-ffповедение по умолчанию git слияния еще, но это действительно
должно быть.
понимание рабочего процесса с Git, однако, рекомендует не использовать --no-ff:
Итак, вы добавляете новое правило: "когда вы объединяетесь в своей ветке функций, используйте
–-no-ffв силу новый коммит."Это делает свою работу, и вы двигаетесь
на. [...]
The
--no-ffлейкопластырь, разбитыйbisectиblameтайны все
симптомы того, что вы используете отвертку в качестве молотка. [...]
оба подхода кажутся разумными для различных сценариев, но что считается " хорошей практикой?"
если вы используете --no-ff, а когда нет, почему?
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