2011-10-23 2 views
4

У меня следующая ситуация:Git: раскол совершать в другой ветви

root -- A -- D ------------- H ------master 
    \   \    \ 
    \   \    \ 
     - B -- C -- E -- F -- G -- I -- J -- dev 

Commit «F» содержит исправления ошибок, что в первой, казалось, не имеет отношения освоить отделение, но через несколько недель оказалось важным , Все уже было сделано и подтолкнуло.

Но еще одна проблема заключается в том, что команда «F» содержит несколько изменений, и только один из них относится к мастеру. Так что я хотел бы это:

  • Split F на 2 отдельных фиксаций (один для соответствующих изменений [F1], другой для другого [F2])
  • Merge F1 с мастер

I не нужно менять историю филиалов.

Могу ли я сделать что-нибудь, кроме того, ручной diff + patch?

Я представляю себе что-то вроде

root -- A -- D ------------- H ---K--master 
    \   \  /-------\--/  
    \   \ /-F1-F2-\ \-----\   
     - B -- C -- E ------- F -- G -- I -- J -- dev 

(простите за неаккуратную линию искусства)

+0

Я бы с механической коробкой дифференциала и патч, что в этом плохого? PS: вы должны делать небольшие коммиты;) – Simon

+0

Конечно, и теперь я принуждаю всех разработчиков к этому. Но в отличие от git, я не могу изменить прошлое. :) – user986654

ответ

8

Я бы сделать следующее: первый вишневого выбор совершить F с --no-commit к вашему мастеру отделению, а затем этап изменения, которые вы нужно в мастер, бросить все остальное. Я знаю, это не звучит как идеальное решение, но при слиянии F освоить, вы также получите все предку фиксаций F (от Dev филиала: ECB):

git checkout master 
git stash 
git cherry-pick --no-commit F 
git reset && git add -p 
# alternatively reset already staged changes: 
git reset -p 
git commit 
git reset --hard 
git stash pop 
Смежные вопросы