2015-11-20 3 views
1

Моя проблема:
В настоящее время я работаю над главной ветвью.
Мой коллега сливает свою ветвь, чтобы справиться с B.
Затем я продолжаю работу с серверными коммитами C, D, E.
После этого я обнаружил, что слияния не должно было быть там. И я хочу вернуть слияние, но все равно сохранить C, D, E.
Любое предложение ???
Git Undo Merge, но не удаляется позже.

Пример здесь:

0--A--B--C--D--E 
    /
    G--H 

И это то, что я хочу, чтобы это было:

0--A--C--D--E 
+0

Checkout А и вишневого выбор C в E, возможно – Martin

ответ

3

Откат

Вы должны быть в состоянии сделать GIT Revert:

git checkout master 
git revert B -m <mainline> 

Где mainline - целое число, которое определяет ветвь для использования в качестве основного. Вы можете легко вычесть какой из них использовать, набрав

git log B 

Вы должны увидеть что-то вроде:

commit B 
Merge: A H 

И тогда ваш магистральный является 1, если вы хотите, чтобы вернуться в состояние A или 2, если вы хотите для возврата в состояние H.

В этом случае можно было бы написать:

git revert B -m 1 

Это создаст новый фиксации с B коммит удалены. Ваша история будет выглядеть как:

0--A--B--C--D--E--F 

Если F совершить на самом деле является отмена из B.

Как говорится в git-revert manpage, полезно проверить Revert a faulty merge How-To.

перебазирования

Другой вариант сделать:

git checkout master 
git rebase -i A 

однако это изменит вы мерзавец историю и не может быть то, что вы хотите, особенно если другие люди работают на том же хранилище.

новый редактор всплывет что-то вроде:

pick A 
pick G 
pick H 
pick C 
pick D 
pick E 

И вы должны изменить его на:

pick A 
drop G 
drop H 
pick C 
pick D 
pick E 

Сохраните файл и выйдите из редактора, чтобы продолжить процесс перебазирования.

Ваша история должна теперь выглядеть так: 0--A--C--D--E.

Вишневый собирание

Или вы можете создать новую ветку и вишневый выбрать коммиты вы хотите:

git checkout A 
git checkout -b new-master 
git cherry-pick C..E 
+0

хорошее решение! Спасибо! –

+0

вы не можете вернуть слияние с помощью команды, которую вы предоставили –

+1

Вы правы, я только что обновил ответ с помощью правильной команды. – jeremija