Есть ли способ восстановить файлы, игнорируемые через .gitignore при первом коммите? - PullRequest
0 голосов
/ 12 января 2020

У меня есть локальный репо. Я сделал ошибку, добавив файл .gitignore перед первым коммитом со всем кодом. После добавления файла .gitignore в моем репо остались только те файлы, которые я хотел игнорировать, то есть те, которые соответствовали моему файлу .gitignore.

Отслеживание шагов:

  • У меня была папка.
  • Я запустил git init .
  • Я добавил обычный Python .gitignore файл.
  • Затем я обязался добавить .gitignore file.
  • После этого в моем каталоге остались только те файлы, которые мой .gitignore файл должен был игнорировать. Запутывает?

Есть ли способ восстановить файлы, которые были проигнорированы при первом коммите моего репо?

Ниже приведен скриншот после запуска git reflog

enter image description here

Заранее спасибо

1 Ответ

2 голосов
/ 12 января 2020

Исходя из вывода reflog, я предполагаю, что вы запустили git reset --hard, после a git add, но до a git commit. Это удалит все файлы, которые вы добавили. Вы можете иметь возможность восстановить их содержимое, но не имена файлов.

Вот пример:

$ mkdir treset
$ cd treset
$ git init
Initialized empty Git repository in ..
$ echo '*.pyc' > .gitignore
$ git add .gitignore
$ git commit -m initial
[master (root-commit) bca0228] initial
 1 file changed, 1 insertion(+)
 create mode 100644 .gitignore
$ echo precious data 1 > file1
$ echo precious data 2 > file2
$ git add .
$ git reset --hard
HEAD is now at bca0228 initial
$ ls
$

Как видите, файлы ценных данных ушел!

Их данные находятся в настоящее время без ссылок Git объекты BLOB-объектов , которые мы можем Git обнаружить и разместить в его каталог lost+found:

$ git fsck --lost-found
Checking object directories: 100% (256/256), done.
dangling blob 683416f292727f4659d5efa59d068189cf1b43bc
dangling blob f9d4c4040845bb7db25db33ec455d9a0c6703e68

Теперь, чтобы получить обратно content , мы заглядываем внутрь соответствующего каталога (вы можете видеть здесь, я забыл включить other/ в начальный cd) и проверьте содержимое каждого файла. имена файлов потеряны - они были в индексе, который мы сбрасываем с помощью git reset --hard, и не сохраняются где-либо еще, но если мы помним, что precious data 1 означает file1 и так далее, мы может mv вернуть файлы:

$ cd .git/lost-found/
$ ls
other
$ cd other/
$ ls
683416f292727f4659d5efa59d068189cf1b43bc
f9d4c4040845bb7db25db33ec455d9a0c6703e68
$ cat 683416f292727f4659d5efa59d068189cf1b43bc 
precious data 1
$ cat f9d4c4040845bb7db25db33ec455d9a0c6703e68 
precious data 2

отсюда:

$ mv 683416f292727f4659d5efa59d068189cf1b43bc ../../../file1
$ mv f9d4c4040845bb7db25db33ec455d9a0c6703e68 ../../../file2

возвращает файлы туда, где мы хотим, в рабочем дереве нового репозитория (<em>path/to</em>/treset в моем случае).

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