RUDE

Как работают DVCS (DRCS)?

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

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

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


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

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


560
5

Ответы:

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


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

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

How does bazaar know that I renamed a file?

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

What if I rename two files as part of the same commit?

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

What happens when I refactor by putting half of the file's contents into a new file, re-indenting everything and losing some whitespace in nearly every line?

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


Решено

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

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

Http://revctrl.org/CategoryMergeAlgorithm

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


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


Хорошая статья для чтения

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