Итак, ваша ситуация такова (время течет слева направо):
--o--o--o---M--R--o <- master
\ /
A--B--C--D--E <- devel
Вы слили коммиты A, B и C в master, а затем отменили изменения в R, что является обратным к A + B + C.
Когда вы объединяете две ветви (не имеет значения, в какую из них вы объединяетесь), вы получите все с обеих сторон со времени последнего общего предка .
В этом случае общим предком является C, поэтому вы получаете R, D и E. С точки зрения devel, это выглядит так, как будто A, B и C были обращены, но с точки зрения мастера это как будто случились только D и E.
Решение 1: отменить возврат
Вы можете вернуть R на мастер или вспомогательную ветку, которую вы производите от мастера. Затем вы объединяете их:
--o--o--o---M--R--o <- master
\ / \
A--B--C R' <- aux (git revert R)
\ \
D--E---M' <- devel
Теперь вы можете слить devel в master.
Решение 2. Перебазируйте свою ветку
Вы перестраиваете свою ветку devel с новыми коммитами, используя git rebase --force-rebase
:
--o--o--o---M--R--o <- master
|\ /
| A--B--C--D--E <- (abandoned)
\
A'-B'-C'-D'-E' <- devel
Теперь вы можете слить devel в master.
Решение 3: Скрыть нежелательного общего предка (только для экспертов)
Вы строите эту историю временно:
--o--o--o---M--R--o <- master
\
A--B--C--D--E <- devel
Сделайте это, установив трансплантат:
git replace --graft M M^
Это говорит Git, что коммит M
имеет только одного родителя, M^
. Теперь вы можете слить devel в master.
Наконец, вы восстанавливаете реальную историю:
git replace --delete M
[ПРАВКА: используйте git replace
вместо устаревшего файла трансплантатов.]