Я слышал много хорошего о системах DVCS, в частности о bazaar. Помимо концепции распределенного репозитория, я вижу два основных преимущества, которые рекламируются: слияние лучше автоматизировано и переименование выполняется правильно.
Может ли кто-нибудь указать мне на какой-нибудь текст, объясняющий, как именно работают улучшения? Как bazaar узнает, что я переименовал файл? Что, если я переименую два файла как часть одного коммита? Что произойдет, если я проведу рефакторинг, поместив половину содержимого файла в новый файл, изменив все отступы и потеряв пробелы почти в каждой строке?
Другими словами, я хотел бы услышать мнение людей, использующих bazaar (или другой DVCS) в реальной жизни, или людей, которые знают, как это (они) работает. Неужели слияние действительно намного лучше? И как этого добиться?
Связанный вопрос с полезным ответом:
Почему в Mercurial проще выполнять ветвление и слияние, чем в Subversion?
Я не знаком с базаром, но 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.