git сброс - жесткое восстановление - PullRequest
0 голосов
/ 12 июля 2020

Сначала я даже не писал git init.
А затем, чтобы использовать AWS beanstalk (после того, как я закончил кодирование), я инициализирую git. И я использую «git добавить». команда. но я знал, что не создавал файл «gitignore», поэтому я запустил git reset --hard, чтобы сбросить «git add», поэтому все мои файлы теперь удалены. Что нам делать, чтобы это восстановить? "git reflog" не работает. что мне делать, чтобы восстановить мой предыдущий код.

Ответы [ 2 ]

3 голосов
/ 12 июля 2020

Поскольку вы добавили файлы, git все еще должен иметь след их содержимого.

Выполнить:

git fsck --full --unreachable --no-reflog | grep blob

Это даст вам список хэшей, каждый из которых указать на большой двоичный объект (содержимое файла). К сожалению, имена файлов не сохраняются, поэтому вам нужно будет понять, какой blob нужно восстановить, и найти их имена обратно.

Вот способы разобраться из этих хэшей:

Вы можете просмотреть содержимое большого двоичного объекта:

git show <sha>

# restoring a blob is just :
git show <sha> > filename

Если вы помните определенное c слово или инструкцию в файле, вы можете использовать git grep <string> <sha> в список капель:

$ git fsck --full --unreachable --no-reflog | grep blob | awk '{ print $3 }' > list.txt
$ cat list.txt | while read blob; do
  if git grep -q "string" $blob; then
    echo $blob
  fi
done

Вы можете использовать трюк, чтобы отсортировать их по дате модификации (которая должна быть: моментом добавления)

# using the same list.txt as above :
cat list.txt |\
    sed -e 's|^\(..\)\(.*\)|.git/objects/\1/\2|' |\
    xargs ls -l -t 2> /dev/null

(дополнительные объяснения для этого трюк в этом ТАК вопросе )

1 голос
/ 12 июля 2020

Хорошая новость в том, что git reset --hard меняет то, что Git считает ревизией HEAD для ветки. Фиксация, которая раньше была HEAD, все еще находится в вашем локальном репо.

Однако есть пара плохих новостей:

  1. Определение того, что фиксация HEAD была предыдущий не является однозначным. Но эти вопросы и ответы предлагают несколько возможных решений:

  2. Если при выполнении операции git reset --hard были внесены незафиксированные изменения, они не подлежат восстановлению. Git запоминает только то, что вы передали (или спрятали).

Теперь вы говорите, что git reflog «не работает». Согласно документации, git reset --hard не влияет на журнал ссылок. Итак, я предполагаю, что ваше «не работает» означает, что он не вернет незафиксированные файлы. Если так, боюсь, вам не повезло. Эти файлы исчезли 1 .

Совет постфактум, который я бы дал:

  • «фиксируйте рано, фиксируйте часто» и
  • убедитесь, что у вас есть резервная копия вашего локального git дерево репо в безопасном месте, прежде чем вы приступите к потенциально опасным Git процедурам, которые вы не совсем понимаете.

1 - Если недостающие файлы не были сохранены в резервных копиях файловой системы, в буферах редактора / IDE, в истории или в чем-то подобном.

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