Git-reset --hard, пока еще нет коммитов

Каково поведение git reset, в частности git reset --hard, в то время как у tree еще нет коммитов? (Сразу после git init). Он просто все удаляет?

Испортил это при редактировании .gitignore. Я попытался применить новые изменения к .gitignore, прежде чем сделать первую фиксацию. Итак, чтобы игнорировать некоторые новые файлы, мне пришлось очистить индекс, а затем снова создать git add .. Думаю, простой git reset не справился бы, но я использовал git reset --hard из-за моей гениальности.

Теперь папка проекта содержит только папку .git с содержимым, а также всю структуру папок проекта но без файлов. Почему?

Могу ли я восстановить файлы? Какие у меня варианты в этом случае?

UPD

@kowsky указал мне в правильном направлении - в этом ответе они объясняют, как восстанавливать файлы, которые временно хранятся в .git/objects (висячие капли), как в моем случае (в частности, с помощью инструмента это). Все восстановил, спасибо!

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

Mattia Righetti 11.04.2018 13:01
git status предоставляет вам правильную команду для деактивации файла (это git reset HEAD <file>; обратите внимание, что --hard не включен). git reset --hard делает индекс и рабочее дерево идентичными фиксации, которую вы передаете в качестве аргумента. Поскольку у вас еще нет фиксации, ваше репо пусто, и рабочее дерево синхронизировано с ним. Ваши файлы ушли.
axiac 11.04.2018 13:01

Вы должны дать ответ.

Steve Bennett 11.04.2018 13:04
1
3
1 121
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

What is behavior of git reset, specifically git reset --hard, while tree has no commits yet?

Если вы добавляете файлы, а затем используете git reset --hard, ваши файлы будут удалены. Не отслеживаемые файлы не будут затронуты.

Can I recover the files?

Если вы никогда не добавляли или не фиксировали файлы, git ничего о них не знает и не сможет их восстановить. Однако все добавленные файлы можно восстановить. Здесь и здесь - это ответы о том, как их восстановить.

Я использовал git add .. Как я уже сказал, не совершал никаких действий. «Зачем вы чистили индекс» - я чистил индекс после обновления gitignore, чтобы применить изменения.

Kostya 11.04.2018 13:11

"Какие файлы вы создали в своих каталогах?" - просто текстовые файлы. Почему это имеет значение?

Kostya 11.04.2018 13:13

Это имеет значение, потому что я хочу как можно лучше понимать, что происходит. Я отредактировал свой ответ и добавил ссылку на ответ на Восстановить однажды подготовленные, но не зафиксированные файлы?.

kowsky 11.04.2018 13:21

Ах да, теперь после этой ссылки я понимаю, почему вы спросили о типах файлов. Это был проект на Python, поэтому были простые текстовые файлы + папка virtualenv (с некоторыми двоичными файлами) + база данных sqlite. Но текстовые файлы - это все, что мне нужно.

Kostya 11.04.2018 13:28

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

kowsky 11.04.2018 13:29

Хорошо спасибо! Собираюсь покопаться в этом. У меня есть несколько объектов в папке .git/objects (20 МБ), и если я смогу восстановить несколько файлов, я буду более чем доволен.

Kostya 11.04.2018 13:37

Я восстановил все свои файлы по последней ссылке. Спасибо, @kowsky, ты спас мне день!

Kostya 11.04.2018 14:36

Давайте проясним это.

Вы инициализировали свой локальный репозиторий git, запустив git init, это действительно создает папку .git, в которой будут храниться все инструменты и объекты git.

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

enter image description here

Вы не фиксировали эти изменения, поэтому, когда вы запускаете git reset --hard HEAD, вы в основном говорите: «Сделайте все (промежуточная область, рабочая область, зафиксированная область), как указывает HEAD фиксации, что в данном случае нет, действительно, что это делает в этом дело удалить все.

Проверьте ответ это, чтобы узнать, сможете ли вы вернуть эти файлы.

Чтобы избежать такой делеции в следующий раз, я бы предложил использовать либо git reset --soft, либо git reset, что является аббревиатурой git reset --mixed.

Этот, вероятно, объяснит вещи глубже.

да спасибо, я понял

Kostya 11.04.2018 14:34

Другие вопросы по теме