Я предполагаю, что у вас есть чистая песочница, где origin
указывает на ваш форк, и у вас есть доступ к репозиторию в восходящем потоке через другой URL.Я также предполагаю, что origin/master
и master
в вашей песочнице синхронизированы.
При этих допущениях это должно сработать:
git remote add upstream <upstream_url>
git fetch upstream
git checkout master
git rebase upstream/master
Надеюсь, перебаз будет работать и не будет содержать дубликатовсовершает.Если этого не произойдет, это может даже подчеркнуть, почему вам пришлось сначала принудительно нажать push.
Перед тем, как вы начнете ребазинг, git log --graph --decorate --all
(или gitk -all
или любая другая замена визуального журнала Git, которая показываетполный график) может показать, почему у вас возникли проблемы.
РЕДАКТИРОВАТЬ: альтернативный и более консервативный подход заключается в использовании git cherry-pick
.Решение для rebase полагается на то, что Git признает, что история, которая должна быть общей, состоит из коммитов, уже присутствующих в upstream/master
.Но вместо перебазирования вы можете определить родителя 1-го коммита, который вы хотите сохранить, скажем, origin/master~40
, если у вас действительно есть 40 фиксированных коммитов, и добавить эти коммиты в конце upstream/master
:
git remote add upstream <upstream_url>
git fetch upstream
git checkout master
git reset --hard upstream/master
git cherry-pick origin/master~40..origin/master
Это дает вам новый master
, который явно начинается с upstream/master
и добавляет только новую историю, которую вы хотите.
Обратите внимание на --hard
в git reset --hard upstream/master
: как указано в OPв комментариях это необходимо, чтобы убедиться, что вы начнете с чистого состояния перед сбором вишни.Но сначала убедитесь, что у вас не было ничего незафиксированного, которое вы хотите сохранить.
Проверка работоспособности: после выбора вишни (или перебазировки), git diff master origin/master
ничего не должно возвращать, или снова указывает на другие проблемывам нужно справиться.КОНЕЦ РЕДАКТИРОВАНИЯ
После того, как перебазирование или выбор вишни завершены, и вы полностью убедили себя в том, что эту новую историю вы хотите сохранить:
git push -f origin master
должно вернуть вашу вилку квсего на 40 коммитов впереди upstream
.
Предостережение: Я не тестировал решение для rebase, но я вполне уверен, что оно должно работать, основываясь на вашем описании ситуации.Однако я с успехом использовал решение «вишневый пик» в подобных ситуациях.Если вы попробуете любой из этих методов, пожалуйста, сообщите о своем успехе или что-то не так, что потребует корректировки.