Использование git / mercurial в проектах с постоянным рефакторингом? - PullRequest
20 голосов
/ 10 декабря 2008

Я пытаюсь понять, есть ли у меня какие-либо аргументы в пользу использования git / mercurial.

Я работаю над проектами java и c #, в которых обычно работают 5-20 человек. общая цель («релиз»). Большинство разработчиков являются профессиональными разработчиками, которые код рефактора все время . Так, где типичное ядро ​​Linux имеет большое количество относительно независимые изменения в отдельных файлах, мы имеем постоянный поток изменений рефакторинга - часто попадаются на лот файлов и лот кода. Здесь никто не боится менять код.

Теперь с помощью Subversion мы решаем эту проблему, оставаясь очень близко к SVN HEAD. У некоторых из нас даже есть автоматизированный svn up, запускающий трансляцию jabber сервера сборки. Большинство из нас также узнали (или научитесь очень быстро), как планировать нашу работу, чтобы держаться ближе к SVN HEAD. Если вы делаете серьезный рефакторинг, мы постепенно сгибайте исходное дерево в новом направлении вместо того, чтобы уходить слишком долго. Иногда вы просто планируете рефакторинг и запуск в менее загруженных местах. Через несколько лет работать таким образом, это становится второй натурой. Большинство из нас просто никогда не покидают «зону комфорта»: 2 часа от свн головы. Автоматизированная сборка и svn head - это проект «импульс», и нам это нравится.

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

И мерзавец, и меркуриал звучат круто, мерзавец чуть больше, так как я больше похож на МакГайвера, чем на Джеймса Бонда. Но когда дело доходит до создания случая для фактического переключения, создается впечатление, что мы с Линусом живем на двух разных планетах. Большую часть времени мы хотим, чтобы наши команды оставались сосредоточенными на HEAD.

Как GIT может улучшить контроль версий? Как GIT позволит мне улучшить мой процесс? Я динозавр подрывной деятельности?

Ответы [ 6 ]

19 голосов
/ 10 декабря 2008

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

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

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

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

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

  1. Пройдены тесты самостоятельно
  2. Пройденные тесты после того, как изменения основных веток были согласованы с мягкой ветвью

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

(Что также ограничивает область решения проблем, потому что вам нужно по большей части тестировать только свои собственные изменения, а когда вы «сделали», только тогда вам нужно беспокоиться о том, что сделали все остальные, и что они также должны проходить тесты, что означает, что когда не терпит неудачу, вам нужно только посмотреть, что вы сделали, чтобы решить проблему)

Но буду ли я постоянно обновляться с центральная репо в мою мягкую ветку? Это действительно суть моего проблема

Прелесть филиальной системы в том, что вы можете при необходимости вытянуть «все, что было сочтено стабильным другими», в свою локальную копию.

«Непрерывное обновление» становится ненужным, потому что у вас не возникают те же проблемы.

a  b   center
         |
         |
         /      Key:   / - | \   = Flow
/----<---|             < >       = Flow Directions
|  /--<--/             *         = Commit 
*  |     |             T         = Test
|  *     |             M         = Merging with "Current" state of common branch
*  |     |             C         = Tests Complete and Current state is "sane"
|  *     |
T  |     |
|  T     |
|  C     |
|  |/-<--/
*  M     |
|  T     |
*  C     |
|  \--->-\
*  /---<-/
T  |     |
C  *     |
|/-----<-/
M  |     |
T  *     |
|  T     |
*  C     |
|  |/-<--/
*  M     |
T  T     |
C  \-->--\
|/---<---/
M        |
T        |
C        |
\---->---\
         |

Кроме того, из-за того, как работает система, позже это также может произойти:

a  b   center
|  |     |
T  |     |
C  *     |
|/</     |
M  |     |
|  *     |
T        |
C        |
|/----<--/
M        |
T        |
C        |
\-->-----\
         |

Вся концепция того, что они являются "головой" в таком сценарии, исчезает. Это десятки голов, которые вы видите перспективными.

Я мог бы также добавить, что эти логические ветви, хотя и отображаются здесь как отдельные, вполне могут представлять либо отдельные места для оформления покупок, либо просто разные мягкие ветви на отдельной машине. На самом деле a & b может быть одним разработчиком.

По сути, «Постоянно обновлять мою программную ветвь из основной ветки» концептуально не имеет смысла. Потому что на самом деле, будут изменения, которые еще не представлены в основной ветке, и когда вы узнаете, что они были перенесены или нет? SVN дает вам эту ложную иллюзию «единичного» состояния кода, когда в действительности, когда один пользователь открывает файл в своем текстовом редакторе, он фактически создает мягкую ветвь с очень коротким сроком службы, происходящее изменение, о котором никто не знает, и чтобы эта иллюзия была поддержана так, как вы думаете, она работает, по сути, пользователь должен фиксировать после каждого персонажа, что вряд ли практично. Таким образом, на самом деле люди привыкли к тому, что разные места «несинхронизируются» друг с другом, и изучают способы их решения, чтобы больше не было проблем.

Кроме того, «постоянное обновление моего дерева с изменениями всех остальных» имеет ключевую проблему: у вас слишком много отвлекающих факторов, вас постоянно бомбардируют все, что делают все остальные, и если они делают серия из 1 строки обязуется протестировать что-то, что они не могут протестировать на своей машине, тогда у вас будет кошмар с постоянно меняющимся файлом, и пользователи, видящие случайные изменения, не смогут их понять.

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

Если у вас есть какие-либо сомнения

Начните с чего-то простого и не переходите к «холодной индейке», некоторые концепции в DSCM могут быть немного пугающими (я видел трагический отказ многих понять концепцию вертикально сложенных мягких ветвей), переместить Небольшая несущественная часть кодовой базы для Git / Mercurial и немного поиграйте с ней, поэкспериментируйте с преимуществами и тем, что он может сделать. Нет лучшего доказательства, чем испытать это на себе, и все мои милые объяснения вряд ли дадут вам то, что вам нужно понять, и выучить их можно только, попробовав его и потерпев неудачу несколько раз (потому что неудача является ключевой частью обучения)

11 голосов
/ 10 декабря 2008

То, как ваша команда использует Subversion, означает, что происходит довольно много усилий по слиянию. Почти каждый раз, когда член команды обновляется до самой последней основной ветки, они объединяют свою рабочую копию с последней основной, даже если на этом этапе они не фиксируют свои собственные изменения. Накладные расходы на слияние имеют тенденцию к тому, чтобы быть продуктом коэффициента фиксации и количества членов команды, и, поскольку частота фиксации является функцией числа членов команды, ваши издержки на управление исходным кодом составляют O (N ^ 2).

В модели Mercurial / Git это объединяющее усилие будет разделено между командами. Если вы регулярно извлекаете наборы изменений у всех, то часто вы обнаружите, что другие уже выполнили почти всю работу по слиянию, которую вы, возможно, должны были выполнить. И в случаях, когда слияние что-то сломало, часто люди уже исправят это. Согласование пары ветвей должно быть выполнено только один раз, и поскольку скорость создания новых ветвей пропорциональна количеству членов команды, накладные расходы на управление исходным кодом составляют O (N).

Я бы ожидал, что 20 разработчиков, работающих близко к руководству в одной ветви, вероятно, потребуют изрядного количества работ по слиянию (работе с конфликтами и регрессам из-за независимой разработки), поэтому я буду удивлен, если вы попробовал Mercurial / Git и не нашел полезного выигрыша в производительности. Как вы думаете, вы могли бы управлять 100 разработчиками с вашим текущим прогрессом? Я бы оценил число разработчиков ядра Linux в 4000, и тем не менее они много чего сделали, и общие накладные расходы на управление исходным кодом должны быть приемлемыми.

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

Следовательно, действительно большой выигрыш в том, что пользователи Mercurial / Git больше не боятся веток. До BitKeeper (насколько мне известно, инструмента, который действительно ввел этот способ работы), долгое время ветвились бомбы замедленного действия, время от времени взрывающиеся и занимавшие неделю, чтобы восстановиться. Теперь мы можем без колебаний разветвляться, с уверенностью, что сможем объединиться позже. В здоровой команде другие могут видеть ваши ветки в процессе и объединить их со своими, а потом приложить усилия, если они сочтут это целесообразным. В централизованной модели, если у каждого разработчика было 3 или 4 активных ветви, и я исправляю, говоря, что это O (N ^ 2), то вы просто увеличили накладные расходы на управление исходным кодом в 3ish ^ 2 раза, т.е. порядка, которого, вероятно, достаточно, чтобы действительно повредить общее состояние здоровья, богатства и счастья. Это основная причина, по которой члены команды (и менеджеры) обычно боятся филиалов в централизованных системах и стараются свести их к минимуму.

2 голосов
/ 10 декабря 2008

Я думаю, что Mercurial это здорово. Особенно с TortoiseHg .

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

Допустим, вся команда состоит из 20 человек, но вы хотите протестировать и разработать только одну функцию с командой из 3-4 человек, прежде чем вносить в основной репозиторий. Затем с помощью Mercurial вы можете просто синхронизировать код между кодировщиком 3-4, пока вы не будете полностью удовлетворены, прежде чем совершать операции с основным репозиторием.

Или вы даже можете быть своей собственной командой, например. когда вы хотите протестировать свой код на нескольких платформах перед фиксацией в основном репозитории.

2 голосов
/ 10 декабря 2008

дал вам один голос за хорошее настроение в трещине svn / динозавра.

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

2 голосов
/ 10 декабря 2008

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

1 голос
/ 10 декабря 2008

то, что вы описали в SVN, можно сделать с помощью git / mercurial

...