Восстановление добавленного файла после выполнения git reset --hard HEAD^



Я добавил новый файл F1 и внес изменения в другой файл F2, но затем сделал "git reset --hard HEAD^", и я потерял все изменения в файлах.



здесь некоторые кстати, я могу их вернуть.



Я посмотрел на связанный с этим вопрос здесь: как я могу отменить git reset --hard HEAD~1? но, этот вопрос предполагает, что один сделал git commit.

663   5  

5 ответов:

вы можете (с некоторой работой) восстановить состояние файла на последнем "git add ". Вы можете использовать

$ git fsck --cache --no-reflogs --lost-found --unreachable  HEAD

а затем изучить файлы в '.git/lost-found / other' каталог.

читайте git fsck manpage.

(я предполагаю, что отсутствует файл не частью какого-либо совершал. В противном случае, git log --all -g --diff-filter=D --stat - твой друг.)

  1. получить список недостижимых файлов, которые git знает имя файла:

    git fsck --unreachable --no-reflogs --no-cache HEAD | fgrep " tree " \
    | cut -d " " -f3 | xargs -r -n1 git ls-tree \
    | fgrep " blob " | cut -d " " -f 3- | sort -k2 -u
    
  2. если вы видите что-то интересное, git cat-file blob SHA-1-of-interesting-file выведет файл на стандартный вывод. (Пример: git cat-file blob b8f0bdf56 > recovered-logo.png)

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

если отсутствующий файл никогда не был поставлен (git stage или git add) или спрятал (git stash), вам в значительной степени не повезло, потому что, насколько git знает, файл никогда не существовал. (Вы все еще можете попробовать сделать git fsck --no-reflogs --lost-found и оглядываясь в каталоге .git/lost-found/other чтобы узнать, есть ли у вас что-нибудь стоящее, если у git действительно есть копия вашего пропавшего файла по какой-то счастливой случайности. У вас нет имена файлов, чтобы помочь вам в этом случае только содержание файла.)

в случае, если вы просто потеряли некоторые коммиты (а не только файлы), вы, вероятно, захотите запустить что-то вроде этого:

gitk --all $( git fsck | awk '/dangling commit/ {print }'; git log -g --pretty='format:%H' )

это будет работать gitk со всех ветвей, всех reflog и все болтались совершает. Вы можете добавить -n 10000 или какой-то другой предел, если у вашего РЕПО действительно много коммитов (скажем, ядро linux). Если у вас нет gitk, вы можете вместо этого запустить меньшую версию, используя только командная строка, как это:

git log --all --decorate --stat --graph --date-order $( git fsck | awk '/dangling commit/ {print }'; git log -g --pretty='format:%H' )

или версия с менее подробным выводом

git log --all --decorate --oneline --graph --date-order $( git fsck | awk '/dangling commit/ {print }'; git log -g --pretty='format:%H' )

есть git plugin что делает это "из коробки":

https://github.com/pendashteh/git-recover-index

$ cd /path/to/disatered/repo
$ git clone [email protected]:pendashteh/git-recover-index.git $HOME/.git-recover-index
$ $HOME/.git-recover-index/git-recover-index.sh

на самом деле, если вы добавили объект в индекс (с помощью git add), есть большой двоичный объект, созданный для этого состояния объекта, но нет дерева (и, следовательно, фиксации) объекта, который ссылается на него. Вот как можно получить "висячий" свободный объектный файл, и если вы запустите git fsck, он покажет вам неиспользуемый blob (git gc удалит эти типы объектов, если он будет запущен).

из-за этого, вы можете использовать reflog, если он у вас включен, чтобы попытаться восстановить состояние индекса для вашего файла F1, который был добавлен. Если вы вообще не добавили F2, то, как сказал Грег, git ничего не знает об этом, и вам не повезло.

попробуйте это http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html

Я получил сердечный приступ за изменения, которые я потерял. Но после этого поста. Я получил свои изменения обратно

Comments

    Ничего не найдено.