Должен ли git-flow видеть более сжатую историю на master, чем развивать?
Прошу прощения за мое невежество здесь, но я пытаюсь применить модель "git-flow" на практике (вручную, без набора инструментов git-flow).
Одна концепция, которая мне показалась интересной, заключалась в том, что будет основная ветвь, для которой каждый коммит будет добросовестным выпуском. Итак, у вас есть тэг v1.0.0 на master, затем тэг v1.1.0, и это хороший журнал длиной 2 коммита при просмотре master. Но тогда вы готовы выпустить v1.2.0 и ваш develop
В Branch есть 1000 промежуточных коммитов, но вы готовы выйти из системы и нажать кнопку, чтобы сказать: "Хорошо, время выхода".
Моя цель - добавить третий коммит на главную временную шкалу. Я вижу, что --squash
опция позволит вам добавить один коммит на мастер, так что вы сможете просмотреть мастер лог и увидеть три ваших коммита: v1.0.0, v1.1.0 и v1.2.0. Как бы ни была длинна и многословна ветка разработки, сквош переводит вас в аккуратную историю для мастера, где каждая версия является официальным релизом... нет никаких шансов получить от этого промежуточный коммит разработки!
Это работает, но меня беспокоило то, что при просмотре сетевого графика это приводит к "отключенному" коммиту. Нет очевидного отношения, которое Git понимает, связывая этот раздробленный третий коммит со всеми этими тысячами дополнений в ветке разработки. Кажется, что он плавает в одиночку, в отличие от диаграмм мерзавца, которые нарисованы от руки и всегда указывают на вещи.
Другие варианты слияния, которые получают "стрелку слияния" (она же множественные родители), похоже, имеют побочный эффект при установлении соединения с промежуточными коммитами. Так что внезапно мастер - это не только эти 3 благословенных коммита... он расширился и включил полную историю всех этих 1000 коммитов в разработке. Вид, кажется, побеждает цель, если целью мастера является ветвь, содержащая только высвобождаемые версии... но внезапно каждое промежуточное состояние имеет фиксацию на мастере. 1003 вместо 3 мастер коммитов.
Визуализация Git немного зловеща в том смысле, что она закрывает дублирование в ветвях. Таким образом, диаграммы, которые я вижу нарисованными на git-flow, представляют собой картинки, а не конечные распечатки git log
и т. д. Я не уверен, что можно ожидать от такого утверждения, как утверждение, что master состоит только из выпусков.
Короче говоря: я не могу найти варианты, которые сохраняют "выглядящие стрелками" отношения между Develop и Master в момент выпуска, если они не содержат полную историю коммитов. Должно ли это беспокоить меня, если я посмотрю на диаграммы git-flow, на которых много стрелок? В сценарии, который я обрисовал в общих чертах, должен ли я просмотреть основную историю и увидеть каждую промежуточную версию разработки, которая была объединена, и историю 1003 коммитов или историю 3 коммитов?
1 ответ
Должен ли git-flow видеть более сжатую историю на master, чем развивать?
Нет. В основном (игнорирование исправлений и выпуск веток-кандидатов): master = develop + merge commitits.
В сценарии, который я обрисовал в общих чертах, должен ли я просмотреть основную историю и увидеть каждую промежуточную версию разработки, которая была объединена, и историю 1003 коммитов или историю 3 коммитов?
Это немного зависит от того, какой конкретный взгляд на основную историю вы запрашиваете. Но, как правило, вы должны увидеть историю 1003 коммитов.
История в git-flow
В более общем плане, и остановимся на некоторых ваших подразумеваемых предположениях: использование git-flow для сохранения и подключения истории коммитов. Так что слияние с --squash
является абсолютным запретом, так как он (как вы уже заметили) не связывает master с линией разработки, которая ведет к его состоянию выпуска. Наоборот, вы абсолютно хотите убедиться, что каждый коммит для мастера всегда является коммитом слияния - полностью противоположным тому, что --squash
делает. Вот почему вы всегда сливаетесь с --no-ff
в мерзавце. (В современных версиях Git вы можете установить merge.ff
возможность false
и перестаньте беспокоиться о том, чтобы забыть --no-ff
.)
Также обратите внимание, что в оригинальной статье Git-Flow Винсента Дриссена эти вопросы рассматриваются.
Опасности сплющивания
Имейте в виду, что плоские (линейные) представления должны будут использовать стратегию выравнивания, чтобы упростить полный график до линейного вида. Это выравнивание может сбить с толку.
В качестве примера для размышления рассмотрим второй голубой узел и пятый желтый узел в вашем примере графика. Предположим теперь, что второй голубой коммит был сделан через день после пятого желтого коммита.
---1-----------------7----------10~~ master
\ / /
2---3---4---5--6-----8---9~~~~~ develop
(Я знаю, что это довольно надуманный пример в контексте git-flow. Без веток-кандидатов на выпуск крайне редко выпустить "второй новейший" коммит из разработки, объединив его с master.)
Если вы теперь сгладить эту историю от master
в перспективе, как бы вы хотели, чтобы это было представлено? Если вы в первую очередь используете хронологический порядок, что дает вам:
10 9 8 7 6 5 4 3 2 1
(Этот хронологический порядок является тем, что по умолчанию git log
и Github "коммиты" вид даст вам.)
Или вы хотите, чтобы коммиты, объединенные коммитом слияния, появлялись рядом друг с другом?
10 9 8 6 7 5 4 3 2 1
(Это "топологическое" упорядочение git log --topo-order
покажет вам.)
Или вы хотите только коммиты, происходящие из одной наследственной линии?
10 7 1
(Это наиболее точно соответствует запросу "показать мне только прямые коммиты для мастера", что, кажется, является частью того, что вы ожидаете увидеть. В настройке git-flow, git log --first-parent
на мастер покажет вам эту точку зрения.)