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

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

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

17659
задан Hamza Yerlikaya 29 мая '09 в 21:09
источник поделиться

83 ответов

  • 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, который откроет ваш редактор сообщений по умолчанию, предварительно заполненный последним сообщением фиксации.

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

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

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

   (F)
A-B-C
    ↑
  master

Вы хотите, чтобы nuke совершил C, и больше не увидите его. Ты делаешь это:

git reset --hard HEAD~1

Результат:

 (F)
A-B
  ↑
master

Теперь B - HEAD. Поскольку вы использовали --hard, ваши файлы сбрасываются в их состояние при фиксации B.

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

   (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 reflog которые вы переместили. Найдите скот, который вы уничтожили, и выполните следующее:

git checkout -b someNewBranchName shaYouDestroyed

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

9683
ответ дан 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 - Отменить вещи

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

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

git rm classdir
git add sourcedir

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

git commit --amend

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

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

1613
ответ дан 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 установит вашу рабочую копию в состояние фиксации до вашего неправильного фиксации.

862
ответ дан 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


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

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

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

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

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

git reset --hard HEAD^1

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

git reset --soft HEAD^1

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

git reset HEAD

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

Больше

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

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

424
ответ дан 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>
393
ответ дан 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 удалит фиксации для любой удаляемой строки.

378
ответ дан 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)

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

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

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

git reset --soft HEAD~1

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

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

ИЛИ

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

git revert HEAD

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

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

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

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

git log 

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

git reset --hard <commit_id>

git push origin <branch_name> -f
290
ответ дан 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.
246
ответ дан Varun Parakh 28 июня '13 в 13:18
источник поделиться

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

git reset --soft 'HEAD^' 

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

233
ответ дан 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?

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

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

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

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

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

    git reset --soft HEAD^
    

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

199
ответ дан 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

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

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

git reset --hard HEAD^ 

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

git clean    

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

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

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

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

git reflog

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

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

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

Другой путь:

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

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

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

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

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

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

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

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

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

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


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

git commit --amend -m "message"

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

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

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

git reset <the previous co>
124
ответ дан 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

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

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

108
ответ дан 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 ": этот вариант перезаписывает историю последнего коммита).

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

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

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

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

git reset --hard HEAD~1
85
ответ дан thestar 28 авг. '14 в 19:03
источник поделиться

В этой статье есть отличное объяснение того, как идти о различных сценариях (где совершена фиксация, а также нажать "ИЛИ" только коммит до нажатия):

http://christoph.ruegg.name/blog/git-howto-revert-a-commit-already-pushed-to-a-remote-reposit.html

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

git revert dd61ab32
79
ответ дан AmpT 07 февр. '14 в 1:08
источник поделиться
  • 1
  • 2
  • 3

Другие вопросы по меткам