Github: выборка и перебазирование форка на разветвленном мастере - PullRequest
0 голосов
/ 13 февраля 2019

Я создал форк проекта и добавил ~ 40 коммитов к нашему master.В какой-то момент я бездумно переписал историю с принудительным толчком, потому что я не мог толкнуть «без всякой причины» , а иногда вы просто хотите увидеть, как мир горит.

Теперьвсе хорошо, но последние ~ 100 коммитов на upstream, которые также находятся в моем репо, больше не считаются одинаковыми: я вижу "240 коммитов вперед" вместо "40коммиты впереди ".

Можно ли извлечь вышестоящий мастер и перебазировать коммиты нашего мастера на него и принудительно вернуть его обратно нашему мастеру, чтобы наши и их синхронизировались для всех предыдущих коммитовкроме моего?Если так, то как?Пожалуйста, будьте конкретны.

1 Ответ

0 голосов
/ 13 февраля 2019

Я предполагаю, что у вас есть чистая песочница, где 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, но я вполне уверен, что оно должно работать, основываясь на вашем описании ситуации.Однако я с успехом использовал решение «вишневый пик» в подобных ситуациях.Если вы попробуете любой из этих методов, пожалуйста, сообщите о своем успехе или что-то не так, что потребует корректировки.

...