Git svn workflow - ветки функций и слияние
Я использую git -svn со следующим рабочим процессом сейчас
git clone <SVN TRUNK URL> #done once
впоследствии, когда я работаю над функцией
git branch featureZ
git checkout featureZ
#make edits for featureZ
git commit
git checkout master
git svn rebase # fetch changes from server
git checkout featureZ #go back to branch
#git merge master
git rebase master #get the changes from SVN->master onto the branch now. Optional if I want the branch to be current. (EDITED: Got from the answer given below)
#make edits for featureZ
git commit #featureZ completed
git checkout master
git merge featureZ #getting featureZ onto master. Prepare to send to SVN
git svn dcommit #push featureZ back to SVN
Теперь некоторые примечания, когда я выполняю git слияние функции с мастером, все отдельные коммиты в ветке featureZ объединяются, как хорошо, со мной.
Сообщение фиксации заменяется как "объединенное с featureZ". Это можно исправить с помощью merge fmt msg.
Теперь мой вопрос:
Есть ли что-то, что может пойти не так с этим документооборотом или нужно позаботиться. Я прочитал в git -svn manual, что слияние не должно выполняться при работе с git svn. Является ли то, что я делаю в своем рабочем процессе, это то, что они имеют в виду? если да, то какая проблема это вызовет? Одно дело, я не хочу делать что-то, что связано с магистралью SVN.
Ответы
Ответ 1
SVN не может обрабатывать нелинейную историю (она просто не имеет обозначений). Итак, что вы хотите сделать, это rebase вместо слияния, поскольку он сохраняет линейную историю с SVN (это указано на странице git -svn man здесь.
Чтобы разработать, линейные истории тривиальны. Они идут по прямой (от A до B от C до D). В то время как нелинейные истории могут идти от (от A до B до C, B до D, тогда C + D к E - другими словами, они просачиваются в ветки).
Rebasing даст вам линейную историю. Помните, что переустановки должны быть сделаны из ваших частных локальных веток. Например, если у вас есть 2 ветки: мастер и экспериментальный. Вы проверили бы экспериментальный и выполнили 'git мастер переустановки' предпочтительно с флагом -i. Выполнение этого наоборот может привести к нежелательным побочным эффектам.
Затем вы мастер проверки и слияния с изменениями из экспериментальной ветки. Ваша история должна оставаться линейной.
Ответ 2
Вы должны посмотреть этот вариант слияния:
git checkout master
git merge --squash featureZ
Он будет скворовать все коммиты на ветке в одну фиксацию на главной ветке. Вы получите возможность редактировать сообщение журнала, которое инициализируется кратким описанием того, что было сделано на ветке.
У этого недостатка есть недостаток, заключающийся в том, что отдельные лица, участвующие в ветки признаков, не записываются. Кроме того, вы должны сделать это только один раз и больше не работать над ветвью, потому что она не зарегистрирована как правильное слияние, и любое последующее слияние может дать нежелательные результаты.
Ответ 3
Ответ, заданный fake-code-monkey-rashid, верен. Это меньше ответа и больше упрощения.
Вы можете svn rebase/dcommit из любой ветки git. Единственным хозяином, использующим использование, было бы, если бы у вас были другие локальные изменения, необходимые для слияния с изменениями с featureZ.
git branch featureZ
git checkout featureZ
#bunch of changes
git commit
git svn rebase
# solve any conflicts
git svn dcommit
Если вы хотите сохранить чистый мастер, вы можете либо git svn rebase
, либо git merge featuresZ
Ответ 4
Вместо git -svn вы можете использовать SubGit. Это серверный инструмент, который автоматически синхронизирует репозитории Subversion и Git.
Вы можете использовать любой рабочий процесс Git и любой доступный Git клиент, без дополнительных клиентских инструментов.
Учитывая ваш сценарий:
git branch featureZ
git checkout featureZ
# make edits for featureZ
git commit
git checkout master
Вы можете действовать следующим образом:
-
Полностью отбросить функциональную ветвь.
git merge featureZ
git push origin refs/heads/*
-
Восстановите ветвь функции поверх главной/внешней линии.
git rebase featureZ
git push
-
Сквош фиксируется из ветки признака.
git merge --squash featureZ
git commit
git push
Как только вы нажимаете изменения, перехватчики SubGit переводят ваши изменения в версии Subversion.
Дополнительная информация:
- SubGit во многом превосходит git -svn - лучший перевод слияния, поддержка EOL и mime-типа и т.д.
- SubGit нуждается в локальном доступе к репозиторию Subversion (он использует пользовательские перехватчики);
- SubGit - это коммерческий продукт с некоторыми бесплатными опциями (open-source и академические проекты, небольшие команды).