Редактировать: Получается, что не - это то, о чем просил ОП, но я оставлю это здесь на случай, если кто-то должен будет найти решение, которое включает переписывание истории.
Сначала создайте новую ветку, если вы хотите сохранить коммит слияния локально, чтобы коммит не "исчезал" после перемещения master
:
git branch erroneousMerge master
Если другие разработчики также сделали коммиты после ошибочного слияния, они тоже должны это сделать!
Затем сбросить master
, чтобы обратиться кпоследний коммит перед слиянием;скажем, это коммит e498b2...
:
git checkout e498b2
git branch -f master
Теперь вы можете нажать исправленный master
(-f
означает, что вы хотите, чтобы сервер сбросил свою ветвь master
на коммит, которыйвы указали на это, хотя этот коммит является предком того, на который он указывает в репозитории):
git push -f origin master
Теперь другие разработчики могут обновить свои master
, чтобы они соответствовалисервер (-f
указывает, что они принимают, что ветвь сместилась назад):
git fetch -f origin master:master
Если другие разработчики внесли изменения после ошибочного слияния (скажем, что слияние зафиксировано abc123
, ониможно использовать rebase
, чтобы переместить изменения в исправленные master
:
git rebase --onto master abc123 oldMaster
Если вы облажались в какой-то момент и в итоге получили «проигрышные» коммиты, потому что больше нет веток, указывающих на нихВы можете использовать git fsck --lost-found
для их восстановления.