Git репозиторий сломан прерванным коммитом
Я сломал свой локальный репозиторий Git, прерывая git commit
с помощью Ctrl+C (два коммита назад). Как я могу это исправить?
Выход из git stash
:
$ git stash
fatal: bad revision 'HEAD'
fatal: bad revision 'HEAD'
fatal: Needed a single revision
You do not have the initial commit yet
Выход из git fsck --lost-found
:
$ git fsck --lost-found
notice: HEAD points to an unborn branch (Multi-Threading)
Checking object directories: 100% (256/256), done.
Checking objects: 100% (67/67), done.
error: refs/heads/Multi-Threading: invalid sha1 pointer 0000000000000000000000000000000000000000
dangling commit 2d5af11417b9508ece28c1bb1502e5299a2fa2d0
dangling commit 3b0dfd77c49c12a23469c036db7f45378a1bf740
dangling commit 47d212cf4c018b9f3544325a26c90f74d3323489
dangling commit 82674535931943f64b4a3475c14475591d84a318
dangling commit 83604cf338ccb0491081f7f27c2217bc11fba0c2
dangling blob a3133e60fe8fec7977270d1e93c0869e169024f1
dangling commit aae880196744421d1ffbf7dc23aa8965d4ee1f46
dangling blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
dangling commit f9558f1235c4a239b2c8d0677d2b1c31eb400836
Выход из git reflog
:
$ git reflog
fatal: your current branch 'Multi-Threading' does not have any commits yet
Также невозможно написать в .git/refs/heads/Multi-Threading
:
$ echo 47d212cf4c018b9f3544325a26c90f74d3323489 > .git/refs/heads/Multi-Threading
An error occurred while redirecting file '.git/refs/heads/Multi-Threading'
open: No such file or directory
2 ответа
Моя проблема была связана с системной ошибкой.
Я перезапустил, перезапустил echo 47d212cf4c018b9f3544325a26c90f74d3323489 > .git/refs/heads/Multi-Threading
без ошибок и это исправило мою проблему.
Прерывание Git не должно разрушать хранилище (Git ловит сигналы прерывания клавиатуры и обрабатывает их изящно), но на этом этапе вам нужно выяснить, что случилось с .git/refs
:
- Существует ли он как каталог?
- Содержит ли он файл с именем
packed-refs
? Если это так, используйте содержимое этого файла осторожно. Если нет, то, наверное, все в порядке. - Содержит ли он подкаталоги
heads
,remotes
и / илиtags
?heads
одно обязательно должно существовать, два других будут созданы, если и когда это необходимо. - Если
.git/refs/heads/
существует, почему вы получаете сообщение об ошибке при попытке создать файл с именемMulti-Threading
внутри?
Ввод 47d212cf4c018b9f3544325a26c90f74d3323489
в файл с именем .git/refs/heads/Multi-Threading
похоже, это правильный подход (хотя я не знаю, почему вы выбрали 47d212cf4c018b9f3544325a26c90f74d3323489
как конкретное обязательство использовать; обратите внимание, что те, которые показаны git fsck
выйти в несколько случайном порядке; но один из этих висячих коммитов, вероятно, правильный).
(Файл упакованных ссылок, если он существует, содержит значения ссылок, которые были упакованы таким образом, чтобы занимать один файл вместо множества отдельных файлов. Какой бы формат он ни был, тот, который нравится Git. Обратите внимание, что создание .git/refs/heads/<name>
файл переопределит соответствующий packed-refs
значение.)