2013-09-06 5 views
1

У меня есть следующая ситуация в моем хранилище git на данный момент.Как развить две ветви git вокруг неудачного слияния

HEAD -- 0 -- 1 -- ... -- 3 -- 5 master 
     \-- 2 -- ... -- 4 --/ branch-1 

Отверстие «ветка-1» было разветвлено у мастера некоторое время назад (см. Фиксацию 5).

При фиксации 0 я хотел слить его обратно в мастер, но все изменения, произошедшие в master между коммитами 1 и 3, были перезаписаны. Эффективное создание

0 -- 2 -- ... -- 4 -- 5 master 

Поскольку мои коллеги не могли продолжить работу над этим состоянием, я вернул слияние. Таким образом, я поставил HEAD таким же, как 1. Используемая команда была бы «git revert -m 2 0».

Но теперь я хочу, чтобы мои изменения снова слились. На этот раз я надеюсь, что это будет успешным. Мне нужно, чтобы создать что-то вроде:

-2 -- HEAD -- 0 -- 1 -- ... -- 3 -- 5 master 
    \   \-- 2 -- ... -- 4 --/ 
    \--- -1 ------/ 

Это будет новое обязательство -1, что позволяет избежать отказавшего слияния 0 и возвращается в в чистом состоянии у меня было (чистое состояние я достигнуто путем возврата) до слияния.

Однако просто попытка слить 2 в HEAD не работает. Я думаю, что это связано с тем, что они уже объединены в 0.

ответ

1

Проблема в том, что вы использовали git revert вместо git reset --HARD. git revert создает новую фиксацию, которая переопределяет изменения предыдущей фиксации. git reset делает то же самое, но не путем создания нового коммита, а путем отбрасывания ошибочного фиксации. Из-за этого ошибочная фиксация все еще сидит в вашей истории.

Слияние 2 с HEAD не работает, потому что вы пытаетесь слиться со своей собственной историей. Это похоже на попытку слить 4 на 2.

Что вам нужно сделать, выбросьте 0 и создайте новый.

Во-первых, сбросить мастер обратно в 1 с помощью:

git reset --HARD 1 

Затем достичь чистой, слиться-состояние готовности (и вы можете сделать, если совершает вам нужно).

После этого, убедитесь, что ветвления 1 точек 2:

git checkout branch-1 
git reset --HARD 2 

Reach чистый, слияние-состояние готовности там тоже. Затем объединить их обоих:

git checkout master 
git merge branch-1 

Проверьте результат слияния. Если он не работает, как вы хотите, начните с повторного запуска мастера и ветви-1. Если вы не можете работать слиянием, вы также можете попробовать переустановить.Это позволит сгладить историю с выглядеть:

2' -- .. -- 4' -- 1 -- .. -- 3 -- 5 

После слиты или перебазировать две ветви вместе, вы можете перебазироваться любые изменения, которые были введены после того, как вернулся фиксации (Заменить 2' с самой последней фиксации из новое слияние/перебазироваться вы создали, не использовать ГОЛОВА, как она будет меняться разом выполнения команды):

git rebase 2' -2 

После этого ваша история должна выглядеть так:

-2' -- .. -- 2' -- .. -- 4' -- 1 -- .. -- 3 -- 5 

Или, если вы слились, а не перебазировали:

-2' -- .. -- 0' -- 1 -- ... -- 3 -- 5 
       \ -- 2 -- ... -- 4 --/