Сломанная ветка в 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/ каталог есть) и

  1. Редактирование элемента списка .git/packed-refs; если вы видите строку с названием вашей ветви, то удалите ее
  2. смотреть в .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

и, к счастью, он начал работать.

если ваши и пусты

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

Как ни странно, мое решение состояло в том, чтобы закрыть терминал и снова открыть его, а затемиволшебным образом снова сработало. Должно быть, что-то пошло не так в моей среде bash, а не в самом репозитории git.

У меня такая же проблема. Я просто удалил все файлы внутри .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 и вставил его в пустой файл, это решило проблему

Другие вопросы по тегам