2017-02-15 2 views
1

У меня длинная линейная история git. Я хочу переустановить некоторые коммиты, так что я создал ветвь функции и объединил ее с мастером, используя git merge --no-ff master.Перерыв линейного git совершается на две объединенные ветки

Текущий

A -> B -> C -> D -> E -> F 
         master 

Желаемая

    master 
A -> B -> E -> F 
     \ /
     C -> D 
      feature 

Я думал, что сделать что-то вроде

git checkout D 
git checkout -b feature 
git rebase B 
git merge --no-ff E 

Но D уже B в своей истории, так это ничего не делать. Я знаю, как переустанавливать EB (Split a git branch into two branches?), но здесь, в нужной версии E, есть два родителя.

Некоторые дополнительные сведения о том, что первоначально мой проект был структурирован как Desired, а E действительно является фиксацией слияния. Я каким-то образом линеаризую свою историю, используя git rebase, чтобы удалить некоторые нежелательные файлы из старых коммитов.

ответ

1

Вы можете сделать это путем сброса мастеру B, чтобы быть в состоянии создать слияние совершить E:

git checkout D 
git checkout -b feature 
git checkout master 

         master 
A -> B -> C -> D -> E -> F 
       feature 

git reset --hard B 

    master 
A -> B 
     \  
     C -> D 
      feature 

git merge --no-ff feature 

       master 
A -> B -> E 
     \ /
     C -> D 
      feature 

git cherry-pick F 

        master 
A -> B -> E -> F 
     \ /
     C -> D 
      feature 

Возможно, это не кратчайшее решение, но оно делает все в нужном порядке, поэтому это упрощает понимание.

Примечание: Не забудьте сохранить где-то хэш Fgit reset --hard B, как сделает это стать оборванных совершить.

0
git checkout -b feature D 
git checkout -b master F 
git rebase -i B # change pick C, pick D to drop C, drop D 
git merge D