Я тоже искал случай, когда, скажем, Subversion не удалось объединить ветку и Mercurial (и Git, Bazaar, ...) поступил правильно.
Книга SVN описывает, как переименованные файлы объединяются неправильно . Это относится к Subversion 1,5 , 1,6 , 1,7 и 1,8 ! Я попытался воссоздать ситуацию ниже:
cd /tmp
rm -rf svn-repo svn-checkout
svnadmin create svn-repo
svn checkout file:///tmp/svn-repo svn-checkout
cd svn-checkout
mkdir trunk branches
echo 'Goodbye, World!' > trunk/hello.txt
svn add trunk branches
svn commit -m 'Initial import.'
svn copy '^/trunk' '^/branches/rename' -m 'Create branch.'
svn switch '^/trunk' .
echo 'Hello, World!' > hello.txt
svn commit -m 'Update on trunk.'
svn switch '^/branches/rename' .
svn rename hello.txt hello.en.txt
svn commit -m 'Rename on branch.'
svn switch '^/trunk' .
svn merge --reintegrate '^/branches/rename'
Согласно книге, слияние должно завершиться чисто, но с неверными данными в переименованном файле, так как обновление на trunk
забыто. Вместо этого я получаю конфликт дерева (это с Subversion 1.6.17, самой последней версией Debian на момент написания):
--- Merging differences between repository URLs into '.':
A hello.en.txt
C hello.txt
Summary of conflicts:
Tree conflicts: 1
Никакого конфликта не должно быть - обновление должно быть объединено с новым именем файла. В то время как Subversion терпит неудачу, Mercurial обрабатывает это правильно:
rm -rf /tmp/hg-repo
hg init /tmp/hg-repo
cd /tmp/hg-repo
echo 'Goodbye, World!' > hello.txt
hg add hello.txt
hg commit -m 'Initial import.'
echo 'Hello, World!' > hello.txt
hg commit -m 'Update.'
hg update 0
hg rename hello.txt hello.en.txt
hg commit -m 'Rename.'
hg merge
Перед слиянием репозиторий выглядит так (с hg glog
):
@ changeset: 2:6502899164cc
| tag: tip
| parent: 0:d08bcebadd9e
| user: Martin Geisler
| date: Thu Apr 01 12:29:19 2010 +0200
| summary: Rename.
|
| o changeset: 1:9d06fa155634
|/ user: Martin Geisler
| date: Thu Apr 01 12:29:18 2010 +0200
| summary: Update.
|
o changeset: 0:d08bcebadd9e
user: Martin Geisler
date: Thu Apr 01 12:29:18 2010 +0200
summary: Initial import.
Результат слияния:
merging hello.en.txt and hello.txt to hello.en.txt
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
Другими словами: Mercurial взял изменение из ревизии 1 и объединил его с новым именем файла из ревизии 2 (hello.en.txt
). Разумеется, обработка этого случая необходима для поддержки рефакторинга, а рефакторинг - это точно , что вы захотите сделать на ветке.