致命错误:坏的对象 xxx

96

我尝试使用以下命令恢复到之前的 git 提交:

git revert xxx

现在我收到了以下错误响应:

fatal: bad object xxx

我做错了什么? 我该如何修复?


@LuizE。对我没用。 - James A. Anderson
1
在执行该命令之前,请尝试运行 git gc - Luiz E.
今天遇到了类似的错误,结果发现Ubuntu dist git版本2.7.4有这个问题,在升级到最新的git之后,一切都好了。 - weynhamz
4
如果你遇到这个错误,可能是因为你所在的目录/仓库不正确。我想通过指出这一点来帮助未来的读者。我试图获取子模块提交的标签或分支,而不需要进入子模块的子目录。我将超级仓库中从git diff获取的提交哈希值粘贴了进来,因此“它必须存在!” - cardiff space man
在我的情况下,我打开了带有WSL的VSCode,同时也打开了GMaster,并且所有3个指向相同的repo /目录的git客户端。此外,GMaster生成了错误的Commit_ID或哈希值。真是一团糟。我将坚持使用CLI。 - Andre Leon Rangel
显示剩余2条评论
15个回答

33

我不知道为什么会发生这种情况的确切原因。对于我来说,这是因为我忘记将整个代码库拉到本地。我有两个或更多路径,每个路径从不同的分支拉取。

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

在A分支上,我做了一些修改,并像往常一样进行了提交。我希望那个提交(例如提交 ID 为 abcdef123)出现在B分支上,所以我使用了:

git cherry-pick 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(-)

7
这个答案揭示了一个常见错误,即在不同文件夹中使用相同的存储库和不同的分支。对我来说是一个加1。 - carlosayam

28

我也遇到了相同的错误(坏的对象[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]

7
git fetch,记得。 - Nischay Malhan
1
谢谢。get fetch 解决了它。诀窍是从远程获取最新的提交。 - Sachidananda Naik

27

[编辑1,2016年11月19日] 虽然这有时会表明存储库损坏,但事实证明,当某些命令(通常是另一个任务中的另一个 Git)持有内部文件并锁定时,它会在 Windows 上发生。在这种情况下,终止其他任务应该可以解决问题。原始答案如下。

[编辑2,2020年5月6日] 假设上面的 xxx 类似于 b34789c0b0d3b137f0bb516b417bd8d75e0cb305(原始哈希 ID)。如果你从剪切和粘贴中获得了这个,请确保它是针对 存储库(如果你有多个窗口打开,很容易从其他存储库中获取哈希 ID 而不自知)。如果你自己重新输入,请确保没有任何拼写错误。如果这涉及子模块,请确保子模块是最新的。请参阅问题和一些答案的评论,包括此答案。


bad object 后跟一些十六进制数字通常意味着标签中有一个无效的引用号,但也可能出现其他一些奇怪的情况。例如,如果我执行:

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

并改变最后一个字符(在这种情况下从6改为5)并将其写出:

$ git log foo
fatal: bad object foo

这里的xxx是什么,它来自哪里呢?

2
哦,如果这是从“git log”输出中干净地复制而来的,那么就相当奇怪了!你能否无误地使用“git show”显示相同的ID呢? - torek
1
我遇到了相同的错误。正如在这个问题和上面的评论中所描述的那样,原因是我在不同的位置打开了同一个项目。关闭所有的bash并重新打开解决了这个问题。 - SajithK
@sajith:有趣。我现在怀疑是Windows操作系统的问题,如果有其他进程正在打开文件,git就无法打开该文件。 - torek
终止另一个任务对我有用,但它发生在Linux系统中。 - JoulinRouge
3
在我的情况下,我需要运行 git fetch 命令,以便将远程提交同步到本地。 - parisssss
显示剩余4条评论

20
在我的情况下,我正在从另一个分支进行挑选,但我尝试从 GH 复制提交的 ID(在我进行挑选的本地电脑上没有这个 ID)。希望能帮到你 ;-D。

3
由于我想要的提交在合并到主分支时被压缩了,导致问题进一步加剧。这也意味着原提交的SHA1值已经发生了变化,因此我遇到了麻烦。不过,一旦我找到了代表同样修改的新SHA1值,就可以成功地挑选到那个新的SHA1值。 - Gabe

15

git fetch --all

git fetch命令将远程仓库的提交记录、文件和引用下载到本地仓库。


2
哎呀 - 没有解决问题。 - R Claven

5

我不确定我是如何出现这个错误的, 这是我得到的错误。

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

尝试使用git gc --aggressive --prune=now来修剪git仓库,但没有帮助。

这个分支已经不再需要了,所以我删除了分支文件夹。

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

运行git gc

它成功地执行了对象枚举和清理。


5

git pull

或者

git fetch origin

原因: 如果你尝试挑选的提交ID在你本地的Git中不可用,那么就有可能出现这个错误。

执行 git pull 将会解决此问题。如果问题没有被解决,请联系共享提交ID的人将更改推送到 origin 并执行 git pull


4

当本地存储的分支过时或损坏时,可能会出现此问题。

删除文件.git/refs/remotes/origin/xxx(备份后!),然后从服务器获取新的副本即可解决此问题。

更多细节请参见GitHub


3

不存在于代码库中的对象会出现该错误信息

例如:

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

关于问题的原因,没有一个最小可重现的示例很难说。

子模块的问题曾经导致我遇到过这个错误。


我通过收缩一个修订版本,远程覆盖它,然后尝试安装该软件包来获得它(在git rev-list上失败了)。 - Brett Zamir
2
在我发现一份我需要管理的竹子工作正在使用“使用浅克隆”后,我找到了这个。获取可能的最浅提交历史记录。如果您的构建依赖于完整的存储库历史记录,请勿使用。 - jxramos

3

在尝试从 GitHub 拷贝哈希值并挑选提交时,我遇到了这个错误。这个提交存在于一个我尚未拉取的分支上,就像 PrzeoR 一样。

不同于 PrzeoR,第一时间运行 git fetch 并没有帮助,因为该分支已经被删除了。幸运的是,我能够找到相应的(已关闭的)拉取请求,并在 GitHub 上恢复了该分支。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接