Как мне отменить последние локальные коммиты в Git? - PullRequest
19725 голосов
/ 29 мая 2009

Я случайно отправил неправильные файлы на Git , но я еще не отправил коммит на сервер.

Как мне отменить эти коммиты из локального репозитория?

Ответы [ 78 ]

412 голосов
/ 25 октября 2012

Я предпочитаю использовать git rebase -i для этой работы, потому что появляется хороший список, где я могу выбрать коммиты, от которых можно избавиться. Это может быть не так прямо, как некоторые другие ответы здесь, но просто кажется правильным .

Выберите, сколько коммитов вы хотите перечислить, затем вызовите вот так (чтобы подключить последние три)

git rebase -i HEAD~3

Пример списка

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

Тогда Git удалит коммиты для любой строки, которую вы удалите.

398 голосов
/ 23 апреля 2013

Как исправить предыдущий локальный коммит

Используйте git-gui (или аналогичный) для выполнения git commit --amend. Из графического интерфейса вы можете добавлять или удалять отдельные файлы из коммита. Вы также можете изменить сообщение коммита.

Как отменить предыдущий локальный коммит

Просто сбросьте вашу ветку в предыдущее местоположение (например, используя gitk или git rebase). Затем повторно примените изменения из сохраненной копии. После сборки мусора в вашем локальном хранилище будет похоже на то, что нежелательный коммит никогда не происходил. Чтобы сделать все это в одной команде, используйте git reset HEAD~1.

Слово предупреждения : Неосторожное использование git reset - хороший способ привести вашу рабочую копию в запутанное состояние. Я рекомендую новичкам Git избегать этого, если они могут.

Как отменить публичный коммит

Выполните обратный выбор вишни ( git-revert ), чтобы отменить изменения.

Если вы еще не внесли другие изменения в свою ветку, вы можете просто сделать ...

git revert --no-edit HEAD

Затем отправьте обновленную ветку в общий репозиторий.

История коммитов покажет оба коммита, отдельно .


Дополнительно: исправление приватной ветки в публичном хранилище

Это может быть опасно - убедитесь, что у вас есть локальная копия ответвления.

Также обратите внимание: вы не хотите делать это, если кто-то еще может работать в филиале.

git push --delete (branch_name) ## remove public version of branch

Очистите вашу ветку локально, затем повторите ...

git push origin (branch_name)

В обычном случае вам, вероятно, не нужно беспокоиться о том, что ваша история коммитов в приватной ветке будет нетронутой. Просто нажмите последующий коммит (см. «Как отменить публичный коммит» выше), а затем выполните squash-merge , чтобы скрыть историю.

319 голосов
/ 03 сентября 2014

Если вы совершили мусор, но не были отправлены,

git reset --soft HEAD~1

HEAD ~ 1 - сокращение для коммита перед головой. В качестве альтернативы вы можете обратиться к SHA-1 хэша, если вы хотите сбросить в. - опция soft удалит коммит, но оставит все ваши измененные файлы «Изменениями, которые будут зафиксированы», как это будет указано в git status.

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

OR

Если вы уже нажали, а кто-то потянул, что обычно является моим случаем, вы не можете использовать git reset . Однако вы можете сделать git revert ,

git revert HEAD

Это создаст новый коммит, который перевернет все, что было введено случайным коммитом.

316 голосов
/ 17 мая 2013

Если вы хотите навсегда отменить его и клонировали какой-то репозиторий

Идентификатор коммита можно увидеть

git log 

Тогда вы можете сделать -

git reset --hard <commit_id>

git push origin <branch_name> -f
269 голосов
/ 28 июня 2013

На SourceTree (графический интерфейс для GitHub), вы можете щелкнуть правой кнопкой мыши по коммиту и выполнить «Обратный коммит». Это должно отменить ваши изменения.

На терминале:

Вы также можете использовать:

git revert

Или:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.
250 голосов
/ 05 марта 2014

Отдельная команда:

git reset --soft 'HEAD^' 

Отлично работает, чтобы отменить последний локальный коммит!

241 голосов
/ 21 июня 2017

Просто сбросьте его, выполнив следующую команду, используя git:

git reset --soft HEAD~1

Объясните: что делает git reset, это в основном reset для любого коммита, к которому вы хотите вернуться, затем, если вы объедините его с клавишей --soft, он вернется, но сохраните изменения в своем файле (файлах), чтобы вы вернулись к этапу, на котором файл был только что добавлен, HEAD - это заголовок ветви, и если вы объединитесь с ~1 (в этом случае вы также используете HEAD^), он вернет только один коммит, который вы хотите ...

Я создаю шаги, изображенные на рисунке ниже, более подробно для вас, включая все шаги, которые могут произойти в реальных ситуациях, и принятие кода:

How to undo the last commits in Git?

223 голосов
/ 23 апреля 2014

Как отменить последний коммит Git?

Чтобы восстановить все, как было до последнего коммита, нам нужно сбросить коммит до HEAD.

  1. Если вы не хотите сохранять внесенные изменения:

    git reset --hard HEAD^
    
  2. Если вы хотите сохранить изменения:

    git reset --soft HEAD^
    

Теперь проверьте ваш журнал git. Это покажет, что наш последний коммит был удален.

180 голосов
/ 07 января 2014

Используйте reflog, чтобы найти правильное состояние

git reflog

reflog before ОБРАТИТЬСЯ ДО СБРОСА

Выберите правильный reflog (в моем случае f3cb6e2) и введите

git reset --hard f3cb6e2

После этого заголовок репо будет сброшен на этот заголовок reset effect LOG ПОСЛЕ СБРОСА

Наконец, рефлог выглядит как на картинке ниже

reflog after ФИНАЛ РЕФЛОГА

173 голосов
/ 03 октября 2013

«Сбросить рабочее дерево до последнего коммита»

git reset --hard HEAD^ 

«Удалить неизвестные файлы из рабочего дерева»

git clean    

см. - Краткое руководство по Git

ПРИМЕЧАНИЕ: Эта команда удалит ваш предыдущий коммит, поэтому используйте с осторожностью! git reset --hard безопаснее -

...