Возможно ли извлечь удаленные файлы из git начального коммита после полного сброса? - PullRequest
0 голосов
/ 09 апреля 2020

Я собирался сделать резервное копирование нового проекта удаленно с git впервые за некоторое время.

Настройка git, сделал начальную фиксацию кода, собирался pu sh когда я понял, что есть файл ресурсов с данными, я бы предпочел не pu sh. Пошёл гуглить на то, как отменить начальный коммит и тупо просто следовал за постом без полного понимания результатов (я знаю, но уже поздно, это был долгий день).

Сделал git update-ref -d HEAD с последующим git reset --hard .

Возможно, я потом снова сделал git add ., не уверен. Теперь ls и IDE показывают все как удаленное.

git status показывает Changes to be committed:, за которым следует то, что выглядит как весь мой источник, зеленым цветом, с каждым элементом, помеченным как new file

Ниже это Changes not staged for commit: вместе со всеми файлами, перечисленными снова, красным цветом, помеченным как deleted

Я надеюсь, что источник все еще находится где-то под git, и есть способ получить его ? Из статуса git это выглядит как простое принятие, это сделает это, и я могу pu sh что? Но я не хочу рисковать.

(в случае, если это важно для других способов восстановления файлов, Ubuntu 18.04, данные находятся на диске в формате ntfs)

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

reflog и многое другое, для работы нужно HEAD. Но git update-ref -d HEAD удалено HEAD.

$ git update-ref -d HEAD
$ git log HEAD
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

$ git reflog
fatal: your current branch 'master' does not have any commits yet

Но рефлог есть!

$ cat .git/refs/HEAD
0000000000000000000000000000000000000000 511454e5c9b2226dc8f7f20d386037c16373bac1 Michael G. Schwern <schwern@pobox.com> 1586460927 -0700   commit (initial): first
511454e5c9b2226dc8f7f20d386037c16373bac1 0000000000000000000000000000000000000000 Michael G. Schwern <schwern@pobox.com> 1586460936 -0700
0000000000000000000000000000000000000000 8bd6cfbcdc36f55a6f681445eb8530f56238136d Michael G. Schwern <schwern@pobox.com> 1586460969 -0700   commit (initial): new first
8bd6cfbcdc36f55a6f681445eb8530f56238136d 511454e5c9b2226dc8f7f20d386037c16373bac1 Michael G. Schwern <schwern@pobox.com> 1586461084 -0700   reset: moving to 511454e

Сделайте еще один коммит, чтобы получить HEAD. Тогда reflog сработает.

...commit anything...

$ git reflog
8bd6cfb (HEAD -> master) HEAD@{0}: commit (initial): new first
511454e HEAD@{2}: commit (initial): first

В этом примере git reset --hard 511454e восстановит первый коммит.


git update-ref -d HEAD; git reset --hard излишне для пересмотра существующего коммита.

Вместо этого отредактируйте и добавьте как обычно. Затем используйте git commit --amend, чтобы переписать последний коммит. Подробнее см. Переписывание истории в Pro Git.

0 голосов
/ 09 апреля 2020

В случае, если это поможет кому-то еще, я попробовал предложения в комментариях (спасибо за это).

Я бы не делал никаких предыдущих коммитов, поэтому reflog ничего не показывал, и не было никаких свисающих коммитов с git fsck. Однако они могут работать для кого-то другого при других обстоятельствах.

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

В конце концов, мне посчастливилось восстановить все, используя TestDisk для восстановления удаленных файлов.

Уроки выученный - всегда начинайте делать резервные копии и делать резервные копии с самого начала, даже если это просто домашний проект; и усталость не освобождает от ответственности за нарушение правила не выполнять случайные команды из t'inte rnet без полного понимания потенциальных последствий

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