Почему git svn dcommit теряет историю коммитов для локальных ветвей?

У меня есть локальный репозиторий git, созданный с помощью git svn clone. Я делаю локальную ветвь, делаю некоторые изменения, переключаюсь обратно на мастер, git svn rebase, и если все это хорошо, я объединять свою ветку обратно в мастер. Затем дерево выглядит примерно так:

alt text http://img.skitch.com/20090108-cjguu3hcci9x2k17mcftamw8f1.jpg

Иногда, позже, когда я git svn rebase снова и получаю удаленные изменения, он теряет тот факт, что a_branch был объединен с основной линией, и дерево выглядит следующим образом:

alt text http://img.skitch.com/20090108-kn3bn1qgi5ijw8ja5ijkd75pa3.jpg

Почему? Могу ли я остановить его? Есть ли простой способ сказать, что ветка была объединена, или я должен удалить свои ветки, когда я закончил, поэтому я не забываю, что было и не было объединено?

Ответ 1

Страница git -svn man рекомендует не использовать слияние. Это один побочный эффект. Поскольку вы восстанавливаете ветвь (git svn rebase немного похожа на git pull --rebase "), она эффективно перезаписывает историю. Он может выкинуть любые локальные коммиты, которые уже находятся в восходящем потоке в подрывной деятельности, такие как слияние, и сохранить только те коммиты, которые действительно существуют в репозитории svn. Так как тривиальное объединение слияния локальной ветки не имеет эквивалента в SVN, вы совершаете только" реальные" изменения, поэтому это единственные изменения, которые наблюдаются в вашей новой ветки главной ветки.

В идеале ваша локальная ветвь должна объединяться только с быстрой перемоткой вперед, т.е. не создается слияние. Если это не так, то вы должны подумать о том, чтобы переустановить свою локальную ветвь на мастер вместо ее слияния. Это позволяет полностью скрыть фиксацию слияния.

Ответ 2

Потому что вы проходите через svn. Когда вы это сделаете, вы потеряете много информации (например, вы потеряете автора).