Как мне отменить коммит в git? - PullRequest
40 голосов
/ 21 марта 2011

Я не совсем знаком с тем, как работает git.Я выдвинул коммит по ошибке и хочу отменить его.Я сделал

git reset --hard HEAD~1

Остерегайтесь товарищей Googlers: Это не только отменяет фиксацию, но и отменяет все изменения файла!

и сейчаспроект отменен на моей машине, но не на github.Если я пытаюсь нажать этот код, я получаю сообщение об ошибке «Ваша ветвь отстает от« origin / master »на 1 коммит и может быть быстро перенаправлена».Как мне удалить этот коммит из github?

Ответы [ 6 ]

42 голосов
/ 07 февраля 2014

Эта статья содержит превосходное объяснение о том, как действовать в различных сценариях (где было выполнено принятие, а также толчок ИЛИ простоcommit, перед push):

http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-pushed-to-a-remote-reposit.html

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

git revert dd61ab32
31 голосов
/ 21 марта 2011

Вы можете сделать git push --force, но имейте в виду, что вы переписываете историю, и у любого, кто использует репо, будут проблемы с этим.

Если вы хотите предотвратить эту проблему, не используйте сброс, а вместо этогоиспользуйте git revert

17 голосов
/ 21 марта 2011

Или вы можете попробовать использовать git revert http://www.kernel.org/pub/software/scm/git/docs/git-revert.html. Я думаю, что-то вроде git revert HEAD~1 -m 1 вернет ваш последний коммит (если это все еще последний коммит).

7 голосов
/ 09 мая 2014

Не могу комментировать ответы других, я предоставлю немного дополнительной информации.

Если вы хотите revert последний коммит, вы можете использовать git revert head.head относится к самому последнему коммиту в вашей ветке.

Причина, по которой вы используете head~1 при использовании reset, заключается в том, что вы говорите Git «удалить все изменения в коммитах после» (reset --hard) «коммит один перед головой» (head~1).

reset - это до коммит, revert - в коммит.

Как указывал AmpT, вы также можете использовать SHA для фиксации, чтобы идентифицировать его, вместо того, чтобы подсчитать, как далеко он находится от head.SHA можно найти в журналах (git log) и множеством других способов.

Вы также всегда можете использовать любые другие указатели в Git.например тег или ветка.А также можете использовать все эти забавные другие способы ссылки коммитов https://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html#_specifying_revisions

2 голосов
/ 21 марта 2011

Я думаю, вам нужно нажать на коммит.Итак, pull снова из github, включая коммит, который вы хотите отменить, затем используйте git revert и отправьте результат.

Если вас не волнуют клоны других людей в вашем репозитории github, вытакже можно удалить и воссоздать основную ветку на github после вашего reset: git push origin :master.

0 голосов
/ 21 марта 2011

git push -f может быть?

man git-push расскажет больше.

...