рабочий процесс мерзавца: одноразовые слияния и мерзавец-rerere - какой смысл?

Как большинство людей, плохо знакомых с Мерзавцем, у меня была своя доля беспорядка, пытающегося дешифровать варианты использования, применимые к слиянию мерзавца и перебазе мерзавцев. Я думаю, что наконец решил, что до получающегося рабочего состояния копии они дают Вам то же самое. Кроме того, они оба результат в тех же конфликтах. Если это неправильно, обеспечьте пример для просвещения меня.

С моей точки зрения основное преимущество для использования переосновы вместо слияния (если Ваши изменения не продвинули или вытянули) должно сохранить историю линейной. То, что я действительно не понимаю, является обоснованием позади разработки мерзавца-rerere.

Из страниц справочника мерзавец-rerere, как предполагается, помогает Вам в случае, где Вы пытаетесь разрешить конфликт, который Вы ранее разрешили. Пример, к которому я собираюсь обратиться, найден по http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html.

Если политика Вашего проекта не состоит в том, чтобы постоянно объединять изменения от магистрали в Ваше ответвление темы (как ядро Linux), вышеупомянутый пример говорит для создания "одноразовых" фиксаций слияния. По существу объедините ведущее устройство в свою тему, запустите тесты, чтобы удостовериться, что все все еще работает, затем сделайте "сброс мерзавца - твердый HEAD^", по существу выбрасывание слияния фиксирует. Позже, когда Вы создаете другую "одноразовую" фиксацию слияния, мерзавец-rerere помогает Вам в разрешении конфликтов, которые Вы уже решили в frst одноразовом слиянии.

Кто-то может объяснить, почему вместо того, чтобы пройти всю проблему создать временную фиксацию слияния, разработчик вместо этого просто не повторно основывал бы свою тему на ведущее устройство? Разве это не точка переосновы мерзавца - получают изменения, но избегают слияния? Разве это не выполняет то же самое, и предполагающий, что никто не вытянул Ваши изменения ответвления темы, разве это не было бы намного более простым подходом? throw-away-merge+git-rerere рабочий процесс действительно только для случая, когда Ваши изменения были продвинуты/вытянуты?

Один заключительный вопрос - Linus процитирован, "Но если я вижу большое 'Ответвление слияния linus' в Ваших журналах, я не собираюсь вытягивать от Вас, потому что Ваше дерево, очевидно, имело случайное дерьмо в нем, которое не должно быть там..." У Linus также была бы проблема с постоянными переоснованиями?

18
задан Josh 18 June 2010 в 18:19
поделиться

2 ответа

Вы правы, перебазирование и слияние могут дать одно и то же окончательное дерево. Однако история, которую они создают, очень разная, и контроль версий, конечно же, связан с историей. Вы выразили предпочтение линейной истории; это действительно желательно в локальном масштабе, в то время как слияния помогают записывать более масштабное взаимодействие функций, исправлений и т. д.

Простой ответ на ваш главный вопрос (почему бы просто не перебазировать) состоит в том, что иногда есть правильное место для начала ветки, и в этом случае вам следует выполнить слияние, а не перебазирование.

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

Точно так же все тематические ветки где-то начинаются. В какой-то момент вы захотите сохранить эту историю. Вы упоминаете один из очевидных случаев (другие отказались от вашей работы), но это может быть что-то гораздо менее очевидное. Может быть, есть какое-то взаимодействие с другими функциями, может быть, у этой функции есть подфункции, и вы пытаетесь сохранить всю эту иерархию.

Конечно, если ветка локальная и нет причин фиксировать ее базу, проще, как вы говорите, просто перебазировать ее и все готово. Но иногда это неправильно.

Ваш последний вопрос на самом деле совсем о другом, не имеет ничего общего с конфликтами слияния.Линус сказал, что в контексте слияний, которые делать не нужно . Это в значительной степени вопрос философии ветвления и слияния. Джунио Хамано написал отличную запись в блоге по этой самой проблеме. Краткая цитата, которая резюмирует обсуждаемую тему:

когда вы объединяете тематическую ветку 'add-frotz' со своей 'master' веткой, вы, очевидно, включаете новую функцию 'frotz', но, что более важно, вы заявляете что желательно иметь эту функцию 'frotz' в ветке 'master'

Линус не хочет, чтобы вы все время объединяли эту странную ветку под названием 'linus', потому что явно вы не объединяете какую-то конкретную тему который желательно иметь у себя в ветке. Вы постоянно объединяете ветвь восходящего потока с тематической веткой, что является совершенно неправильным направлением. Вам не нужны все материалы от мастера (или линуса) для развития вашей темы. Вы должны закончить свою тему, а затем слить ее другим способом, вверх по течению в мастер! Нежелательно иметь все содержимое мастера в вашей тематической ветке. (А мастер одного разработчика - это действительно тематическая ветка с точки зрения интегратора.)

Итак, у Линуса нет проблем с частыми слияниями; у него проблема с бесцельными и контрпродуктивными слияниями. (И, как правило, если вы убедитесь, что ваши слияния выполняются по уважительной причине, они не будут частыми - и они почти никогда не будут слияниями нижестоящих.) Если ваши переустановки выполняются по уважительной причине, и они попадают в историю лучше, тогда они хорошие, хоть и частые.

23
ответ дан 30 November 2019 в 08:03
поделиться

Разве это не то же самое, и если предположить, что никто не внес изменения в вашу ветку темы, не будет ли это намного более простым подходом? Действительно ли рабочий процесс выброса-слияния + git-rerere предназначен только для случая, когда ваши изменения были внесены / извлечены?

Вы попали в точку. Ребазинг хорош для веток, которые вы еще не опубликовали; rerere полезен для веток, которые вы опубликовали (т. Е. Веток, для которых изменение настроек было бы неуместным / раздражающим для последующих разработчиков).

Будет ли Линус также иметь проблемы с постоянным перемещением?

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

7
ответ дан 30 November 2019 в 08:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: