2010-06-11 3 views
3

Ниже приведен сценарий, я обычно сталкиваюсь:Cherrypicking против перебазирования

У вас есть набор фиксаций на master или design, что я хочу поставить на вершине production отрасли.

Я склонен создать новую ветку с базой как production вишневых забрать эти коммиты на него, и объединить его с production

Затем, когда я сливаю master к производству, я сталкиваюсь конфликты слияния, потому что даже то, что изменения такие же, но регистрируются как разные фиксации из-за вишневого кирка.

Я нашел некоторые обходные пути, чтобы справиться с этим, все из которых трудоемки и могут быть названы «хаками».

Altho 'Я не слишком много переустанавливаю, я считаю, что тоже создает новый хеш фиксации.

Должен ли я использовать перезагрузку, где я черрипинг. Какие еще преимущества имеют это.

+0

Примечание: мой ответ не совместим с филиалами вы уже подтолкнули (и люди puled с), так как она изменяет SHA1. Но для ветки с недавним контентом, который еще не нажал, это действительный процесс. – VonC

ответ

3

Вы должны сделать rebase --interactive свой дизайн филиал в верхней части производства, где:

  • вы можете изменить порядок фиксаций, начиная с тех, которые вам нужно в производстве
  • вы можете объединить производство до последнего совершить дизайн вы хотите включить (перемотка вперед)
 
    -x--x--x1--x--x2 (design) 
     \ 
     p--p (production) 

с x1 и x2 нуждающейся должны быть включены в производство:

git checkout design 
git rebase --interactive production 

-x 
    \ 
    p--p (production) 
     \ 
     x1'-x2'--x'--x' (design) 

Тогда:

git checkout production 
git merge x2' 
-x 
    \ 
    p--p--x1'--x2' (production) 
       \ 
       x'--x' (design) 

Это позволяет:

  • для проверки текущего дизайна совершает против производства фиксаций (durung в Rebase)
  • реорганизовать конструкция совершает
  • включают первые в производство
  • позволяет последующие слияния от проектирования к производству быть быстродействующим.

Lakshman Prasad добавляет:

Я нажимаю изменения в конце дня большую часть времени. Так что это не очень помогает.Как бы ваши изменения ответа на толкаемом мастер филиал

Я хотел бы сделать то же самое, но с частной отраслью, созданная только для операции:

git checkout master 
git checkout -b master-private 
 
    -x--x--x1--x--x2 (master, master-private) 
     \ 
     p--p (production) 

, то перебазироваться, на этот раз с частной ветвью (т. е. веткой, которую вы никогда не будете нажимать).

git rebase --interactive production 

-x--x--x1--x--x2 (master) 
    \ 
    p--p (production) 
     \ 
     x1'-x2'--x'--x' (master-private) 

Тогда:

git checkout production 
git merge x2' 

-x--x--x1--x--x2 (master) 
    \ 
    p--p--x1'--x2' (production) 
       \ 
       x'--x' (master-private) 

master не выиграет от фиксации переназначения (с более логичным порядком), но, по крайней мере, вы можете нажать master каждый раз, когда вы хотите.

И production может по-прежнему включать именно то, что ему нужно.
Если последующие фиксируетс master такая же проблема (некоторые должны быть включены в production, другие позже), я бы:

  • удалить master-private (мы на самом деле не заботиться о тех, х», копия х совершает от хозяина)
  • сделать master-private ветви на вершине мастера
  • повторно сделать rebase --interactive, с разрешением тактикой неочищенного конфликта (в течение первых фиксаций этой master-private отрасли, за исключением, так как те из них должны быть интегрированы в production филиал)
 
    -x--x--x1--x--x2--x--x3--x (master) 
     \ 
     p--p--x1'--x2'--x3' (production) 
        |  \ 
        |  x''--x'' (master-private) 
        \ 
        x'..x' (old x' from the first master-private) 
+0

VonC, я нажимаю изменения в конце дня большую часть времени. Так что это не очень помогает. Как ваш ответ изменится для нажатой главной ветви. –

+0

@Lakshman: если вы нажимаете, но никто не тянет, то он работает. Но если нет, вам нужно создать специальную частную ветвь, которую вы создаете поверх мастера, прежде чем «перезагрузить интерактивную» ту же (частную, то есть не толкаемую) частную ветвь поверх производства. – VonC

+0

@ Lakshman: Конечно, это означает, что вы никогда не объединяете мастера или дизайн в производство (поскольку это вызовет множество конфликтов). Вы всегда rebase --interactive частная ветка, которую вы делаете, когда вам нужен один поверх мастера или дизайна. – VonC

Смежные вопросы