Я пытаюсь восстановить свою работу. Я тупо делал git reset --hard
, а до этого только делал get add .
и не делал git commit
. Пожалуйста помоги! Вот мой журнал:
MacBookPro:api user$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
# modified: .gitignore
...
MacBookPro:api user$ git reset --hard
HEAD is now at ff546fa added new strucuture for api
Возможна ли отмена git reset --hard
в этой ситуации?
Ответы:
Вы должны иметь возможность восстанавливать любые файлы, которые вы добавили в индекс (например, как в вашей ситуации
git add .
), хотя это может потребовать некоторой работы. Чтобы добавить файл в индекс, git добавляет его в базу данных объектов, что означает, что он может быть восстановлен, если еще не произведена сборка мусора. Вот пример того, как это сделать, приведен в ответе Якуба Наребски здесь:Однако я попробовал это в тестовом репозитории, и возникла пара проблем -
--cached
должно быть--cache
, и я обнаружил, что на самом деле.git/lost-found
каталог не создавался . Однако у меня сработали следующие шаги:Это должно вывести все объекты в базе данных объектов, которые недоступны ни по какой ссылке, в индексе или через журнал ссылок. Результат будет выглядеть примерно так:
... и для каждой из этих капель вы можете:
Чтобы вывести содержимое файла.
Слишком много вывода?
Обновление в ответ на sehe «s комментарий ниже:
Если вы обнаружите, что у вас есть много коммитов и деревьев, перечисленных в выходных данных этой команды, вы можете удалить из выходных данных любые объекты, на которые есть ссылки из коммитов без ссылок. (Обычно вы все равно можете вернуться к этим коммитам через reflog - нас просто интересуют объекты, которые были добавлены в индекс, но никогда не могут быть найдены с помощью фиксации.)
Сначала сохраните вывод команды с помощью:
Теперь имена объектов этих недостижимых коммитов можно найти с помощью:
Таким образом, вы можете найти только деревья и объекты, которые были добавлены в индекс, но не зафиксированы в какой-либо момент, с помощью:
Это значительно сокращает количество объектов, которые вам нужно учитывать.
Обновление: Филип Окли ниже предлагает другой способ сократить количество объектов для рассмотрения, а именно рассматривать файлы, которые были недавно изменены
.git/objects
. Вы можете найти их с помощью:(Я нашел этот
find
вызов здесь .) Конец этого списка может выглядеть так:В этом случае вы можете увидеть эти объекты с помощью:
(Обратите внимание, что вам нужно удалить
/
символ в конце пути, чтобы получить имя объекта.)источник
Я только что сделал
git reset --hard
и потерял одну фиксацию. Но я знал хеш фиксации, поэтому смогgit cherry-pick COMMIT_HASH
восстановить его.Я сделал это в течение нескольких минут после потери фиксации, поэтому для некоторых из вас это может сработать.
источник
git reflog
, например,git reset --hard
->git reflog
(глядя на хэш HEAD @ {1}) и, наконец,git cherry-pick COMMIT_HASH
git reset --hard
(при условии , что вы ничего другого после этой команды не сделали) этоgit reset --hard @{1}
Благодаря Марку Лонгару я вернул свои вещи!
Сначала я сохранил все хэши в файл:
затем я помещаю их все (удаляя «недоступный blob») в список и помещаю все данные в новые файлы ... вам нужно выбрать файлы и переименовать их снова, что вам нужно ... но мне нужно было всего несколько файлы .. надеюсь, это кому-то поможет ...
источник
mkdir lost; git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") | grep -Po '\s\S{40}$' | xargs -i echo "git show {} > lost/{}.blob" | sh
. Файлы закончатся вlost/*.blob
Решение @Ajedi32 в комментариях сработало для меня именно в этой ситуации.
Обратите внимание, что все эти решения полагаются на отсутствие git gc, и некоторые из них могут вызвать его, поэтому я бы заархивировал содержимое вашего каталога .git, прежде чем пытаться что-либо, чтобы у вас был снимок, к которому можно вернуться, если он не не работаю для вас.
источник
git reset --hard
, что испортило мое репо каким-либо неизвестным образом. @ Дункан, что делает @ {1}? и какой комментарий вы имеете в виду? Это сбросgit reset
?Решили ту же проблему, но не добавили изменений в индекс. Таким образом, все приведенные выше команды не вернули мне желаемых изменений.
После всех вышеперечисленных подробных ответов это наивный намек, но, возможно, он спасет того, кто не подумал об этом первым, как я.
В отчаянии я попытался нажать CTRL-Z в своем редакторе (LightTable) один раз на каждой открытой вкладке - это, к счастью, восстановило файл на этой вкладке до его последнего состояния до
git reset --hard
. НТН.источник
Это, вероятно, очевидно для профессионалов в области git, но я хотел рассказать об этом, так как в моих безумных поисках я не заметил, чтобы это поднялось.
Я поставил несколько файлов и сделал
git reset --hard
, немного испугался, а затем заметил, что мой статус показывает, что все мои файлы все еще находятся в стадии постановки, а также все их удаления неустановлены.На этом этапе вы можете зафиксировать эти поэтапные изменения, если не планируете их удаление. После этого вам нужно только набраться смелости, чтобы сделать еще
git reset --hard
один раз, который вернет вас к тем изменениям, которые вы поставили, а теперь только что совершили.Опять же, для большинства в этом, вероятно, нет ничего нового, но я надеюсь, что, поскольку это помогло мне, и я не нашел ничего, предполагающего это, это может помочь кому-то другому.
источник
Боже мой, я тянул за волосы, пока не столкнулся с этим вопросом и ответами на него. Я считаю, что правильный и лаконичный ответ на заданный вопрос доступен только в том случае, если вы соберете два комментария выше вместе, так что здесь все в одном месте:
Как упоминалось chilicuil, запустите,
git reflog
чтобы определить там хеш фиксации, к которому вы хотите вернуться.Как упомянул akimsko, вы, скорее всего, НЕ захотите выбирать вишню, если только не потеряли только одну фиксацию, поэтому вам следует запустить
git reset --hard <hash-commit-you-want>
Примечание для пользователей egit Eclipse: я не смог найти способ выполнить эти шаги в Eclipse с помощью egit. Закрытие Eclipse, выполнение приведенных выше команд из окна терминала, а затем повторное открытие Eclipse сработали для меня отлично.
источник
Вышеупомянутые решения могут работать, однако есть более простые способы исправить это, вместо того, чтобы
git
выполнять сложную отмену -s. Я предполагаю, что большинство git-reset происходит с небольшим количеством файлов, и если вы уже используете VIM, это может быть наиболее эффективным решением по времени. Предостережение заключается в том, что вы уже должны использоватьViM's
постоянную отмену, которую вы должны использовать в любом случае, потому что она дает вам возможность отменить неограниченное количество изменений.Вот шаги:
В vim нажмите
:
и введите командуset undodir
. Если выpersistent undo
включили в своем.vimrc
, он покажет результат, подобныйundodir=~/.vim_runtime/temp_dirs/undodir
.В вашем репо используйте,
git log
чтобы узнать последнюю дату / время, когда вы сделали последнюю фиксациюВ вашей оболочке перейдите к своему
undodir
usingcd ~/.vim_runtime/temp_dirs/undodir
.В этом каталоге используйте эту команду, чтобы найти все файлы, которые вы изменили с момента последней фиксации.
find . -newermt "2018-03-20 11:24:44" \! -newermt "2018-03-23" \( -type f -regextype posix-extended -regex '.*' \) \-not -path "*/env/*" -not -path "*/.git/*"
Здесь «2018-03-20 11:24:44» - это дата и время последней фиксации. Если вы сделали дату
git reset --hard
«2018-03-22», используйте «2018-03-22», затем используйте «2018-03-23». Это из-за причуды find, где нижняя граница является включительной, а верхняя граница является исключительной. https://unix.stackexchange.com/a/70404/242983Затем перейдите к каждому из файлов, откройте их в vim и выполните «20 минут раньше». Вы можете найти более подробную информацию о «ранее», используя «h ранее». Здесь
earlier 20m
имеется в виду возврат к состоянию файла на 20 минут назад, при условии, что вы сделали этоgit hard --reset
20 минут назад. Повторите это для всех файлов, которые были выведены изfind
команды. Я уверен, что кто-нибудь сможет написать сценарий, который объединит эти вещи.источник
Я использую IntelliJ и могу просто просмотреть каждый файл и сделать:
Edit -> reload from disk
К счастью,
git status
перед тем, как стереть свои рабочие изменения, я сделал все правильно, поэтому я точно знал, что мне нужно перезагрузить.источник
Запоминание иерархии файлов и использование техники Марка Лонгаира с модификацией Фила Окли дает потрясающие результаты.
По сути, если вы хотя бы добавили файлы в репо, но не зафиксировали его, вы можете восстановить их в интерактивном режиме
git show
, проверить журнал и использовать перенаправление оболочки для создания каждого файла (запоминая интересующий вас путь).НТН!
источник
Если вы недавно просмотрели a,
git diff
то есть другой способ восстановиться после подобных инцидентов, даже если вы еще не внесли изменения: если выводgit diff
все еще находится в буфере вашей консоли, вы можете просто прокрутить вверх, скопировать и вставить дифф в файл и использоватьpatch
инструмент , чтобы применить диф в дерево:patch -p0 < file
. Такой подход меня несколько раз спасал.источник