Ви повинні мати можливість відновити будь-які файли назад, які ви додали до індексу (наприклад, як у вашій ситуації, з git add .
), хоча це може зайнятись певною роботою. Щоб додати файл до індексу, git додає його до об’єктної бази даних, а значить, його можна відновити до тих пір, поки збирання сміття ще не відбулося. Тут є приклад того, як це зробити, наведений у відповіді Якуба Нарбського тут:
Однак я спробував це на тестовому сховищі, і виникло кілька проблем - --cached
повинно бути --cache
, і я виявив, що він фактично не створює .git/lost-found
каталог. Однак для мене спрацювали наступні кроки:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")
Це повинно виводити всі об'єкти в базі даних об'єктів, які не доступні жодним рефінансом, в індексі або через рефлог. Вихід буде виглядати приблизно так:
unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03
... і для кожної з цих крапок ви можете:
git show 907b308
Для виведення вмісту файлу.
Занадто великий вихід?
Оновлення у відповідь на коментар sehe нижче:
Якщо ви виявите, що у вас є багато комітетів та дерев, перелічених у висновку з цієї команди, ви можете вилучити з виводу будь-які об'єкти, на які посилаються нереференційні коміти. (Зазвичай ви можете повернутися до цих комітетів за допомогою рефлогу в будь-якому випадку - нас просто цікавлять об'єкти, які були додані до індексу, але їх не можна знайти через комісію.)
Спочатку збережіть вихід команди, використовуючи:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > all
Тепер імена об'єктів цих недоступних комітетів можна знайти за допомогою:
egrep commit all | cut -d ' ' -f 3
Таким чином, ви можете знайти лише дерева та об’єкти, які були додані до індексу, але не скоєні в будь-який момент, за допомогою:
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \
$(egrep commit all | cut -d ' ' -f 3)
Це надзвичайно скорочує кількість об'єктів, які вам доведеться врахувати.
Оновлення: Філіп Оуклі нижче пропонує ще один спосіб зменшити кількість об'єктів, які слід врахувати, а саме - розглядати останні нещодавно змінені файли в .git/objects
. Ви можете знайти їх за допомогою:
find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort
(Я знайшов тутfind
виклик .) Кінець цього списку може виглядати так:
2011-08-22 11:43:43.0234896770 .git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b
2011-09-13 07:36:37.5868133260 .git/objects/de/629830603289ef159268f443da79968360913a
У такому випадку ви можете бачити ці об’єкти за допомогою:
git show b21700b09c0bc0fc848f67dd751a9e4ea5b4133b
git show de629830603289ef159268f443da79968360913a
(Зверніть увагу, що вам потрібно видалити /
кінець шляху, щоб отримати ім'я об'єкта.)