2015-02-12 3 views
0

Наличие некоторых проблем с отменой git слияния. Что произошло:Отмена нескольких слияний в git

  • Оба вопроса и бета-версия разветвлены от мастера, но тема разветвлена ​​позже бета-версии.
  • Разработчик 1 (D1) вносит изменения в бета
  • Developer 2 (D2) создает тему ветки, делает несколько фиксаций и объединить его в бета
  • При слиянии D2 получает конфликты, так как B и C имеет изменения в то же файлы, как D, E и F
  • D2 выбирает изменения в тему отрасли, делая GIT проверку --theirs & мерзавец добавить/совершить
  • D2 толкает его изменения происхождения
  • D2 делает другой фиксации, объединяет его, затем другая фиксация и слияние тоже (без проблем)
  • D2 толкает эти изменения происхождения слишком
  • D1 бежит мерзавец тянуть
  • D1 жалуется, что изменения, которые он сделал на бета были перезаписаны

    X---D---E---F---M1--M2--M3 beta 
    /   ///
    /  X---X---X---X---X topic 
    / /
    A---B---C---X---X master 
    

Я прочитал некоторые StackOverflow вопросов и спросили # git и закончил работу git revert -m 1 M3, git revert -m 1 M2 и git revert -m 1 M1. D1 был счастлив, что его изменения вернулись.

Теперь я подумал, что смогу git слить тему на бета-версию, но на этот раз выбрать git checkout --ours, но я не мог, потому что ничего не случилось. Я читал https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt, но все еще не понимаю всего 100%.

Я закончил тем, что перезапустил всю мою тему, зафиксировав только одну фиксацию, которую я мог бы затем объединить в бета-версию.

Что мне интересно, если есть более простой способ решить эту проблему?

ответ

1

Причина, по которой вы не смогли слиться во второй раз, заключалась в том, что изменения уже присутствуют в истории, и git не имеет ничего, что могло бы привести к ветке. Когда вы сделали git revert, чтобы отменить слияния, вы создали новые коммиты. Эти коммиты являются инверсией коммитов слияния, которые уже были выполнены. Филиал бета-версии имеет изменения из темы, но коммиты все еще находятся в истории, поэтому, когда вы пытались снова объединиться, слияния нечего. Вы «расстегнули» фиксацию, создав новую, которая изменяет файлы, чтобы вернуться к тому, как они были.

Это то, что ваши филиалы теперь выглядят как

X---D---E---F---M1--M2--M3--R1--R2--R3 beta 
/   ///
/  X---X---X---X---X topic 
/ /
A---B---C---X---X master 

R1, R2 и R3 являются Revert совершает за слияниями, что у вас есть.

Более простой способ разрешить это было бы, чтобы D2 правильно разрешил конфликт слияния. Изменения, произошедшие с D1, были опрокинуты, когда они сделали проверку своих файлов и совершили их.

Если это действительно так, лучший способ решить эту проблему - создать новый коммит, который правильно разрешает конфликт. Пока лицо, разрешающее конфликты слияния, не берет на себя использование опции -m, git добавляет файлы, которые имели конфликты при компиляции слиянием.Тогда вы сможете использовать git log -p -m {MERGE SHA} {FILE}, и вы можете увидеть, какие изменения в файле и скорректировать их.

Чтобы внести изменения в тему, вам нужно будет сделать это вручную. Вы можете получить список файлов, которые отличаются от git diff --name-only beta topic. Затем доставьте файлы до бета-версии, выполнив git checkout topic -- <files>, а затем совершив их.

+0

Итак, чтобы быть ясным, 'git checkout -b wip M1^1; git merge M1^2', чтобы создать правильный результат слияния, затем 'git merge -s ours M1', чтобы получить правильную базу слияния, тогда это простой' git checkout -B beta M3; git merge wip'. – jthill

+0

Я не уверен о шаге 'git merge -s ours M1', но это может сработать. Хотя кажется, что создается несколько дополнительных коммитов, которые будет трудно отследить. – Schleis

+0

Я помню, что сообщение о фиксации слияния имело файлы, у которых были конфликты, но они смотрели на 'git log', теперь он только говорит« Объединить ветку »в бета-версию. – Marlun

Смежные вопросы