70

以前のgitcommitに戻してみました:

git revert xxx

私は今、応答としてこのエラーを受け取っています:

fatal: bad object xxx

私は何が間違っているのですか?これを修正するにはどうすればよいですか?

4

13 に答える 13

29

それが起こる正確な理由はわかりません。私にとっては、リポジトリ全体をローカルにプルするのを忘れているためです。2つ以上のパスがあり、各パスは異なるブランチからプルします

/path/branch_a/ -> pulled from branch A
/path/branch_b/ -> pulled from branch B

ブランチAで、いくつかの変更を加え、通常どおりコミットします。コミット(たとえば、コミットIDはabcdef123)がブランチBに表示されるようにしたいので、

$ 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(-)
于 2013-08-20T08:32:21.607 に答える
25

[編集1、2016年11月19日]これはリポジトリの破損を示す場合がありますが、Windowsで、あるコマンド(通常は別のタスクの別のGit)が内部ファイルを開いてロックしているときに発生することがわかります。この場合、他のタスクを終了すると修正されます。元の答えは以下の通りです。

[編集2、2020年5月6日]上記が(生のハッシュID)xxxなどに似ているとします。b34789c0b0d3b137f0bb516b417bd8d75e0cb305これをカットアンドペーストから取得した場合は、このリポジトリ用であることを確認してください(特に、複数のウィンドウを開いている場合は、気付かないうちに他のリポジトリからハッシュIDを取得するのは簡単です)。自分で再入力した場合は、タイプミスがないことを確認してください。これにサブモジュールが含まれる場合は、サブモジュールが最新であることを確認してください。質問へのコメントと、これを含むいくつかの回答を参照してください。


bad object16進数の場合は、タグに無効な参照番号が含まれていることを意味する傾向がありますが、他のいくつかの奇妙な場合にも発生する可能性があります。たとえば、私が行う場合:

$ git tag foo
$ vi .git/refs/tags/foo

最後の文字(この場合は6から5)を変更して、次のように書き出します。

$ git log foo
fatal: bad object foo

ここは正確には何xxxで、どこから来たのですか?

于 2012-08-06T19:17:51.707 に答える
18

私の場合、プルしていない別のブランチからチェリーピッキングを行っていましたが、コミットのIDをGHからコピーしようとしました(チェリーピッキングを行っていたローカルではこれを取得していません)。

お役に立てば幸いです;-D

于 2016-02-23T19:02:57.293 に答える
16

クライアントが知らないブランチからマージしようとしたときに、同じエラー(不正なオブジェクト[ハッシュ])が発生しました。(PrzeoRの場合と似ていますが、プルする代わりにフェッチする必要がありました)

私の場合、クライアントをサーバーの状態に再同期するためにgitfetchを実行する必要がありました。誰かが私と同じ方法でこのスレッドに到達し、この洞察から利益を得ることができる場合に備えて、これをここに投稿してください。

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]
于 2016-06-20T18:48:51.567 に答える
7

git fetch --all

git fetchコマンドは、コミット、ファイル、および参照をリモートリポジトリからローカルリポジトリにダウンロードします。

于 2019-12-25T05:40:52.457 に答える
5

git pull

また

git fetch origin

理由:チェリーピックしようとしているコミットIDがローカルgitで利用できない場合は、このエラーの可能性があります。

を実行すると、git pullこれが修正されます。これが修正されていない場合は、コミットIDを共有している人に変更をプッシュしoriginて、git pull

于 2019-09-06T12:27:58.067 に答える
3

リポジトリに存在しないオブジェクトは、そのエラーメッセージを表示します

例えば:

 git init
 touch a
 git add a
 git commit -m 0
 # This object is not in the repository.
 git show 1111111111111111111111111111111111111111

問題の原因については、再現可能な最小限の例がなければ言うのは難しいです。

サブモジュールの問題により、そのエラーが一度発生しました。

于 2016-12-01T14:19:47.223 に答える
2

ローカルと同期して最新のコミットを取得するには、gitfetchを実行する必要があります

git fetch

その後、

git revert

于 2019-06-27T17:01:28.343 に答える
2

GitHubからハッシュをコピーしたコミットをチェリーピックしようとしたときにこのエラーが発生しました。このコミットは、PrzeoRのように、私が引っ張っていなかったブランチで行われました。

PrzeoRとは異なりgit fetch、GitHubでブランチが削除されていたため、最初は役に立ちませんでした。幸い、対応する(閉じた)プルリクエストを見つけて、GitHubでブランチを復元することができました。

于 2019-08-12T16:10:07.900 に答える
1

この問題は、ローカルに保存されている古いブランチまたは破損したブランチがある場合に発生する可能性があります。

(バックアップを作成した後!)ファイルを削除して.git/refs/remotes/origin/xxxから、サーバーから新しいコピーを取得すると、うまくいきました。

詳細については、GitHubをご覧ください。

于 2021-01-30T13:32:03.370 に答える
1

このエラーがどのように発生したかわかりません。これが発生したエラーです。

fatal: bad object refs/remotes/origin/{branchname}
fatal: failed to run repack

を介してgitリポジトリをプルーニングしようとしgit gc --aggressive --prune=nowました。それは役に立たなかった。

このブランチは古く、私にとっては重要ではなかったので、ブランチフォルダを削除しました

rm -rf .git/refs/remotes/origin/{branchname}

走ったgit gc

オブジェクトの列挙を実行し、正常にクリーンアップしました。

于 2021-02-04T06:07:44.643 に答える
0

別のブランチ(B)のコミットを(Aで)チェリーピックしようとしたときに同じエラーが発生しました。問題はばかげていました。コミットをgitpushするのを忘れただけです(B)。

于 2019-06-18T13:41:29.137 に答える
0

私がそれに遭遇した理由は単純でした。メインリポジトリとサブモジュールを切り替えていました。古いHEADを取得するのは簡単だと思って(メインリポジトリにある)1つのハッシュとSourceTreeからコピーした別のハッシュを比較しようとしました(リグレッションを追跡するために1つのリビジョンをリグレッションしました)。私が取得した古いHEADハッシュは、サブモジュールのハッシュであり、git diffゴミを出すために私と一緒に出されました。それが私がここにたどり着いた方法であり、それがオペレーターのエラーであることに気付いたときです。ハッシュが別のリポジトリからのものである場合、gitはこのメッセージであなたを叱ります。ただし、ガベージをフィードする場合は、「XXXはこのリポジトリのリビジョンではありません」と報告する方がよいでしょうか。これは、「不良オブジェクト」と同じくらい一般的なエラーメッセージであり、回答を得るために誰かをスタックオーバーフローに送る可能性はかなり低くなります。gitコミュニティの人々はそのプルリクエストを受け入れるのだろうか...

于 2019-07-31T22:02:27.570 に答える