Какой лучший способ передать ветку функций GIT -SVN debug-> в trunk?
У меня есть настройка соединительной линии, где идет весь мой производственный код.
Тогда у меня есть ветвь debug
(parent is trunk
), в которую я добавляю код отладки, такой как ведение журнала, варпапы и т.д.... это никогда не должно быть в производстве. Эта ветка редко изменяется.
Наконец, у меня есть ветвь feature
(parent is debug
), где я делаю все свое кодирование с преимуществами отладки. Постоянная фиксация этой ветки.
Я просто хочу знать, есть ли более простой способ переместить мой код feature
в trunk
. Это то, что я сейчас делаю:
- Зафиксировать все изменения в моей ветке
feature
- Переключитесь на
master
и git svn rebase
на изменения других разработчиков.
-
rebase
Моя ветвь feature
на ветку master
(git rebase --onto master debug feature
)
-
merge
для master
-
git svn dcommit
изменения для других разработчиков
-
rebase
debug
to master
(git rebase master debug
)
- удалить
feature
ветвь
- создайте новый
feature
из ветки debug
.
Ответы
Ответ 1
Я бы сказал, что ваш рабочий поток довольно оптимален. Я бы подумал, что вишневый сбор будет излишним (но это зависит от количества коммитов).
Что вы можете сделать, это сквош всех коммитов в один и вишневый выбор/переустановка именно этого.
И кстати, почему просто не пишите простой script, если это то, что вы делаете все время? Git - инструмент немного низкого уровня, поэтому писать дополнительные скрипты, чтобы помочь с повторяющимися задачами, является очень хорошей идеей.
Ответ 2
Хорошо, я скажу ересь, и все будут голосовать, но отпустите. Если вы использовали svn напрямую, ваш рабочий процесс был бы намного проще.
С - реинтегрировать функцию подрывной деятельности, легко поддерживать синхронизацию вашей внешней линии и отладки. Чтобы объединить ветвь вашей функции, вы должны объединить все модификации ветки функции в соединительной линии. Команды будут выглядеть примерно так:
Чтобы объединить соединительную линию для отладки:
cd debug_branch_workcopy
svn merge --reintegrate http://server/project/trunk .
svn commit
Чтобы объединить ветвь функции в магистраль:
svn log --stop-on-copy http://server/project/branches/feature123 #see the last revision listed
cd trunk_workcopy
svn merge -r{revision_above}:HEAD http://server/project/branches/feature123 .
svn commit
Вы можете запустить последнюю команду слияния несколько раз, если вы измените ветвь после слияния. Subversion запомнит уже объединенные версии и не будет пытаться делать их дважды. Если вы находитесь в Windows, бесплатный TortoiseSVN даст вам хороший интерфейс слияния.
Кстати, я бы попробовал не иметь отдельную ветвь только с функциями отладки. Слишком легко сделать ручную ошибку и отправить код отладки в свою производственную магистраль. Я бы использовал что-то более динамичное, чтобы не запускать код отладки во время производства.
Ответ 3
Если я правильно вас понимаю, вы хотели бы иметь свои функции отладки только в своей (довольно статической) ветке отладки, но не в вашей основной ветке. Попробуйте следующее:
Сделайте "поддельное слияние" отладки в master
git checkout master
git merge --no-commit debug
git checkout master . # undo all changes, get the files from master again
git add . # stage all files
git commit
Таким образом, отладка будет объединена с мастером, но ни один из ваших файлов в главном не изменится.
Теперь вы можете просто создать свои ветки функций поверх отладки и объединить их в master, когда закончите. Git теперь знает, что функции отладки удалены из master:
git checkout debug
git checkout -b new_feature # create a new feature branch
# hack, hack, hack
git commit
git checkout master # All works fine...
git merge new_feature # ...so merge into master. Debug code will be stripped here
Вы можете переадресовать ветку отладки на new_feature и после этого удалить ветвь new_feature.
Обратите внимание, что всякий раз, когда вы меняете ветвь отладки, вы должны повторить процедуру поддельного слияния.
Ответ 4
У нас есть отдельная ветка для каждой функции или исправления ошибок, которые мы делаем. Затем они могут быть объединены обратно в багажник, если они были достаточно проверены.
Филиалы могут обновляться, если они становятся немного старыми.
Мы склонны выделять незначительные изменения непосредственно в trunk, но для более значительных изменений мы собираем их в ветки кандидат-релиз, в которую мы объединяем все соответствующие ветки, содержащие изменения, чтобы перейти в live. Эта новая ветка может быть развернута и протестирована, чтобы увидеть, что комбинация изменений нарушает что-либо, прежде чем она окончательно слилась с багажником и переходит в производство.
Этот метод создает множество веток, но поскольку мы называем их связанными с нашей системой отслеживания проблем, их легко отслеживать. Приятно легко включать или исключать любые изменения в релизе.
Надеюсь, что поможет
Ответ 5
Я думаю, что вы ищете git -cherry-pick. Это позволяет применять коммиты от функции на мастере без использования танца перебазы, который вы описываете.
Так как вы собираетесь удалить ветвь функции, вам не нужно видеть явное слияние, которое я предполагаю.
Ответ 6
Ваш рабочий процесс сложный, потому что то, что вы пытаетесь сделать, сложно. Никакой VCS, который я знаю, позволяет вам легко поддерживать некоторые изменения, которые никогда не должны сливаться. В нем много говорится о мощности git, что ваш рабочий процесс не сложнее, чем он.
Я предполагаю, что ваш язык имеет какой-то механизм условной компиляции (директивы препроцессора #IFDEF
и т.д.). Если вы обернете свой код отладки, вместо этого вы столкнетесь с гораздо меньшим трением.