Почему git svn dcommit теряет историю коммитов слияния для локальных веток?
У меня есть локальный репозиторий Git, созданный с git svn clone
, Я делаю локальную ветку, делаю некоторые изменения, переключаюсь обратно на master, git svn rebase
и если все хорошо, я объединяю свою ветку с мастером. Тогда дерево выглядит примерно так:
http://img.skitch.com/20090108-cjguu3hcci9x2k17mcftamw8f1.jpg
Иногда позже, когда я git svn rebase
и получить некоторые удаленные изменения, он теряет тот факт, что a_branch был объединен с основной линией, и дерево выглядит так:
http://img.skitch.com/20090108-kn3bn1qgi5ijw8ja5ijkd75pa3.jpg
Это почему? Могу ли я остановить это? Есть ли простой способ сказать, что ветка была объединена, или я должен удалить свои ветви, когда я закончу, чтобы я не забыл, что было и не было объединено?
2 ответа
Страница man git-svn рекомендует не использовать слияние. Это один побочный эффект. Поскольку вы перебираете ветку (git svn rebase немного похожа на "git pull --rebase"), она эффективно переписывает историю. Он может отбрасывать любые локальные коммиты, которые уже находятся в восходящем потоке в subversion, такие как слияние, и сохранять только те коммиты, которые действительно существуют в репозитории svn. Поскольку тривиальный коммит слияния локальной ветви не имеет эквивалента в SVN, вы фиксируете только "реальные" изменения, так что это единственные изменения, замеченные в вашей новой перебазированной основной ветке.
В идеале ваша локальная ветвь должна слиться только с ускоренной перемоткой, т. Е. Слияние не генерируется. Если это не так, то вам следует рассмотреть возможность перестановки вашей локальной ветки на master вместо ее слияния. Это позволяет избежать создания коммитов слияния полностью.
Потому что вы проходите через SVN. При этом вы потеряете много информации (например, вы потеряете и автора).