Отменить слияние git, сохранить коммиты, которые появились позже

Я наткнулся на эту проблему с моим репо:

У меня есть следующая структура дерева ветвей:

(branch)         a - b - c - d - e - f - g
               /           /
(master)  1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 ...

Здесь я отделился от мастера при фиксации 1, когда создавал ветку, а затем объединил мастер с веткой при фиксации 5.

Проблема в том, что при слиянии я отбросил некоторые изменения и хотел бы отменить их, чтобы снова слить master в свою ветку, как будто слияния в пятом коммите никогда не было.

Другими словами, как мне отменить последствия слияния в коммите 5 (или коммите d) без потери моих изменений в последующих коммитах? (а именно, е - ж - г)

Моя цель состоит в том, чтобы затем иметь возможность слить master обратно в ветку, но теперь я буду более осторожен со своим слиянием.

Спасибо.


person Levko Ivanchuk    schedule 14.06.2013    source источник
comment
Ваша ветка была передана другим людям (нажата)? Или можно перебазировать?   -  person Richard Hansen    schedule 14.06.2013
comment
Он был загружен на сервер, но его никто не трогал. Да, это нормально, если я сохраняю изменения. Итак, скажем, если вы хотите перебазироваться в c, это нормально, пока я сохраняю e-f-g, но теряю d.   -  person Levko Ivanchuk    schedule 14.06.2013
comment
Похоже, что этот вопрос является дубликатом этого вопроса. Это?   -  person Richard Hansen    schedule 14.06.2013
comment
Я уже пробовал подход в ответе. Однако эти две ветки давно не синхронизированы, и я просто не вижу commit d в оболочке. Однако последний ответ кажется многообещающим, я попробую это завтра.   -  person Levko Ivanchuk    schedule 14.06.2013


Ответы (1)


(branch)         a - b - c - d - e - f - g
               /           /
(master)  1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 ...

git rebase --onto c d g
git checkout -b newbranch

(newbranch)                e' - f' - g'
                          /
(branch)         a - b - c - d - e - f - g
               /           /
(master)  1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 ...

Если вы довольны результатами, то выбросьте старую ветку и переименуйте новую ветку:

git branch -D branch
git branch -m newbranch branch

Наконец нажмите новую ветку.

git push -n origin branch # check what you're about to push
git push -f origin branch # -f is required to rewrite history; be careful
person Peter Lundgren    schedule 14.06.2013
comment
Я использовал вашу идею создания новой ветки, однако после этого я выбрал другой подход. Я в основном выбрал коммиты e-f-g... из ветки в новую ветку. Но спасибо, что направили меня на верный путь! - person Levko Ivanchuk; 14.06.2013