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

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

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

Ответы [ 78 ]

13 голосов
/ 20 июня 2017

В IntelliJ IDEA вы можете просто открыть журнал репозитория Git, нажав Alt + 9 , щелкнув правой кнопкой мыши по некоторому тегу из списка фиксаций и выбрав: «Сбросить текущую ветвь сюда ...» .

13 голосов
/ 23 мая 2018

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

Если вам нужно отбросить самый верхний коммит, то поможет следующий однострочный

git rebase --onto HEAD~1 HEAD

Но если вы хотите отбросить 1 из множества коммитов, вы говорите

a -> b -> c -> d -> master

и вы хотите сбросить коммит 'c'

git rebase --onto b c

Это сделает 'b' новой базой 'd', исключив 'c'

13 голосов
/ 28 июня 2017

Для полноты картины я приведу один явно очевидный метод, который был упущен из предыдущих ответов.

Так как фиксация не была отправлена, пульт не был изменен, поэтому:

  1. Удалить локальный репозиторий.
  2. Клонировать удаленный репозиторий.

Это иногда необходимо, если ваш модный клиент Git прощается. (например, non-fast-forward ошибки)

Не забудьте повторно зафиксировать сохраненные изменения с момента последнего нажатия.

13 голосов
/ 18 июля 2017

ГОЛОВА:

Перед перезагрузкой, мы должны знать о HEAD ... HEAD - это не что иное, как ваше текущее состояние в вашем рабочем каталоге. Он представлен номером коммита.

Git commit:

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

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

Метод 1: (если вы не знаете номер коммита, но хотите перейти к самому первому)

git reset HEAD~1  # It will move your head to last commit

Метод 2: (если вы знаете коммит, вы просто сбрасываете его на свой известный коммит)

git reset 0xab3 # Номер коммита

Примечание: , если вы хотите узнать недавний коммит, попробуйте git log -p -1

Вот графическое представление:

Enter image description here

12 голосов
/ 03 июня 2017

Найти хеш-код последнего коммита, просмотрев журнал по:

git log

Тогда

git reset <the previous co>
11 голосов
/ 16 ноября 2016

enter image description here

Если вы работаете в Visual Studio, если вы заходите в историю веток и просматриваете все свои коммиты, просто выберите событие перед тем коммитом, который вы хотите отменить, щелкните его правой кнопкой мыши и выберите Revert. Легко как это.

8 голосов
/ 17 марта 2017

Если вы хотите удалить не те файлы, вы должны сделать

git reset --soft <your_last_good_commit_hash_here> Здесь, если вы сделаете git status, вы увидите файлы в области подготовки. Вы можете выбрать неправильные файлы и убрать их из области подготовки.

Как показано ниже.

git reset wrongFile1 wrongFile2 wrongFile3

Теперь вы можете просто добавить файлы, которые вам нужно нажать,

git add goodFile1 goodFile2

передайте их

git commit -v или git commit -am "Message"

и нажмите

git push origin master

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

по

git reset --hard <your_last_good_commit_hash_here>

git push origin master

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

git push --force origin master

7 голосов
/ 17 апреля 2018

Попробуйте, выполните полный сброс до предыдущего коммита, где эти файлы не были добавлены, затем:

git reset --hard <commit_hash>

Убедитесь, что у вас есть резервная копия ваших изменений на всякий случай, так как это жесткий сброс, что означает, что они будут потеряны (если вы не спрятали ранее)

6 голосов
/ 11 марта 2019
git reset --soft HEAD~1

Сброс перемотает вашу текущую ветку HEAD до указанной ревизии. Примечание флаг --soft: это обеспечивает сохранение изменений в отмененных ревизиях. После выполнения команды вы найдете изменения в качестве незафиксированных локальных изменений в вашей рабочей копии.

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

 git reset --hard HEAD~1

Отмена нескольких коммитов

git reset --hard 0ad5a7a6

имейте в виду, однако, что использование команды сброса отменяет все коммиты, которые пришли после того, к которому вы вернулись: enter image description here

5 голосов
/ 24 сентября 2018

Если вы хотите отменить самый первый коммит в вашем репо

Вы столкнетесь с этой проблемой:

$ git reset HEAD~
fatal: ambiguous argument 'HEAD~': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Ошибка возникает из-за того, что если последним коммитом является начальный коммит (или нет родителей) репозитория, HEAD ~ не существует.

Решение

Если вы хотите сбросить единственный коммит на "главной" ветке

$ git update-ref -d HEAD
$ git rm --cached -r .
...