Потерянные последние файлы после «проверки» - PullRequest
0 голосов
/ 20 апреля 2020

Я внес некоторые изменения в файл a.py и создал два новых файла b.py и c .py, а затем зафиксировал изменения, но получил предупреждение:

The Git repository at the following path is in the detached HEAD state

Я проигнорировал его и совершил изменения в любом случае. Давайте назовем этот коммит как коммит X.

Затем я сделал checkout и boom, файлы a.py и b.py исчезли, как и изменения, внесенные в a.py. Теперь коммит X не отображается в списке коммитов.

У меня была только основная ветка, так что это не потому, что я нахожусь в другой ветке.

Я не понимаю Git, и я использую графический интерфейс PyCharm. Как я могу вернуть файлы?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

Вы находились в отключенном состоянии HEAD, то есть у вас было состояние, подобное этому, когда HEAD не указывал ни на одну ссылку:

A <--master
|
B <--HEAD
|
C

Затем вы добавили несколько файлов и зафиксировали их, что-то вроде это:

touch new_file.txt

git add new_file.txt

git commit -m "your detached HEAD commit"

В этот момент ваше дерево выглядело так:

master --> A  
           |  D <--HEAD
           |  |
           B / 
           |
           C

Поскольку D не указывал на ветку или другую ссылку (вы были "отсоединены") , когда вы снова проверили мастер, git не мог ссылаться на D, поэтому он был «потерян»:

A <--master (HEAD)
|
B 
|
C

Чтобы найти D, используйте git reflog и найдите что-то вроде этого:

0abce (HEAD -> master) HEAD@{0}: checkout: moving from b214e to master
b214e HEAD@{1}: commit: your detached HEAD commit

be14e - это имя коммита, который вы ищете, поэтому git checkout be14e, чтобы получить его снова (вы также можете git checkout файлы напрямую в master, но это другой урок) :

master --> A  
           |  D <--HEAD
           |  |
           B / 
           |
           C

Теперь вы можете просматривать потерянные файлы. Вам, вероятно, следует создать ветку на этом этапе, чтобы ваши файлы больше не терялись при переключении веток. Так что git checkout -b new_branch, чтобы получить это:

master --> A  
           |  D <--new_branch (HEAD)
           |  |
           B / 
           |
           C
0 голосов
/ 20 апреля 2020

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

git checkout master
git checkout develop

Но вы также можете оформить указанный c коммит, используя его SHA1 ha sh:

git checkout 54e8cd9354

Когда вы делаете это, вы находитесь в отключенном состоянии, что в основном означает, что ваш следующий коммит не будет добавлен в конце существующей ветви

Вы можете проверить свой последний коммит таким образом :

git log -1
...