Измените корень ветки в git
Я использую git и хочу изменить базу выходящей ветки. Это вызвано системой развертывания, которая вытаскивает эту явную ветвь в мою производственную среду. При планировании релизов я создаю тег каждый раз, когда хочу жить. Но моя ветвь также имеет специальные изменения, поэтому git reset --hard v1.0
не будет работать.
Вот небольшой пример. Я хочу это
C---D---E deploy
/
A---B---F---G master
\
v1.0
чтобы стать этим
C---D---E deploy
/
A---B---F---G---H---I---J---K master
\ \
v1.0 v1.1
Может быть, git rebase
- это то, что я ищу, но страницы с людьми не помогают мне. Спасибо за ваши ответы!
Ответы
Ответ 1
git rebase
должен, как вы говорите, позволить вам изменить базу развертывания:
git checkout deploy
git rebase v1.1 # using the tag
(or:
git rebase J # SHA1 of J
or
git rebase master~1
)
Но вы получите
C'---D'---E' deploy
То есть, SHA1 коммандной части ветки deploy
переписывается, что не так уж плохо, если никто не клонировал ветку deploy
и не работал над ней.
Поскольку это ветвь для развертывания, это, скорее всего, имеет место (т.е. Никто не работал над клоном упомянутой ветки).
Ответ 2
Я не понимаю, почему вы хотите потерять свою оригинальную ветку. Что бы я сделал в таком случае:
# create a new branch from your 1.1 tag
git checkout -b deploy1.1 v1.1
# merge your existing branch into this one
git merge deploy
EDIT: добавлена схема
В итоге вы получите что-то вроде этого
C---D---E deploy
/ \_______
/ F deploy1.1
/ /
A---B---F---G--H--I--J--K--L
\ \
v1.0 V1.1
Ответ 3
git rebase должен работать для вас:
git checkout deploy
git rebase master~1
или
git rebase v1.1
Взгляните на http://progit.org/book/ch3-6.html - вам следует лучше понять, как лучше передумать
Ответ 4
да, вы можете использовать rebase для достижения желаемого эффекта. следующая команда проверяет ветвь deploy
и воспроизводит все ее коммиты, недоступные через v1.1
, поверх v1.1
:
git rebase v1.1 deploy
(верным будет: git rebase --onto v1.1 v1.0 deploy
)
но зачем восстанавливать и изменять историю? вы можете просто изменить основную линию разработки в свою ветку развертывания:
git checkout deploy
git merge v1.1
это оставит все ваши хеши фиксации неповрежденными, тогда ваша история будет выглядеть так (M
является фиксацией слияния):
C---D---E-----------M deploy
/ /
A---B---F---G---H---I---J---K master
\ \
v1.0 v1.1
так как конфликты могут возникать во время rebase, а также во время слияния, у вас будет история конфликтов слияния при использовании подхода, основанного на слиянии. с rebase у вас нет истории конфликтов, которые произошли во время операции rebase. используя рабочий процесс, основанный на слиянии, вы можете позже увидеть свои конфликты в (комбинированном) различии коммитов.