Я попытался вернуться к предыдущему объявлению git с помощью:
git revert xxx
Теперь я получаю эту ошибку как ответ:
fatal: bad object xxx
Что я делаю неправильно? Как это исправить?
Я попытался вернуться к предыдущему объявлению git с помощью:
git revert xxx
Теперь я получаю эту ошибку как ответ:
fatal: bad object xxx
Что я делаю неправильно? Как это исправить?
[ Изменить, 19 ноября 2016 г.]. Хотя это, как правило, указывает на повреждение репозитория, оно появляется в Windows, когда какая-то команда - обычно, другая Git в другой задаче - содержит внутренние файлы открыть и заблокировать. В этом случае завершение другой задачи должно быть исправлено. Оригинальный ответ ниже.
bad object
с некоторым шестнадцатеричным числом имеет тенденцию означать, что у тега есть недопустимый ссылочный номер в нем, но может также произойти для нескольких других странных случаев. Например, если я делаю:
$ git tag foo
$ vi .git/refs/tags/foo
и измените последний символ (в данном случае от 6 до 5) и напишите это:
$ git log foo
fatal: bad object foo
Что такое xxx
здесь и откуда оно взялось?
Я не знаю, почему именно так происходит. Для меня это потому, что я забыл вытащить весь репозиторий на свой локальный. У меня есть 2 или более пути, и каждый путь тянется от разных ветвей
/path/branch_a/ -> pulled from branch A
/path/branch_b/ -> pulled from branch B
на ветке A, я сделал несколько изменений и совершил как обычно. Я хочу, чтобы в ветке B появилось сообщение commit (например, идентификатор фиксации abcdef123
), поэтому я использую
$ cd /path/branch_b/
$ git branch
master
branch_a
* branch_b
$ git cherry-pick abcdef123
Это дает мне такую ошибку. Поэтому мне нужно вытащить весь репозиторий, прежде чем получить это сообщение
$ git pull
remote: Counting objects: 257, done.
remote: Compressing objects: 100% (58/58), done.
remote: Total 216 (delta 187), reused 186 (delta 158)
Receiving objects: 100% (216/216), 53.13 KiB | 43 KiB/s, done.
Resolving deltas: 100% (187/187), completed with 38 local objects.
From github.com:username/my_repo
abcdef3..80c0d68 branch_a -> origin/branch_a
Already up-to-date.
$ git cherry-pick abcdef123
[branch_b ccddeef] Some commit message
1 file changed, 1 insertion(+), 1 deletion(-)
В моем случае я выбрал вишню из другой ветки, которую я не потянул, но я попытался скопировать идентификаторы фиксации из GH (у меня этого не было на моем месте, где я был вишневым).
Надеюсь, что это поможет; -D
Я просто столкнулся с той же ошибкой (плохой объект [hash]), пытаясь слить из ветки, о которой мой клиент не знал. (Подобно случаю PrzeoR, но вместо того, чтобы нужно тянуть, мне нужно было получить)
В моем случае мне нужно было запустить git fetch, чтобы повторно синхронизировать мой клиент с состоянием сервера. Проводя это здесь, если кто-то достигнет этой темы так же, как я, и мог бы воспользоваться этим прозрением.
git pull
git cherry-pick [hash]
fatal: bad object [hash]
git fetch
remote: Counting objects: 8, done. (etc.)
From github.com:repo/branch
* [new branch] branchname
git cherry-pick [hash]
[success]
Объекты, которые не существуют в репозитории, дают сообщение об ошибке
например:.
git init
touch a
git add a
git commit -m 0
# This object is not in the repository.
git show 1111111111111111111111111111111111111111
Что касается проблемы, трудно сказать без минимального воспроизводимого примера.
Проблемы с субмодулями однажды дали мне эту ошибку.
Я столкнулся с той же ошибкой при попытке выбрать (на A) коммит другой ветки (B). Проблема была глупой, просто забыл нажать git push (B).
вам нужно выполнить git fetch, чтобы синхронизировать последние коммиты с локальными
git fetch
тогда сделай
мерзавец вернуться
Причина, по которой я столкнулся с этим, была проста. Я переключался между основным хранилищем и подмодулем. Я попытался сделать различие между одним хешем (в основном репозитории) и другим, который я скопировал из SourceTree, думая, что было легко получить старый HEAD (я регрессировал одну ревизию, чтобы отследить регрессию). Старый хэд HEAD, который я собрал, был хемом субмодуля, и git diff
был выпущен вместе со мной за то, что он выложил ему мусор. Вот как я оказался здесь, и когда понял, что это ошибка оператора. Если ваш хеш из другого хранилища, git будет ругать вас этим сообщением. Однако, если вы покормите его мусором, не лучше ли сообщить "ХХХ - не ревизия в этом хранилище"? Как правило, это сообщение об ошибке "плохой объект", и вероятность того, что кто-то отправит в стек переполнение для получения ответов, намного ниже. Интересно, примут ли ребята из сообщества git этот запрос на извлечение...
Я получил эту ошибку при попытке выбрать коммит, чей хэш я скопировал из GitHub. Этот коммит был на ветке, которую я не потянул, как и PrzeoR.
В отличие от PrzeoR a git fetch
сначала не помог, потому что ветка была удалена на GitHub.
К счастью, мне удалось найти соответствующий (закрытый) Pull Request и восстановить ветку на GitHub.
мерзавец
ИЛИ
git fetch origin
Причина: если идентификатор коммита, который вы пытаетесь выбрать вишней, недоступен в вашем локальном git, возможно, существует эта ошибка.
Выполнение git pull
исправит это. Если это не было исправлено, попросите человека, который поделился идентификатором фиксации, перенести изменение в origin
и выполнить git pull