Продай мне распределенный контроль версий - PullRequest
21 голосов
/ 02 апреля 2010

Я знаю тысячи подобных тем, плавающих вокруг.Я читаю по крайней мере 5 тем здесь в SO. Но почему я все еще не убежден в DVCS?

У меня есть только следующие вопросы (обратите внимание, что я эгоистично беспокоюсь только о проектах Java)

  • В чем преимущество или ценность совершения локально?Какие?действительно?Все современные IDE позволяют отслеживать ваши изменения?и при необходимости вы можете восстановить определенное изменение.Кроме того, у них есть возможность пометить ваши изменения / версии на уровне IDE!?
  • , что если я сломаю жесткий диск?Куда ушел мой локальный репозиторий?(так как это круто по сравнению с регистрацией в центральном репо?)
  • Работа в автономном режиме или в самолете.Что в этом такого? Для того, чтобы создать релиз с моими изменениями, я должен в конечном итоге подключиться к центральному репозиторию.До этого не имеет значения, как я отслеживаю свои изменения локально.
  • Хорошо, Линус Торвальдс отдает свою жизнь Гиту, а ненавидит все остальное.Этого достаточно, чтобы слепо петь хвалу?Линус живет в другом мире по сравнению с офшорными разработчиками в моем проекте среднего размера?

Pitch me!

Ответы [ 10 ]

14 голосов
/ 03 апреля 2010

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

Пока, однажды, я не набрал git init и вдруг оказался в git-хранилище.

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

13 голосов
/ 03 апреля 2010

Надежность

Если ваш жесткий диск незаметно начинает повреждать данные, вы, черт возьми, хотите знать об этом. Git получает SHA1-хеши всего, что вы делаете. У вас есть 1 центральный репозиторий с SVN, и если его биты будут незаметно изменены неисправным контроллером жесткого диска, вы не узнаете об этом, пока не станет слишком поздно.

И так как у вас есть 1 центральный репо, вы просто взорвали свой единственный спасательный круг .

С git, каждый имеет идентичный репо с историей изменений, и его контенту можно полностью доверять благодаря SHA1 его полного образа. Так что, если вы сделаете резервную копию своего 20-байтового SHA1 вашего HEAD, вы можете быть уверены, что когда вы клонируете из какого-нибудь ненадежного зеркала, у вас будет точно такое же репо, которое вы потеряли!

Ветвление (и загрязнение пространства имен)

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

"test123 - блин, уже есть test123. Давайте попробуем test124. "

И каждый должен видеть все эти ветви с глупыми именами. Вы должны поддаться политике компании, которая может идти по принципу «не делайте веток, если вам действительно не нужно», что предотвращает множество свобод, которые вы получаете с помощью git.

То же самое с совершением. Когда вы делаете коммит, вам лучше быть действительно уверенным, что ваш код работает. В противном случае вы нарушаете сборку. Нет промежуточных коммитов. Потому что они все идут в центральный репо.

С мерзавцем у тебя нет этой чепухи. Разветвите и передайте локально все, что вы хотите. Когда вы будете готовы представить свои изменения остальному миру, вы попросите их отстраниться от вас или отправите их в какое-то «основное» git-репо.

Производительность

Поскольку ваше репо локально, все операции VCS быстрые и не требуют обходов и переноса с центрального сервера! git log не нужно идти по сети, чтобы найти историю изменений. SVN делает. То же самое со всеми другими командами, так как все важные вещи хранятся в одном месте !

Смотрите Линус говорит об этих и других преимуществах перед SVN.

10 голосов
/ 12 апреля 2014

Я Mercurial разработчик и работал консультантом Mercurial. Поэтому я нахожу ваши вопросы очень интересными и надеюсь ответить на них:

  • В чем преимущество или ценность совершения локально? [...]

Вы правы в том, что в эти дни среды IDE могут отслеживать локальные изменения, помимо простых отмен / повторов. Однако между этими моментальными снимками файлов и полной системой контроля версий все еще существует разрыв в функциональности.

Местные коммиты дают вам возможность подготовить свою "историю" на местном уровне, прежде чем вы отправите ее на рассмотрение. Я часто работаю над некоторыми изменениями, включающими 2-5 коммитов. После того, как я сделаю коммит 4, я мог бы вернуться и немного изменить коммит 2 (возможно, я увидел ошибку в коммите 2 после того, как я сделал коммит 4). Таким образом, я буду работать не только над последним кодом, но и над последними двумя коммитами. Это тривиально возможно, когда все локально, но становится сложнее, если вам нужно синхронизироваться с центральным сервером.

  • что если я сломаю жесткий диск? [...] так как это круто по сравнению с регистрацией в центральном репо?

совсем не круто! : -)

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

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

Изменения часто остаются незафиксированными, потому что:

  1. Они на самом деле не закончены. В коде могут быть отладочные операторы печати, могут быть неполные функции и т. Д.

  2. Фиксация включается в trunk, и это опасно с централизованной системой, поскольку это влияет на всех остальных.

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

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

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

Люди, которые используют DVCS, часто в любом случае отправляют свои «локальные» коммиты на удаленный сервер в качестве решения для резервного копирования бедного человека. Они не продвигаются к главному серверу, на котором работает остальная команда, а к другому (возможно, частному) серверу. Таким образом, они могут работать изолированно и при этом сохранять резервные копии вне сайта.

  • Работа в автономном режиме или в самолете. [...]

Да, мне никогда не нравился этот аргумент. У меня хорошее интернет-соединение в 99% случаев, и я не летаю достаточно, чтобы это стало проблемой: -)

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

Инструменты DVCS разработаны на основе идеи о том, что люди могут работать в автономном режиме. Это имеет ряд важных последствий:

  • Слияние ветвей становится естественной вещью. Когда люди могут работать параллельно, разветвления естественным образом появляются в графе коммитов. Следовательно, эти инструменты должны быть действительно хорошими при объединении ветвей. Инструмент, такой как SVN, не очень хорош для объединения !

    Git, Mercurial и другие инструменты DVCS объединяются лучше , потому что у них было больше испытаний в этой области, а не напрямую, потому что они распределены.

  • Больше гибкости. С DVCS вы можете свободно перемещать изменения между произвольными репозиториями. Я часто буду толкать / тянуть между моим домашним и рабочим компьютерами, не используя настоящий центральный сервер. Когда все готово для публикации, я помещаю их в такое место, как Bitbucket.

    Многосайтовая синхронизация больше не является «корпоративной функцией», это встроенная функция. Поэтому, если у вас есть оффшорное местоположение, они могут настроить локальное хранилище-концентратор и использовать его между собой. Затем вы можете синхронизировать часы локальных узлов, ежедневно или когда вам это удобно. Для этого не требуется ничего, кроме cronjob, который запускает hg pull или git fetch через равные промежутки времени.

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

    Ожидается, что с DVCS я смогу выполнять поиск по ключевым словам по ревизиям кода (а не только по сообщениям о фиксации). При централизованном инструменте обычно требуется настроить дополнительный инструмент индексирования.

6 голосов
/ 02 апреля 2010

DVCS для меня очень интересно, так как:

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

    • жизненный цикл разработки (с репозиториями, созданными только для определенного типа коммитов, таких как тот, который предназначен для выпуска в профессии, для целей развертывания)
    • одиночные задачи (вы можете отправить и обновить резервную копию репозитория, даже в форме только из одного файла )
    • проект взаимозависимостей (когда команда проекта A ожидает, пока командный объект B наконец завершит коммитирование с центральным репо, он может попросить B «передать» промежуточную разработку в виде прикрепленного zip-файла в письме. Теперь все, что нужно сделать A, это добавить B-репо в качестве потенциального пульта, получить его и посмотреть)
  • приносит новый способ создания / потребления ревизий с:

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

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

2 голосов
/ 02 апреля 2010

Ваш главный аргумент о том, что IDE выполняет отслеживание для вас, неверен. Большинство IDE на самом деле не имеют такой функциональности, кроме неограниченных уровней отмены. Подумайте о ветвлениях, слияниях, возвратах, фиксации сообщений (журналов) и т. Д., И я уверен, что даже IDE, на которую вы ссылались, терпит неудачу. Особенно я сомневаюсь, что он отслеживает ваши коммиты - вполне возможно, в нескольких разных ветках, над которыми вы работаете - и правильно отправляет их в хранилище, как только вы выходите в интернет.

Если ваша IDE на самом деле все это делает, я бы на самом деле назвал ее распределенной системой контроля версий.

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

РЕДАКТИРОВАТЬ: вы можете использовать DVCS, как централизованное хранилище, и я бы даже рекомендовал делать это для проектов малого и среднего размера, по крайней мере. Наличие единого центрального «авторитетного» хранилища, которое всегда онлайн, упрощает многое. И когда эта машина выходит из строя, вы можете временно переключиться на одну из других машин, пока сервер не будет исправлен.

1 голос
/ 02 января 2016

Я не собираюсь ничего продавать здесь.

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

Единственное реальное преимущество заключается в том, что вам не нужно подключение к главному центральному хранилищу. Кто-то может сказать, что выгода Git заключается в том, что разработчик может зафиксировать локально, подготовив большую комбинацию патчей, а затем перетащить их в благословенное центральное репо, но IMO это довольно неинтересно. Разработчик может использовать частную полку или ветку в хранилище Subversion для работы над своей задачей, а затем объединить ее с магистральной линией (например, / trunk) или другой ветвью.

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

Еще одним недостатком централизации является то, что Git технически не может отслеживать операции переименования или копирования . Он просто пытается угадать, был ли файл переименован или скопирован на основе содержимого файла . Это приводит к таким забавным случаям: svn to git миграция, сохраняющая историю скопированного файла (Парень спрашивает, почему история файла была потеряна после SVN> Git миграции,).

• Что если я сломаю жесткий диск? Куда ушел мой локальный репозиторий? (так как это круто по сравнению с регистрацией в центральном репо?)

С Git, если вы сломали локальное устройство хранения данных (HDD, SSD и т. Д.) И в нем были изменения, которые не были перенесены или перенесены в репозиторий Git, то вам не повезло. Вы только что потеряли свое время и свой код. В дополнение к этому, сбой жесткого диска с локальным репозиторием Git может на некоторое время остановить процесс разработки: Сбой SSD Линуса Торвальда, остановка разработки ядра Linux .

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

• Хорошо, Линус Торвальдс отдает свою жизнь Гиту и ненавидит все остальное. Этого достаточно, чтобы слепо петь хвалу? Линус живет в другом мир по сравнению с оффшорными разработчиками в моем проекте среднего размера?

Для такого проекта, как ядро ​​Linux, в котором раньше использовался BitKeeper, Git - лучшая система контроля версий! Но я бы сказал, что Git не всем подходит.

Выбирай с умом!

1 голос
/ 03 апреля 2010

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

В другом недавнем сообщении говорится, что Subversion не пытается стать DVCS

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

1 голос
/ 02 апреля 2010

Интересный вопрос.

Я не опытный пользователь DVCS, но мое ограниченное воздействие было очень позитивным.

Мне нравится возможность двухэтапного коммита. Меня это устраивает.

Некоторые преимущества, которые приходят на ум:

  1. Лучшая поддержка слияния. Branch-Merge больше напоминает гражданина 1-го класса в DVCS, тогда как в моем опыте централизованных решений я обнаружил, что это больно и сложно. Отслеживание слияний теперь доступно в SVN, но все еще медленно и громоздко.

  2. Большие команды. DVCS не только для однопользовательских коммитов. Вы можете выдвигать и извлекать коммиты между командами, прежде чем вносить свой вклад в главный репозиторий (или нет). Это неоценимо для определенных видов сотрудничества.

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

Обратите внимание, что мой опыт работы с DVCS больше связан с Mercurial, чем с Git. Исходя из опыта CVS / SVN, я обнаружил, что с Mercurial (Hg) кривая обучения намного проще. Недавно добавленная поддержка Google Code для Mercurial также является благом. ... Я даже пойду настолько далеко, что скажу, что мой первоначальный ответ на Git был отрицательным, но больше с точки зрения удобства использования, чем что-либо связанное с DVCS

1 голос
/ 02 апреля 2010

Если вы не видите ценности местной истории или локальных сборок, то я не уверен, что какое-либо количество ответов на вопрос изменит ваше мнение.

Особенности истории IDE ограничены и неуклюжи. Они совсем не похожи на полную функцию.

Один хороший пример того, как этот материал используется, - это различные проекты Apache. Я могу синхронизировать GIT-репо с Apache SVN-репо. Тогда я могу работать неделю в частном филиале самостоятельно. Я могу свести изменения с репо. Я могу сообщить о своих изменениях, в розницу или оптом. И когда я закончу, я могу упаковать их в один коммит.

0 голосов
/ 13 июня 2010

Скорее всего, вам никто здесь ничего не продаст.Если вам нужны функции git, просто git init.Если он вам не подходит, просто не надо.

Если вы еще не знаете функции git, введите git vs (обратите внимание на конечный пробел) в поиске Google и посмотрите результаты изautocomplete.

Я предпочитал Notepad, а не IDE, пока мне не понадобились функции Netbeans.Кажется, что это тот же самый случай.

Как вы знаете, было много успешных проектов вообще без VCS.

PS.Продажа git нарушает его лицензию!;)

...