Вопрос

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

Может ли кто-нибудь указать мне на какой-нибудь текст, объясняющий, как именно работают улучшения?Как bazaar узнает, что я переименовал файл?Что, если я переименую два файла как часть одного коммита?Что произойдет, если я проведу рефакторинг, поместив половину содержимого файла в новый файл, изменив все отступы и потеряв пробелы почти в каждой строке?

Другими словами, хотелось бы услышать мнение людей, использующих bazaar (или другой DVCS) в реальной жизни, или людей, которые знают, как он (они) работает.Действительно ли слияние настолько лучше?И как это достигается?


Связанный вопрос с полезным ответом:

Почему в Mercurial ветвление и слияние проще, чем в Subversion?

Это было полезно?

Решение

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

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

http://revctrl.org/CategoryMergeAlgorithm

По крайней мере, hg, bzr и git могут использовать внешние утилиты слияния.

Другие советы

DVCS обеспечивает более эффективное слияние, отслеживая родительские версии слияний.В Subversion при слиянии одной ветки с другой вы теряете информацию о том, откуда произошло слияние.В DVCS, таком как Bazaar или Git, «объединенная» ревизия имеет две родительские ревизии.

Переименование обрабатывается по-разному в разных DVCS.Git, например, вообще не отслеживает переименования, поскольку для Линуса это было не важно.Mercurial записывает их как «копировать старый файл в новый, удалить старый». По словам Марка Шаттлворта, основатель Canonical, Darcs и Bazaar — единственные DVCS, которые корректно обрабатывают переименование файлов.

Как bazaar узнает, что я переименовал файл?

Переименования задаются пользователем так же, как добавление или удаление файлов.Использовать "bzr rename <old> <new>"команда, чтобы пометить файлы или каталоги для переименования.Если вы уже переименовали файл в дереве, вы можете использовать команду «--after" вариант.

Что, если я переименую два файла как часть одного коммита?

Затем вы вводите "bzr rename <old> <new>" один раз для каждого файла.Bazaar не пытается угадать, какие файлы были переименованы.

Что произойдет, если я проведу рефакторинг, поместив половину содержимого файла в новый файл, изменив все отступы и потеряв пробелы почти в каждой строке?

Затем вы вводите "bzr add" в новом файле, поскольку на самом деле вы его не переименовываете.

Ниже приводится обсуждение того, как darcs (http://darcs.net) занимается патчами - http://darcs.net/manual/node9.html.

Хорошая статья, которую стоит прочитать

http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/

Я не знаком с базаром, но git не отслеживает переименования файлов.Для git это выглядит как удаление и добавление.Однако git достаточно умен, чтобы видеть, что содержимое файла уже существует в его репозитории, и будет отслеживать его положение в системе.Если вы разделите файлы или объедините их, достаточно разумно отслеживать сегменты кода (блобы) и хранить эту информацию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top