Git и SVN через слияние веток git svn. Какая процедура лучше? - PullRequest
0 голосов
/ 14 октября 2019

Я использую git svn для синхронизации источников между git и SVN. Мне нравится работать с ветками, и в этом проблема.

Я создаю ветку с помощью: git svn branch mybranch

После этого я проверяю ветку. После того, как я изменил источники, я готов объединить mybranch с главной веткой.

Как дела? git merge не работает, а git merge --no-ff создает один коммит. Используете ли вы cherry-pick, чтобы выбрать эти коммиты? Как интегрировать изменения из mybranch в master, не теряя коммиты, созданные вами в mybranch?

Большое спасибо!

1 Ответ

0 голосов
/ 16 октября 2019

Ветвление и слияние в SVN значительно отличается от ветвления и слияния в Git. Git's намного лучше. SVN не может обработать большинство слияний, которые делает git. Вот как я бы порекомендовал выполнить объединение:

case 1) Создание персональной ветки объектов, затем объединить ее обратно в общую ветвь SVN

В этом случае создайте ветку объектов только в Git,Зафиксируйте по необходимости в git. Не стесняйтесь делать перебаз / сквош так часто, как это необходимо. Когда вы будете готовы объединить свои изменения обратно в общую ветку SVN:

case 1a) Вы хотите, чтобы все ваши отдельные коммиты были сохранены в SVN

Перебазируйте вашу ветку Feature так, чтобы все ее фиксацииследуйте за кончиком общей ветки. Затем перенесите вашу прямую ветку вперед в общую ветку. Это оставляет линейную историю в вашей общей ветке SVN. Это важно. SVN не может обрабатывать нелинейные истории. Теперь вы можете перенести свою общую ветку в SVN (сначала обновитесь из SVN).

git checkout myfeature
git rebase master    # we need a linear history on master, so rebase
git checkout master
git merge myfeature --ff-only  # ff-only ensures a linear history
git svn rebase  #update from SVN
git svn dcommit #finally, commit to SVN

case 1b) В истории SVN требуется только один коммит.

В этом случае выполните слияние --squash. Это добавит в вашу общую ветку один коммит, который вы можете отправить в SVN. Ваш ветвь функций должен быть удален (или заменен тегом, если вы хотите сохранить отдельные коммиты в истории git), так как git не будет иметь истории слияния, и будущие слияния, сделанные из ветви, могут вызвать ненужные конфликты.

вариант 2) Вам необходимо объединить две ветви SVN.

ВСЕГДА объединяйте ветки SVN в SVN, а не Git! SVN не может обрабатывать Git-слияния. Если вы объединитесь в Git, SVN не сможет объединить эти ветви без проблем в будущем. Git все еще должен быть в состоянии обнаружить слияние, если SVN сделал это.

Кроме того, вы можете делать все слияния в Git. Поскольку SVN не будет ничего знать об этих слияниях (он не будет знать, что коммиты являются коммитами слияния), SVN не сможет объединить эти ветви без большого ручного вмешательства. SVN использует «mergeinfo» для отслеживания того, какие коммиты уже применены к каким ветвям, и объединение в Git не обновит mergeinfo SVN. Таким образом, ваш выбор - всегда объединять ветки SVN в SVN или всегда в Git.

...