Сломанная ветка в git, роковая: ваша текущая ветка кажется сломанной
Вот мой случай:
- Я работал над одной веткой.
- Выдвинул новые коммиты на пульт.
- Перешел обратно в главную ветку.
Но вдруг после ввода git checkout master
По команде мой компьютер столкнулся с синим экраном смерти и произошло неожиданное отключение. После запуска моего компьютера я проверил состояние моей текущей ветки и в результате я получил каждый файл как помеченные новые файлы.
Теперь я застрял в этой точке и после git log
Команда Я получаю ошибку
$ git log
fatal: your current branch appears to be broken
Как решить эту проблему и восстановить мою ветку?
Я работаю с windows 7 и git bash последней версией
Изменить: я не хочу, чтобы удалить эту ветку.
13 ответов
Я сталкиваюсь с подобной проблемой в Windows 7. В моем случае , текущий файл ветки (см. ./git/HEAD
) под \.git\refs\heads
был сломан.
Я нашел хэш-код сломанной текущей ветви на .git\logs\refs\heads
с тем же именем филиала.
И я исправил проблему, открыв этот файл (.git\logs\refs\heads\xxx
) с помощью блокнота и скопируйте 4-е число (хэш-код) в (.git\refs\heads\xxx
)
Файлы в каталоге.git\refs\head являются вашими ветвями. Проверьте эти файлы. Они должны содержать только один коммит объектов SHA-1 хеш. Этот хэш - ваш ключ SHA-1 последних коммитов и ваш HEAD одновременно.
Скопируйте ключ SHA-1 и введите
$ git cat-file -t 5917fefd485f655ab369d4e9eeda3c157c03f514
commit
$ git cat-file -p 5917fefd485f655ab369d4e9eeda3c157c03f514
tree b75cab3c54b780075b312be3e878b389a2baf904
parent 8235189aa22169295243d295fb1cc2ff2f8f7cd5
author Ilker Cat <ilker.cat@blabla.com> 1495136738 +0200
committer Ilker Cat <ilker.cat@blabal.com> 1495136738 +0200
Второй вывод - это то, что в основном содержит объект фиксации. Попытайтесь проверить, не поврежден ли объект фиксации в вашей основной ветке под.git\refs\head \master и его ключами дерева и родительского SHA-1.
Даже некоторые апострофы в вашем главном файле ветвей приведут к "сломанной ветви". Он должен содержать только последний хеш объекта SHA-1 и ничего больше.
Вы можете столкнуться с этой ошибкой, если попытаетесь переименовать ветвь в ветвь с именами (или папками).
Если это произойдет, перейдите в каталоги .git/logs/refs/heads/<name>
а также .git/refs/heads/<name>
и вы увидите, что ваша ветка теперь является папкой с файлом внутри нее.
В обеих папках переместите файл на уровень папки, извлеките эту ветку, удалите пустые папки, и теперь вы сможете выполнять git checkout -b <name>/<subname>
без ошибок или git branch -M <name>/<subname>
,
Я решил это, клонировав репо в новую папку, а затем заменив измененные файлы. Не кажется хорошим решением, но это безопасно!
Некоторое время это может также произойти из-за проблем с правами доступа к файлам, проверьте, есть ли у вас соответствующие разрешения для всех файлов в хранилище.
Название вашей ветки теперь, вероятно, содержит какие-то специальные символы или что-то подобное
Вы должны перейти в корневой каталог вашей проверки (где .git/
каталог есть) и
- Редактирование элемента списка
.git/packed-refs
; если вы видите строку с названием вашей ветви, то удалите ее - смотреть в
.git/refs/heads for
файл с именем вашей ветки; если вы видите один, удалите его
Была такая же проблема. Удаление.git\refs\head \ исправило проблему для меня.
В некоторых случаях после использования Блокнота открыть файл, названный по имени моей ветки, найденный в .git\logs\refs\heads\<MY-CORRUPTED-BRANCH>
был пуст. Я удалил это.
и запустите, чтобы получить последнюю фиксацию
git reflog
4404dd7 HEAD@{0}: commit: update README
а потом я бегу
git reset --hard 4404dd7
HEAD теперь на 4404dd7 обновить README
и ветка вернулась.Запись
Это может разойтись по вашей ветке. Так что вам может потребоваться исправить их позже.
4404dd7 был моим последним коммитом в этой ветке, и я не знаю, правильное ли это решение или нет, но это сработало или я.
я только что сделал
git checkout some_branch_name
git checkout branch_i_needed
и, к счастью, он начал работать.
если ваши и пусты
У меня была проблема, и я просто ничего не показывал. Я думаю, это было из-за неудачного
Как ни странно, мое решение состояло в том, чтобы закрыть терминал и снова открыть его, а затем
У меня такая же проблема. Я просто удалил все файлы внутри
.git/refs/heads
, затем я попытался отредактировать один из моих файлов, чтобы git принял фиксацию. Затем, когда я отправил свои файлы, я получил эту ошибку:
10:47 Отправка отклонена Отправка была отменена из-за конфликтов во время обновления. Убедитесь, что конфликты разрешены правильно, и снова вызовите push.
Однако я решил это, приняв опцию rebase при слиянии файлов, не давая конфликтов.
Хорошо для этой проблемы, я обнаружил, что если вы вернетесь и клонируете свое репо, вам нужно просто скопировать папку .git из нового репо и заменить папку .git в старом репо.
Остальное - история: запустите git add. а затем git commit и push.
это случилось и со мной, когда я закрыл IDE, пока фиксация все еще выполняется, когда я открыл .git/refs/heads/branch-name, файл был пуст, поэтому, как было предложено выше, я скопировал хэш последней фиксации из .git/logs/refs/heads/branch-name и вставил его в пустой файл, это решило проблему