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

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

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

Ответы [ 78 ]

117 голосов
/ 12 сентября 2014

Есть два основных сценария

Вы еще не нажали коммит

Если проблема заключалась в добавленных вами дополнительных файлах (и вы не хотите, чтобы они были в хранилище), вы можете удалить их с помощью git rm, а затем с помощью --amend

git rm <pathToFile>

Вы также можете удалить целые каталоги с помощью -r или даже объединить с другими Bash командами

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

После удаления файлов вы можете зафиксировать, с помощью - изменить параметр

git commit --amend -C HEAD # the -C option is to use the same commit message

Это перезапишет вашу недавнюю локальную фиксацию, удалив лишние файлы, поэтому эти файлы никогда не будут отправлены по запросу, а также будут удалены из вашего локального репозитория .git GC.

Вы уже нажали коммит

Вы можете применить то же решение другого сценария, а затем выполнить git push с параметром -f, но это не рекомендуется , поскольку оно перезаписывает удаленную историю с расходящимися изменениями испортить ваш репозиторий).

Вместо этого вы должны выполнить коммит без --amend (помните об этом -amend`: эта опция переписывает историю последнего коммита).

108 голосов
/ 28 июля 2016

ЧТО ИСПОЛЬЗОВАТЬ, reset --soft или reset --hard?

Я просто добавляю два цента за ответ @ Kyralessa:

Если вы не уверены, что использовать, перейдите на --soft (я использовал это соглашение, чтобы запомнить его - s часто для безопасного).

Почему?

Если вы выберете --hard по ошибке, вы ПОТЕРЯЕТЕ ваши изменения, как это было раньше. Если вы выберете --soft по ошибке, вы можете достичь тех же результатов, что и --hard, применив дополнительные команды

git reset HEAD file.html
git checkout -- file.html

Полный пример

echo "some changes..." > file.html
git add file.html
git commit -m "wrong commit"

# I need to reset
git reset --hard HEAD~1 (cancel changes)
# OR
git reset --soft HEAD~1 # Back to staging
git reset HEAD file.html # back to working directory
git checkout -- file.html # cancel changes

Кредиты поступают в @ Kyralessa.

66 голосов
/ 29 июня 2016

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

git reset HEAD@{1}

Эта команда удалит ваш неверный коммит без журнала Git.

65 голосов
/ 18 ноября 2016

Думаю, у нас есть code.txt файл. Мы вносим некоторые изменения в него и фиксируем. Мы можем отменить этот коммит тремя способами , но сначала вы должны знать, что такое промежуточный файл ... Готовый файл - это файл, который готов к фиксации, и если вы запустите git status, этот файл будет показан зеленым цветом, а если он не подготовлен для фиксации, будет показан красным цветом:

enter image description here

Это означает, что если вы фиксируете свои изменения, ваши изменения в этом файле не сохраняются. Вы можете добавить этот файл на своем этапе с помощью git add code.txt и затем зафиксировать свое изменение:

enter image description here

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

  1. Теперь, если мы хотим просто отменить коммит без каких-либо других изменений, мы можем использовать

    git reset --soft HEAD^

    enter image description here

  2. Если мы хотим отменить фиксацию и ее изменения ( ЭТО ОПАСНО, потому что ваше изменение будет потеряно ), мы можем использовать

    git reset --hard HEAD^

    enter image description here

  3. И если мы хотим отменить фиксацию и удалить изменения со сцены, мы можем использовать

    git reset --mixed HEAD^ или в краткой форме git reset HEAD^

    enter image description here

65 голосов
/ 18 ноября 2014

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

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

Вот как это сделать с помощью графического интерфейса. Если у вас установлен Git, у вас уже есть все необходимое для выполнения этих инструкций.

ПРИМЕЧАНИЕ: Я предполагаю, что вы поняли, что коммит был неверным, прежде чем вы его нажали. Если вы не знаете, что значит толкание, значит, вы не толкнули. Так что продолжайте с инструкциями. Если вы выдвинули ошибочный коммит, наименее рискованный способ - просто следовать за ошибочным коммитом новым коммитом, который исправляет вещи, как вы это делали бы в системе контроля версий, которая не позволяет переписывать историю.

Тем не менее, вот как исправить ваш последний сбой фиксации с помощью графического интерфейса:

  1. Перейдите в свой репозиторий в командной строке и запустите графический интерфейс с git gui
  2. Выберите «Изменить последний коммит». Вы увидите ваше последнее сообщение о коммите, файлы, которые вы поставили, и файлы, которые вы не сделали.
  3. Теперь измените вещи так, как вы хотите, чтобы они выглядели, и нажмите кнопку «Применить».
57 голосов
/ 14 сентября 2017

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

Есть множество ситуаций, когда вы действительно хотите отменить последний коммит в вашем коде. Например. потому что вы хотели бы реструктурировать его - или вообще отказаться от него!

В этих случаях команда «reset» - ваш лучший друг:

$ git reset --soft HEAD~1

Приведенная выше команда (сброс) перемотает текущую ветку HEAD до указанной ревизии. В нашем примере выше мы хотели бы вернуться к тому, который был до текущей ревизии, - эффективно отменить наш последний коммит.

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

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

$ git reset --hard HEAD~1

Enter image description here

54 голосов
/ 08 мая 2015

Просто отмените последний коммит:

git reset --soft HEAD~

Или отменить время до последнего коммита:

git reset --soft HEAD~2

Или отменить любой предыдущий коммит:

git reset --soft <commitID>

(вы можете получить commitID используя git reflog)

Когда вы отменяете предыдущий коммит, не забудьте очистить рабочее место с помощью

git clean

Более подробную информацию можно найти в документации: git-reset

54 голосов
/ 29 июля 2016

Если вы работаете с SourceTree , это поможет вам.

Щелкните правой кнопкой мыши на коммите, затем выберите" Сброс (текущая ветвь) / мастер этого коммита " и последний выберите «Мягкий» сброс .

Enter image description here

49 голосов
/ 04 января 2016

Чтобы отменить ваш локальный коммит, вы используете git reset <commit>. Также этот урок очень полезен, чтобы показать вам, как он работает.

В качестве альтернативы вы можете использовать git revert <commit>: можно использовать возврат , если вы хотите добавить еще один коммит, который откатывает изменения (но сохраняет их в истории проекта).

49 голосов
/ 15 февраля 2018

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

git reset --soft HEAD^ or git reset --soft HEAD~

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

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

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

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

git commit --amend -m "message"

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

...