Восстановить из git reset --hard? - PullRequest
376 голосов
/ 26 апреля 2011

Есть ли способ восстановить незафиксированные изменения в рабочем каталоге из git reset --hard HEAD?

Ответы [ 20 ]

381 голосов
/ 16 июня 2014

ответ от этого ТАК

$ git reflog show
93567ad HEAD@{0}: reset: moving to HEAD@{6}    
203e84e HEAD@{1}: reset: moving to HEAD@{1}    
9937a76 HEAD@{2}: reset: moving to HEAD@{2}
203e84e HEAD@{3}: checkout: moving from master to master
203e84e HEAD@{4}: reset: moving to HEAD~1
9937a76 HEAD@{5}: reset: moving to HEAD~1
d5bb59f HEAD@{6}: reset: moving to HEAD~1
9300f9d HEAD@{7}: commit: fix-bug

# said the commit to be recovered back is on 9300f9d (with commit message fix-bug)
$ git reset HEAD@{7}

Ты вернул свой день! :)

374 голосов
/ 26 апреля 2011

Вы не можете вернуть незафиксированные изменения в целом.

Ранее подготовленные изменения (git add) должны быть восстановлены из индексных объектов, поэтому, если вы это сделали, используйте git fsck --lost-found, чтобы найти связанные с ним объекты. (Это записывает объекты в каталог .git/lost-found/; оттуда вы можете использовать git show <filename>, чтобы просмотреть содержимое каждого файла.)

Если нет, ответ здесь будет следующим: посмотрите на свою резервную копию. Возможно, ваш редактор / IDE хранит временные копии в / tmp или C: \ TEMP и тому подобное. [1]

git reset HEAD@{1}

Это восстановит предыдущую ГОЛОВУ

[1] vim например, опционально сохраняет постоянную отмену, eclipse IDE сохраняет локальная история ; такие функции могут сохранить ваш **

289 голосов
/ 21 июля 2011

Сегодня я случайно запустил git reset --hard в своем репо, но сегодня также произошли незафиксированные изменения.Чтобы вернуть его, я запустил git fsck --lost-found, который записал все не имеющие ссылки большие двоичные объекты в <path to repo>/.git/lost-found/.Поскольку файлы не были переданы, я нашел их в каталоге other в <path to repo>/.git/lost-found/.Оттуда я могу видеть незафиксированные файлы, используя git show <filename>, копировать BLOB-объекты и переименовывать их.

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

146 голосов
/ 02 декабря 2016

Да, ВЫ МОЖЕТЕ ВОССТАНОВИТЬ с жесткого сброса в git.

Использование:

git reflog

чтобы получить идентификатор вашего коммита. Тогда используйте:

git reset --hard <commit-retrieved-using-reflog>

Этот трюк пару раз спас мне жизнь.

Документацию по reflog ЗДЕСЬ .

56 голосов
/ 06 ноября 2016

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

Я запустил git reset --hard origin/master: P

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

Это спасло мне жизнь:

git reflog show
git reset HEAD@{1} 
git push 

Надеюсь, это спасет другую жизнь.

32 голосов
/ 29 мая 2015

Если вы используете что-то вроде IntelliJ:

В контекстном меню выберите Local History и нажмите Показать историю в подменю:

Представление локальной истории для проекта илиПапка показывает вам все, что вы сделали за последние несколько дней.В столбце «Действие» в нижней части диалогового окна выберите действие, которое необходимо откатить.[...] Таким образом, в верхней части диалогового окна отображается древовидная структура измененных файлов.Если вы хотите восстановить только удаленный файл, независимо от других изменений, которые были сделаны с тех пор, вы можете выбрать файл Lost.txt в виде дерева и нажать кнопку «Восстановить».

http://blog.jetbrains.com/idea/2008/01/using-local-history-to-restore-deleted-files/

Это только что вытащило мою задницу из огня!

29 голосов
/ 13 января 2012

Я только что сделал git reset --hard и потерял все свои незафиксированные изменения.К счастью, я использую редактор (IntelliJ), и мне удалось восстановить изменения из локальной истории.Затмение должно позволить вам сделать то же самое.

15 голосов
/ 29 мая 2015

По определению, git reset --hard отбрасывает незафиксированные изменения без какого-либо способа их восстановления Git (ваша система резервного копирования может помочь, но не Git).

На самом деле, очень мало случаев, когда git reset --hard - хорошая идея. В большинстве случаев есть более безопасная команда, чтобы сделать то же самое:

  • Если вы хотите отбросить незафиксированные изменения, используйте git stash. Он сохранит резервную копию этих изменений, срок действия которых истечет через некоторое время, если вы запустите git gc. Если вы на 99,9% уверены, что эти изменения вам никогда не понадобятся, то git stash по-прежнему ваш друг в случае с 0,1%. Если вы уверены на 100%, тогда git stash все еще ваш друг, потому что эти 100% имеют ошибку измерения; -).

  • Если вы хотите переместить HEAD и верхушку текущей ветви в истории, тогда git reset --keep ваш друг. Он будет делать то же самое, что и git reset --hard, но не отменяет ваши локальные изменения.

  • Если вы хотите сделать то и другое, тогда git stash && git reset --keep ваш друг.

Научите ваши пальцы не использовать git reset --hard, он окупится за один день.

10 голосов
/ 31 мая 2017

Это то, что я обычно делаю, если теряю некоторые изменения.

git reflog
git checkout <commit id> // now you are in where you want but you cannot push from detached branch to master
manually copy and paste changes from detached branch to master or working branch
git reset --hard HEAD // if needed
git add ... > git commit ... > git push ...

чтобы переместить указатель назад к вашим предыдущим коммитам, но сохранить изменения, которые вы сделали до сих пор в вашей последней проверке коммитов git reset --soft dadada

8 голосов
/ 01 августа 2014

Информация потеряна.

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

Но, если вы только что сделали git diff, существует способ восстановления с помощью вывода терминала, выполнив следующие 3 простых шага.

  1. прокрутите свой терминал и найдите значение o / p git diff. Сохраните o / p в файле с именем diff.patch
  2. Поиск и замена всех 7 пробелов и 8 пробелов символом табуляции (\ t) и сохранение изменений.
  3. Зайдите в свой репозиторий git. Примените diff.patch (patch -p1 < diff.patch)

Вы спасены! :)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...