2016-10-18 13 views
0

Я использую Git уже давно, но сегодня я столкнулся с проблемой слияния некоторых изменений с ветки на ветку. Эта ситуация у меня есть - у меня есть 4 филиала: 2 основных и 2 функциональных. Предположим, что они называются так: main_branch1, main_branch2, feature_branch1 и feature_branch2. Разделы функций всегда создаются от main_branch1, и когда вы завершаете свою работу, вы объединяете их обратно в нее. Затем в некоторый момент времени их изменения объединяются с main_branch2. Никаких слияний между двумя основными ветвями нет! Здесь проблема. В моем случае прямо сейчас feature_branch1 создан с main_branch1 в определенное время, сделал некоторые изменения внутри него и объединил его обратно в основную ветку. Затем я снова создал feature_branch2 с main_branch1, там тоже изменился, а также снова объединил его. Теперь я хочу объединить feature_branch2 в main_branch2, но только изменения, которые у него есть, потому что когда я его создал, я получил изменения от feature_branch1. Я пробовал с git rebase, но не мог добиться этого, и мое рабочее дерево выглядело как полный беспорядок.Git - как объединить ветвь функции, но исключить некоторые коммиты?

Вот график, чего я хочу достичь и как мое дерево должно выглядеть следующим образом:

o---------------o---------------------o main_branch1 
\   /\     /
    o-----------o \    /
feature_branch1 \    /
        \   /
        o-----------o 
        feature_branch2 \ 
            \ 
            o-----------o main_branch2 

Как вы можете видеть, когда я создал feature_branch2, я уже получил изменения от feature_branch1, которые были объединены в main_branch1 , Как я могу исключить их, когда я сливаю feature_branch2 в main_branch2? Но мне нужно будет добавить их позже, когда я решит объединить feature_branch1 в main_branch2 ...

Любая идея, как я могу это сделать? Благодаря! :)

ответ

1

Посмотрите на rebase --onto - он позволяет вам переустанавливать, но дает вам немного больше контроля над конкретными связанными обязательствами.

git rebase --onto <new_base_branch> <old_base_branch> <branch_to_rebase>

В вашем случае, команда может выглядеть примерно так:

git rebase --onto main_branch2 <hash_of_commit_at_base_of_main_branch2> feature_branch2

Это кассу main_branch2 и один за другим применять коммиты feature_branch2 поверх него. Затем вы можете объединить feature_branch2 в main_branch2.

Это то, что вы хотите достичь? Трудно точно знать без диаграммы текущего состояния ветвей!

+0

Да, я просмотрел параметр '--onto', но я не уверен, как это мне поможет. Дело в том, что компиляция слияния из ветки 'feature_branch1' уже находится в' feature_branch2', когда я ее создаю. Теперь я хочу объединить только 'feature_branch2' в' main_branch2', но без этого компиляции слияния из 'feature_branch1'. График выше показывает, что на самом деле. – yep4u

1

Если вы хотите, чтобы убрать изменения с feature_branch1, вам нужно будет проверить новую ветку до ее создания, а вишня выбрать коммиты от feature_branch2, после чего вы сможете полностью слить позже.

git checkout -b nofeature1 <SHA before feature_branch1> 
git cherry-pick <first SHA feature_branch2>^..feature_branch2 
git checkout main_branch2 
git merge nofeature1 
+0

Так что мне нужно создать новую ветку без изменений из 'feature_branch1' каждый раз, когда я слияние с' main_branch2'? – yep4u

+0

@nogravity Если вы начинаете с точки зрения «main_branch1», тогда да, потому что в ее истории есть «feature_branch1». Я думаю, было бы лучше создать новую базовую ветку без 'feature_branch1' в своей истории. В противном случае вы будете постоянно сливаться обратно в 'main_branch1', тогда вы, вероятно, захотите также все другие изменения, так что это будет выглядеть как git cherry-pick .. main_branch1' каждый раз. –

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

  • Нет связанных вопросов^_^