Подтвердить что ты не робот

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.

4b9b3361

Ответ 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 и академические проекты, небольшие команды).