2009-09-25 2 views
2

В моем репозитории Git, я слился ветвь «B» в «хозяина», получая следующую структуру:Сочетание истории объединенных ветвей в GIT?

--> A --> B --> C --> D (branch master) 
    |   | 
    F --> G --> H  (branch B) 

теперь я хочу, чтобы объединить ветви, чтобы получить следующую историю:

--> A --> B --> F --> G --> H --> D 

Как я могу это сделать?

С уважением, Йохен

ответ

6

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

Что вам нужно, чтобы сделать то, что вы хотите, это начало git rebase

Давайте вместе с еще одной схемы фиксации граф. Для того, чтобы оставить оригинальные ветви нетронутыми мы будем работать на новой ветке называется rebasing

git checkout -b rebasing master 

--> A --> B------------------- --> C --> D   (branch master) (branch rebasing) 
    \       /
     +----+-> F --> G --> H -+     (branch topic) 

Просто перебазировать все между topic и rebasing на topic.

git rebase --onto topic topic rebasing 

или сделать то же самое с более короткой командой

git rebase topic 

-> A -> B -----------------> C -> D    (branch master) 
    \     /
    +---+> F -> G -> H +       (branch topic) 
          \ 
          +---------> B -> D  (branch rebasing) 

Теперь, когда мы просто смотрим на rebasing мы имеем прямую форму линии A к D.

-> A -> F -> G -> H -> B -> D      (branch rebasing) 

Таким образом, единственная проблема сейчас может быть, что порядок отличается от того, что вы ожидали. Вы можете легко исправить это, перестроив фиксации git rebase --interactive, если хотите.

Или вы переустанавливаете все в несколько более сложном виде. Давай начнем сначала.

--> A --> B------------------- --> C --> D   (branch master) (branch rebasing) 
    \       /
     +----+-> F --> G --> H -+     (branch topic) 

Сначала возьмите все от C до кончика master и поставить его на кончике topic (он же D.) (Он же H.):

git rebase --onto topic C master 

-> A -> B ----------------> C -> D    (branch master) 
    \     /
    +----> F -> G -> H +       (branch topic) 
          \ 
          +---------> D   (branch rebasing) 

Один последний перебазирования, на конец, и мы закончили.

git rebase B 

    +----> F -> G -> H +       (branch topic) 
    /     \ 
-> A -> B ----------------> C -> D    (branch master) 
     \ 
      +------------------------> F -> G -> H -> D (branch rebasing) 

Voila!

-> A -> B -> F -> G -> H -> D      (branch rebasing) 
1

Я бы расшириться от А, а затем вишневый выбор в фиксаций, которые вы хотите

так:

git checkout -b my-branch A 
git cherry-pick B 
git cherry-pick F 
git cherry-pick G 
git cherry-pick H 
git cherry-pick D 
Смежные вопросы