Возвращение push'd git commit

У меня есть репо с двумя ветвями - master и dev. Я работал над мастер-веткой и вытащил, и получил сообщение о том, что репо было в курсе. Я совершил свои изменения и нажал на удаленный репо (на github). Я получил сообщение о том, что некоторые изменения были отклонены.

Затем я сделал git pull origin dev, который, по-видимому, был неправильным - поскольку он объединил ветвь dev с моим мастером, и, как идиот, я этого не заметил, пока я уже не подтолкнул. Итак, последняя фиксация показывает Merge branch 'dev' of github.com:myuser/myrepo.

Я могу вернуться к последнему известному хорошему состоянию на своем локальном репо, выполнив git reset --hard [sha], когда [sha] является фиксацией до слияния (хотя я не уверен, как сделать это изменение в начале ) - или из того, что я прочитал, я также могу сделать git revert -m, а затем зафиксировать/нажать это изменение.

Может ли кто-нибудь пройти меня по "правильному пути", чтобы отменить мое слияние, и восстановить обе ветки назад туда, где они были до слияния?

Спасибо, если это имеет значение, это совместное репо с двумя разработчиками, поэтому оно не сильно меняется.

Изменить, чтобы добавить: пожалуйста, поговорите со мной, как будто я был ребенком. Я должен признать, что этот материал Git все еще меня смущает, поэтому я далек от сильного пользователя! Благодаря

Ответ 1

git reset --hard [sha] исправит ветку в локальном репозитории. Чтобы заставить этот толчок работать, вы можете сделать git push origin +master:master. Знак + заставит нелинейный push работать.

Если другие разработчики уже вытащили вас неправильно, они должны будут сделать git remote update, а затем git reset --hard origin/master (при условии, что они находятся на своей главной ветке и не сделали никаких других коммитов.

Пожалуйста, используйте эти команды с некоторой осторожностью:-). Удачи.

Ответ 2

Ответ FelipeFG отлично работает в контексте с двумя разработчиками, где вы можете легко координировать повторную настройку локального репозитория другого парня, но на самом деле вам лучше использовать git revert -m<parent id of mainline branch, 1 in this case> <commit ref>. Затем, когда вы закончите его исправление, просто git revert <revert commit> и git merge dev (важно возвратить ваш возврат для этого случая, потому что иначе git merge dev не будет считать ваше старое слияние предком, и это приведет к конфликтам которые должны быть разрешены).

История будет уродливой, но она также будет поддерживать ускоренную пересылку, и вам не придется беспокоиться о том, что какой-то бедный сап распутывает беспорядок локальных конфликтов, благодаря вашей истории.

Подробнее см. http://opensource.apple.com/source/Git/Git-26/src/git-htmldocs/howto/revert-a-faulty-merge.txt.