Сменить корень ветки в git - PullRequest
15 голосов
/ 19 апреля 2011

Я использую 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 - это то, что я ищу, но страницы руководства мне не помогаютСпасибо за ваши ответы!

Ответы [ 4 ]

11 голосов
/ 19 апреля 2011

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 и работал над ней.
Так как это ветвь для развертывания, тоскорее всего, так (т.е. никто не работал над клоном указанной ветки).

3 голосов
/ 19 апреля 2011

да, вы можете использовать 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.используя рабочий процесс на основе слияния, вы позже сможете увидеть свои конфликты в (комбинированном) diff-файле коммитов слияния.

3 голосов
/ 19 апреля 2011

Я не понимаю, почему вы хотите потерять свою первоначальную ветку.Что бы я сделал в таком случае:

 # 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

РЕДАКТИРОВАТЬ : добавлена ​​схема

В результате вы получите нечто подобное

       C---D---E deploy
       /        \_______ 
      /                  F deploy1.1
     /                  /
A---B---F---G--H--I--J--K--L
     \                   \
    v1.0                 V1.1
2 голосов
/ 19 апреля 2011

git rebase должен работать для вас:

git checkout deploy
git rebase master~1

или

git rebase v1.1

Взгляните на http://progit.org/book/ch3-6.html - это должно помочь вам лучше понять ребаз, я думаю

...