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

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

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

18614
задан Hamza Yerlikaya 29 мая '09 в 21:09
источник поделиться
90 ответов
  • 1
  • 2
  • 3

Отменить фиксацию и повторить

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. Это то, что вы хотите отменить
  2. Это оставляет рабочее дерево (состояние ваших файлов на диске) неизменным, но отменяет фиксацию и оставляет внесенные вами изменения недействительными (поэтому они будут отображаться как "Изменения не поставлены для фиксации" в git status, и вам нужно будет добавьте их еще до совершения). Если вы хотите добавить дополнительные изменения в предыдущую фиксацию или изменить сообщение коммита 1 вместо этого вы можете использовать git reset --soft HEAD~, что похоже на git reset HEAD~ (где HEAD~ совпадает с HEAD~1), но оставляет ваши существующие изменения.
  3. Внести исправления в файлы рабочих деревьев.
  4. git add все, что вы хотите включить в новый коммит.
  5. Зафиксируйте изменения, повторно используя старое сообщение коммита. reset скопировал старую голову в .git/ORIG_HEAD; commit с -c ORIG_HEAD откроет редактор, который изначально содержит сообщение журнала из старой фиксации и позволяет вам редактировать его. Если вам не нужно редактировать сообщение, вы можете использовать -c.

Однако commit --amend что если вы добавили какие-либо новые изменения в индекс, использование commit --amend добавит их к вашему предыдущему фиксации.

Если код уже перенесен на ваш сервер, и у вас есть права на перезапись истории (rebase), тогда:

git push origin master --force

Вы также можете посмотреть на этот ответ:

Как переместить HEAD обратно в предыдущее место? (Отдельная головка)

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


1 Обратите внимание, однако, что вам не нужно выполнять сброс до более раннего фиксации, если вы только что допустили ошибку в своем сообщении о фиксации. Более простым вариантом является git reset (завышать любые изменения, которые вы сделали с тех пор), а затем git commit --amend, который откроет ваш редактор сообщений по умолчанию, предварительно заполненный последним сообщением фиксации.

20118
ответ дан Esko Luontola 29 мая '09 в 21:13
источник поделиться

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

Скажем, у вас это есть, где C - это ваша ГОЛОВА, а (F) - это состояние ваших файлов.

   (F)
A-B-C
    ↑
  master

Вы хотите обнулить коммит C и больше никогда его не видеть. Ты делаешь это:

git reset --hard HEAD~1

Результат:

 (F)
A-B
  ↑
master

Теперь Б - ГОЛОВА. Поскольку вы использовали --hard, ваши файлы возвращаются в свое состояние при фиксации B.

Ах, но предположим, что commit C - это не катастрофа, а совсем немного. Вы хотите отменить коммит, но сохраните свои изменения для небольшого редактирования, прежде чем сделать лучший коммит. Начиная снова здесь, с C в качестве вашей головы:

   (F)
A-B-C
    ↑
  master

Вы можете сделать это, оставив --hard:

git reset HEAD~1

В этом случае результат:

   (F)
A-B-C
  ↑
master

В обоих случаях HEAD - это просто указатель на последний коммит. Когда вы делаете git reset HEAD~1, вы говорите Git переместить указатель HEAD назад на один коммит. Но (если вы не используете --hard) вы оставляете свои файлы такими, какими они были. Теперь git status показывает изменения, которые вы зарегистрировали в C. Вы ничего не потеряли!

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

git reset --soft HEAD~1

Это не только оставляет ваши файлы в покое, но даже оставляет ваш индекс в покое. Когда вы сделаете git status, вы увидите, что в индексе есть те же файлы, что и раньше. Фактически, сразу после этой команды вы можете выполнить git commit и вы будете переделывать тот же коммит, который только что у вас был.

Еще одна вещь: предположим, вы уничтожили коммит, как в первом примере, но потом обнаружили, что он вам нужен в конце концов? Не повезло, правда?

Нет, еще есть способ вернуть его. Тип git reflog, и вы увидите список (частично) совершать ШАС (то есть, хэш), что вы переместились вокруг в Найти коммит вы уничтожили, и сделать это.:

git checkout -b someNewBranchName shaYouDestroyed

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

9968
ответ дан Ryan Lundy 29 июля '11 в 1:22
источник поделиться

Мне потребовалось некоторое время, чтобы понять, так что, возможно, это поможет кому-то...

Существует два способа "отменить" ваш последний коммит, в зависимости от того, сделал ли вы общедоступный отчет (нажал на удаленный репозиторий):

Как отменить локальную фиксацию

Пусть говорят, что я совершил локально, но теперь хочу удалить эту фиксацию.

git log
    commit 101: bad commit    # latest commit, this would be called 'HEAD'
    commit 100: good commit   # second to last commit, this is the one we want

Чтобы восстановить все до того, как это было до последнего фиксации, нам нужно выполнить reset до фиксации перед HEAD:

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 the changes you made

Теперь git log покажет, что наша последняя фиксация была удалена.

Как отменить публичную фиксацию

Если вы уже сделали свои коммиты общедоступными, вам нужно будет создать новый коммит, который "вернет" изменения, внесенные вами в предыдущую фиксацию (текущий HEAD).

git revert HEAD

Теперь ваши изменения будут отменены и готовы к фиксации:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

Для получения дополнительной информации, ознакомьтесь с Основами Git - Отменить вещи

1841
ответ дан Andrew 16 июня '11 в 20:27
источник поделиться

Добавить/удалить файлы, чтобы получить то, что вы хотите:

git rm classdir
git add sourcedir

Затем измените фиксацию:

git commit --amend

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

Обратите внимание, что вы должны сделать это только в том случае, если вы еще не нажали. Если вы нажали, вам просто придется совершить исправить нормально.

1652
ответ дан bdonlan 29 мая '09 в 21:16
источник поделиться
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

или

git reset --hard HEAD~1

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

hard reset в HEAD-1 установит вашу рабочую копию в состояние фиксации до вашего неправильного фиксации.

913
ответ дан Lennart Koopmann 29 мая '09 в 21:13
источник поделиться

Чтобы изменить последнее фиксацию

Замените файлы в индексе:

git rm --cached *.class
git add *.java

Затем, если это частный филиал, измените фиксацию:

git commit --amend

Или, если это общая ветка, выполните новую фиксацию:

git commit -m 'Replace .class files with .java files'


(чтобы изменить предыдущую фиксацию, используйте удивительную интерактивную rebase)


ProTip ™: добавьте *.class в gitignore, чтобы остановить это повторение.


Чтобы вернуть фиксацию

Изменение коммита - идеальное решение, если вам нужно изменить последнее коммит, но reset более общее решение.

Вы можете сбросить git на любой фиксатор с помощью:

git reset @~N

Где N - количество коммитов перед HEAD, а @~ возврат к предыдущему фиксации.

Итак, вместо внесения изменений в коммит вы можете использовать:

git reset @~
git add *.java
git commit -m "Add .java files"

Проверьте git help reset, в частности разделы --soft --mixed и --hard, чтобы лучше понять, что это делает.

Reflog

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

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started


698
ответ дан Zaz 31 июля '10 в 12:39
источник поделиться

Использовать git revert <commit-id>

Чтобы получить идентификатор фиксации, просто используйте git log

573
ответ дан Jaco Pretorius 25 мая '12 в 19:04
источник поделиться

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

git reset --hard HEAD^1

(Эта команда будет игнорировать всю вашу фиксацию, и ваши изменения будут полностью потеряны из вашего локального рабочего дерева). Если вы хотите отменить фиксацию, но хотите внести изменения в промежуточную область (перед фиксацией точно так же, как после git add), выполните следующую команду.

git reset --soft HEAD^1

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

git reset HEAD

Теперь переданные файлы поступают из поэтапной области в непоставленную область. Теперь файлы готовы к редактированию, поэтому, что бы вы ни изменили, вы хотите перейти к редактированию и добавить его и создать новый/новый коммит.

Больше

461
ответ дан Madhan Ayyasamy 31 янв. '13 в 10:06
источник поделиться

Если у вас установлена Git Extras, вы можете запустить git undo чтобы отменить последнюю фиксацию. git undo 3 отменяет последние 3 фиксации.

443
ответ дан nickf 13 дек. '11 в 13:18
источник поделиться

Я хотел отменить последние 5 коммитов в нашем общем хранилище. Я просмотрел идентификатор ревизии, к которому я хотел откат. Затем я набрал следующее.

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>
410
ответ дан neoneye 06 апр. '12 в 16:58
источник поделиться

Я предпочитаю использовать 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 удалит фиксации для любой удаляемой строки.

388
ответ дан Steven Penny 25 окт. '12 в 6:41
источник поделиться

Как исправить предыдущую локальную фиксацию

Используйте 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)

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

371
ответ дан nobar 23 апр. '13 в 20:27
источник поделиться

Если вы совершили ошибку, но не нажали,

git reset --soft HEAD~1

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

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

ИЛИ

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

git revert HEAD

Это создаст новую фиксацию, которая отменяет все, введенное случайным фиксацией.

304
ответ дан santos_mgr 03 сент. '14 в 10:15
источник поделиться

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

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

git log 

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

git reset --hard <commit_id>

git push origin <branch_name> -f
299
ответ дан poorva 17 мая '13 в 16:02
источник поделиться

В SourceTree (GUI для 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.
253
ответ дан Varun Parakh 28 июня '13 в 13:18
источник поделиться

Единая команда:

git reset --soft 'HEAD^' 

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

239
ответ дан Manish Shrivastava 05 марта '14 в 16:55
источник поделиться

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

git reset --soft HEAD~1

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

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

How to undo the last commits in Git?

220
ответ дан Alireza 21 июня '17 в 12:33
источник поделиться

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

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

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

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

    git reset --soft HEAD^
    

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

212
ответ дан Ranjithkumar Ravi 23 апр. '14 в 14:21
источник поделиться

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

git reflog

reflog before REFLOG ПЕРЕД СБРОСОМ

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

git reset --hard f3cb6e2

После этого HEAD возвращается в HEADid reset effect LOG AFTER RESET

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

reflog after REFLOG FINAL

170
ответ дан Shubham Chaudhary 07 янв. '14 в 1:34
источник поделиться

"Сбросить рабочее дерево до последнего фиксации"

git reset --hard HEAD^ 

"Очистить неизвестные файлы от рабочего дерева"

git clean    

см. - Краткая ссылка Git

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

165
ответ дан Ravi_Parmar 03 окт. '13 в 15:43
источник поделиться

Первый забег:

git reflog

Он покажет вам все возможные действия, которые вы выполнили в своем репозитории, например, commit, merge, pull и т.д.

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

git reset --hard ActionIdFromRefLog
149
ответ дан U. Ali 11 окт. '13 в 17:41
источник поделиться

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

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

Это приведет к отмене последнего фиксации.

Здесь --soft означает сброс настроек.

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


Заменить последнюю фиксацию на новую фиксацию:

git commit --amend -m "message"

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

138
ответ дан akshay_rahar 06 марта '16 в 14:53
источник поделиться

Другой путь:

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

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

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

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

135
ответ дан CommaToast 13 мая '13 в 20:12
источник поделиться

Введите git log и найдите последний код хеширования и введите:

git reset <the previous co>
127
ответ дан user853293 15 мая '13 в 16:12
источник поделиться

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

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

124
ответ дан egridasov 18 июля '13 в 9:41
источник поделиться

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

112
ответ дан iOS Coder 29 авг. '13 в 19:18
источник поделиться

Существует два основных сценария

Вы еще не нажали фиксацию

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

git rm <pathToFile>

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

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

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

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

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

Вы уже нажали на фиксацию

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

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

110
ответ дан dseminara 12 сент. '14 в 17:51
источник поделиться

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

git reset --soft HEAD~ 
101
ответ дан kyo 06 янв. '16 в 17:10
источник поделиться

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

Команда 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 - идентификатор commit.

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

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

$ git reset --hard d81d3f1

или

$ git reset --hard HEAD~1

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

$ git reset --hard be20eb8

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

$ git reset --help
101
ответ дан user3799762 18 февр. '16 в 6:27
источник поделиться

Для локальной фиксации

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) Manual.

100
ответ дан geoom 04 марта '14 в 7:35
источник поделиться
  • 1
  • 2
  • 3

Другие вопросы по меткам или Задайте вопрос