Проблема возникает из-за того, что касается git, b
уже находится в master
(наряду с более поздними изменениями, которые произошли, чтобы отменить b
). Это мешает не только проверке, но и фактическому результату объединения.
Существует несколько методов, обычно используемых для решения этой проблемы. Иногда вы «возвращаете назад»; иногда вы копируете B
, чтобы создать новый коммит B'
, который делает то же самое, что и B
, но топологически не «уже в master
».
В вашем случае вы хотите последнее. (Единственный чистый способ «отменить возврат» был бы на master
, что снова пропустило бы проверку. Вместо этого вы хотите, чтобы изменения с B
отразились на вашей ветви.)
Итак, у вас есть
... a -- b -- d <--(your_branch)
\
!b <--(master)
(я переименовал c
с вашей фотографии в !b
, чтобы лучше описать, что это такое - возврат b
.)
Вам нужно выражение, которое разрешается до a
.
Это может быть хеш коммита для a
(или сокращенная форма хэша коммита); если у вас есть это в наличии, я бы просто использовал это.
Или, в этом примере, вы можете использовать your_branch~2
, потому что your_branch
имеет 2 коммита после a
(это b
и d
).
Если вы не уверены, сколько коммитов на your_branch
, вы можете использовать что-то вроде $(git merge-base your_branch master)^
(обратите внимание на ^
в конце). Это зависит от того факта, что b
является общим предком вашей ветви и мастера, но потерпит неудачу, если между двумя ветвями произошли какие-либо более поздние слияния.
В любом случае, какое бы выражение вы ни придумали, я буду использовать a
в качестве заполнителя в следующей команде. Таким образом, вы бы сделали «принудительный ребаз» из your_branch
.
git rebase -f a your_branch
Это должно дать вам
d
/
a -- b -- !b <--(master)
\
b' -- d' <--(your_branch)
(Я все еще показываю исходный коммит d
на этой диаграмме, но вывод git по умолчанию больше не будет показывать его, потому что он недоступен. Через некоторое время он будет удален сборщиком мусора. b'
похож на b
за исключением того, что master
оно не доступно, а d'
похоже на d
, за исключением того, что его родитель b'
.
Это перезапись истории your_branch
, поэтому, если вы ранее push
ed your_branch
, вам теперь придется ее принудительно нажать (git push --force-with-lease
). Если есть шанс, что у кого-то еще есть fetch
ed your_branch
- и особенно если они уже основали работу над этим - тогда вам нужно сообщить им о том, что вы делаете. (См. Документацию git rebase
в разделе «Восстановление из исходной перезагрузки».) (Если это может быть проблемой, вы можете избежать этой проблемы, создав новую ветку, которая никогда не была push
ed, и перебазировав ее вместо прямой перебазировка your_branch
.)
Как только это будет сделано, вы сможете выполнить свой запрос на извлечение.