Как я могу отменить `git commit` локально и удаленно после` git push` - PullRequest
218 голосов
/ 23 июня 2011

Я выполнил git commit, а затем git push.Как я могу отменить это изменение как в локальном, так и в удаленном хранилище?

$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael Silver@gmail.com>
Date:   Tue Jun 11 12:24:23 2011 -0700

Ответы [ 7 ]

367 голосов
/ 23 июня 2011
git reset --hard HEAD~1
git push -f <remote> <branch>

(Пример push: git push -f origin bugfix/bug123)

Это отменит последний коммит и передаст обновленную историю на удаленный компьютер.Вам нужно передать -f, потому что вы заменяете историю восходящего потока в удаленном.

152 голосов
/ 23 июня 2011

Как правило, сделать «обратный» коммит, используя:

git revert 364705c

затем отправьте его на пульт, как обычно:

git push

Это не удалит коммит: он делает дополнительный коммит, который отменяет то, что сделал первый коммит. Все остальное, не совсем безопасное, особенно когда изменения уже распространены.

35 голосов
/ 05 января 2015

Прежде всего, Расслабьтесь.

"Ничто не находится под нашим контролем. Наш контроль - просто иллюзия.", "Человеку свойственно ошибаться"

Я понял, что вы непреднамеренно выдвинули свой код на remote-master.ЭТО будет в порядке.

1. Сначала получите значение SHA-1 коммита, который вы пытаетесь вернуть, например, коммит в ветку master.запустите это:

git log

вы увидите кучу строк 'f650a9e398ad9ca606b25513bd4af9fe ...' вместе с каждым коммитом.скопируйте этот номер из коммита, который вы хотите вернуть обратно .

2. Теперь введите следующую команду:

git reset --hard your_that_copied_string_but_without_quote_mark

вы должны увидеть сообщение типа "HEAD is at at".вы на свободномОн только что отразил это изменение локально.

3. Теперь введите следующую команду:

git push -f

вы должны увидеть как

"предупреждение: push.default не установлено; его неявное значение изменилось в ..... ... Всего 0 (дельта 0), повторно использовано 0 (дельта 0) ... ... your_branch_name ->master (принудительное обновление). "

Теперь с вами все ясно.Снова проверьте мастер с помощью «git log», ваш fixed_destination_commit должен быть в верхней части списка.

Пожалуйста (заранее;))

ОБНОВЛЕНИЕ:

Теперь, изменения, которые вы внесли до того, как все это началось, теперь исчезли. Если вы хотите вернуть эти тяжелые работы снова, это возможно.Благодаря git reflog и git cherry-pick командам.

Для этого я бы посоветовал следовать этому блогу или этот пост .

7 голосов
/ 25 июня 2014

git reset HEAD~1, если вы не хотите, чтобы ваши изменения пропали (непроверенные изменения). Изменить, зафиксировать и снова нажать git push -f [origin] [branch]

3 голосов
/ 23 июня 2011

Вы можете сделать интерактивный ребаз:

git rebase -i <commit>

Это вызовет ваш редактор по умолчанию. Просто удалите строку, содержащую коммит, который вы хотите удалить, чтобы удалить этот коммит.

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

См. Этот вопрос: Git: удаление выбранных коммитов из хранилища

2 голосов
/ 01 февраля 2016

Попробуйте использовать

git reset --hard <commit id> 

Обратите внимание: здесь в качестве идентификатора коммита будет указан идентификатор коммита, на который вы хотите перейти, но не идентификатор, который вы хотите сбросить.это была единственная точка, где я тоже застрял.

затем нажмите

git push -f <remote> <branch>
2 голосов
/ 23 октября 2014

В качестве альтернативы:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

Принудительная ветка master удаленного репозитория источника к родительскому элементу последнего коммита

...