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

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

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

Ответы [ 78 ]

156 голосов
/ 11 октября 2013

Первый запуск:

git reflog

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

Затем выполните:

git reset --hard ActionIdFromRefLog
148 голосов
/ 06 марта 2016

Отменить последний коммит:

git reset --soft HEAD^ или git reset --soft HEAD~

Это отменит последний коммит.

Здесь --soft означает возврат в стадию.

HEAD~ или HEAD^ означает переход на коммит до HEAD.


Заменить последний коммит на новый коммит:

git commit --amend -m "message"

Он заменит последний коммит новым коммитом.

143 голосов
/ 13 мая 2013

Другой способ:

Извлеките ветку, которую вы хотите вернуть, а затем сбросьте локальную рабочую копию на коммит, который вы хотите, чтобы он был последним на удаленном сервере (все после того, как оно пройдет до свидания). Для этого в SourceTree я щелкнул правой кнопкой мыши и выбрал «Сбросить BRANCHNAME для этого коммита».

Затем перейдите в локальный каталог вашего репозитория и выполните команду:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Это удалит все коммиты после текущего в вашем локальном репозитории, но только для этой одной ветки.

134 голосов
/ 15 мая 2013

Введите git log и найдите хэш-код последнего коммита, а затем введите:

git reset <the previous co>
130 голосов
/ 18 июля 2013

В моем случае я случайно зафиксировал некоторые файлы, которые я не хотел. Поэтому я сделал следующее, и это сработало:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

Проверьте результаты с помощью gitk или git log --stat

121 голосов
/ 06 января 2016

Просто запустите это в командной строке:

git reset --soft HEAD~ 
119 голосов
/ 18 февраля 2016

Есть много способов сделать это:

Команда Git для отмены последнего коммита / предыдущих коммитов:

Предупреждение: Не используйте --hard, если вы не знаете, что делаете. --hard слишком опасен и может удалить ваши файлы.

Основная команда для отмены фиксации в Git:

$ git reset --hard <COMMIT -ID>

или

$ git reset --hard HEAD~<n>

COMMIT-ID : идентификатор для фиксации

n: - количество последних коммитов, которые вы хотите вернуть

Вы можете получить идентификатор фиксации, как показано ниже:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

где d81d3f1 и be20eb8 являются идентификатором коммита.

Теперь давайте рассмотрим несколько случаев:

Предположим, вы хотите отменить последний коммит 'd81d3f1'. Вот два варианта:

$ git reset --hard d81d3f1

или

$ git reset --hard HEAD~1

Предположим, вы хотите отменить коммит 'be20eb8':

$ git reset --hard be20eb8

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

$ git reset --help
117 голосов
/ 04 марта 2014

Для локального коммита

git reset --soft HEAD~1

или если вы точно не помните, в каком именно коммите это происходит, вы можете использовать

git rm --cached <file>

Для принудительного коммита

Правильный способ удаления файлов из истории хранилища - git filter-branch. То есть

git filter-branch --index-filter 'git rm --cached <file>' HEAD

Но я рекомендую вам использовать эту команду с осторожностью. Подробнее на git-filter-branch (1) Страница руководства .

117 голосов
/ 28 августа 2014

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

git reset --hard HEAD~1
117 голосов
/ 29 августа 2013

Используйте SourceTree (графический инструмент для Git), чтобы увидеть ваши коммиты и дерево. Вы можете вручную сбросить его, щелкнув правой кнопкой мыши по нему.

...