В Git, как я могу восстановить подготовленный файл, который был возвращен до фиксации?
Я пытался внести изменения в свой репозиторий, используя Git Tower. Когда я это сделал, возник конфликт, и я по ошибке попал на сцену all (как я хотел сделать после разрешения конфликта). Когда я это сделал, конфликт был помечен как разрешенный.
Я хотел вручную разрешить изменение, поэтому я нажал "Abort Merge", однако, когда я сделал это, он откатил все мои изменения! Есть ли способ вернуть их?
2 ответа
Если у вас есть что-то готовое, вы, вероятно, сможете вернуть это. (Если вы просто изменили рабочую копию, вы не сможете ее восстановить.)
Прежде всего: не беги git gc
, Сделайте резервную копию вашего хранилища и рабочей копии, прежде чем идти вперед. (Обязательно сделайте резервную копию .git
каталог.) Также избегайте закрытия терминала, где это произошло, и / или перезагрузки - если все не удается, у вас есть шанс найти что-то в истории / памяти.
В любом случае, первое, что нужно попробовать:
git fsck - потерянный-найденный
Это напечатает что-то вроде
Проверка каталогов объектов: 100% (256/256), сделано. Проверка объектов: 100% (30165/30165), сделано. болтающийся шарик 8f72c7d79f964b8279da93ca8c05bd685e892756 оборванный коммит 4993502a6394491190d3f4d6fb3d1e14019c2e9b
Поскольку вы потеряли промежуточные файлы и не сделали коммит, вы заинтересованы в dangling blob
записей.
Бежать git show <sha>
для каждого - некоторые из них должны быть вашими файлами.
Очень поздний ответ, который может упростить (намного? По сравнению с другими ответами) восстановление, позволив вам быстрее выяснить, какие капли следует восстановить:
git fsck --full --no-reflogs --unreachable --lost-found | grep blob | cut -d\ -f3 | while read in; do printf "blob: $in\n"; git cat-file -p $in; printf "\n--------------------------------\n"; done > recover.txt
Эта команда создаст файл, содержащий хэш и содержимое всех BLOB-объектов, которые можно восстановить.
Таким образом, вы можете легко выполнить поиск в этом файле и восстановить нужные капли с заданным хешем (с помощью команды git cat-file -p 8f72c7d79f964b8279da93ca8c05bd685e892756 > myFile.txt
)
Отказ от ответственности: этот файл может стать огромным и медленным при создании, если у вас много недоступных blob-объектов.
Чтобы расширить ответ Александра с более простой альтернативой: да, если вы подготовили свои изменения, то, вероятно, вы можете получить свои файлы обратно. Когда ты бежишь git add
файлы фактически добавляются в объектную базу данных Git. В тот момент, когда вы это сделаете, git поместит файл в индекс:
% git add bar.txt
% git ls-files --stage
100644 ce013625030ba8dba906f756967f9e9ca394464a 0 bar.txt
100644 6af0abcdfc7822d5f87315af1bb3367484ee3c0c 0 foo.txt
Обратите внимание, что запись для bar.txt содержит идентификатор объекта файла. Git фактически добавил файл в свою базу данных объектов. В этом случае Git добавил его в хранилище как свободный объект:
% ls -Flas .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a
4 -r--r--r-- 1 ethomson staff 21 14 Jun 23:58 .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a
Эти файлы будут в конечном итоге сборщиком мусора (так что, действительно, не запускать явно git gc
). К счастью, по умолчанию это произойдет в течение нескольких месяцев, а не дней. Пока эти файлы не будут удалены, вы можете восстановить их.
Самый простой способ сделать это - загрузить и установить git-recover
Программа в интерактивном режиме:
% git recover -i
Recoverable orphaned git blobs:
61c2562a7b851b69596f0bcad1d8f54c400be977 (Thu 15 Jun 2017 12:20:22 CEST)
> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
> tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
> veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
> commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
Recover this file? [y,n,v,f,q,?]:
git-recover
ищет файлы в объектной базе данных, которые не зафиксированы (или в индексе). Вы можете узнать больше о git-recover
в сообщении в блоге, объявляющем об этом.