致命的:坏对象xxx

时间:2012-08-06 18:52:32

标签: git

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

git revert xxx

我现在收到此错误作为回复:

fatal: bad object xxx

我做错了什么?我该如何解决这个问题?

13 个答案:

答案 0 :(得分:19)

我不知道发生这种情况的确切原因。对我来说,这是因为我忘记将整个存储库拉到我的本地。我有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(-)

答案 1 :(得分:11)

在我的情况下,我是从另一个我没有拉动的分支中挑选的,但是我试图从GH复制提交的ID(我还没有在我当地的地方找到这个ID)樱桃采摘。。

希望它有所帮助;-D

答案 2 :(得分:9)

[编辑,2016年11月19日]虽然这通常表明存储库损坏,但是当一些命令 - 通常是另一个任务中的另一个Git - 正在打开内部文件时,它会发生在Windows上锁定。在这种情况下,终止其他任务应该修复它。原始答案如下。


带有一些十六进制数的

bad object往往意味着标签中包含无效的引用号,但对于其他一些奇怪的情况也会出现这种情况。例如,如果我这样做:

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

并更改最后一个字符(在本例中为6到5)并将其写出:

$ git log foo
fatal: bad object foo

这里xxx到底是什么?它来自哪里?

答案 3 :(得分:8)

我尝试从我的客户端不知道的分支进行合并时遇到了同样的错误(坏对象[hash])。 (与PrzeoR&#39的情况类似,但不需要拉取我需要的东西)

在我的情况下,我需要运行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]

答案 4 :(得分:2)

存储库中不存在的对象会显示该错误消息

E.g:

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

至于导致问题的原因,如果没有最小的可重复性示例,很难说。

子模块的困境让我错误一次。

答案 5 :(得分:1)

  

git pull

OR

  

git获取来源

原因:如果您尝试尝试选择的提交ID在本地git中不可用,则可能出现此错误。

执行git pull将解决此问题。如果尚未解决,请让共享提交ID的人将更改推送到origin并执行git pull

答案 6 :(得分:1)

我不确定我是怎么得到这个错误的, 这是我得到的错误。

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

尝试通过 git gc --aggressive --prune=now 修剪 git repo。它没有帮助。

这个分支已经过时,对我来说并不重要,所以我删除了分支文件夹

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

跑了git gc

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

答案 7 :(得分:0)

当尝试在A上选择其他分支(B)的提交时,我遇到了相同的错误。 问题很愚蠢,只是忘记了git push提交(B)。

答案 8 :(得分:0)

您需要执行git fetch以获得与本地同步的最新提交

git fetch

然后做

git恢复

答案 9 :(得分:0)

我碰到它的原因很简单。我在主存储库和子模块之间来回切换。我试图在一个散列(在主存储库中)和从SourceTree复制的另一个散列之间进行区分,以为获得旧的HEAD很容易(我已经对一个修订进行了回归以追踪回归)。我抓取的旧HEAD哈希是一个子模块的哈希,git diff与我一起被扔掉了以将其作为垃圾。这就是我到这里结束的方式,那时候我才意识到这是操作员错误。如果您的哈希值来自其他存储库,则git会用此消息责骂您。但是,如果您确实将其作为垃圾进行填充,那么报告“ XXX不是此存储库中的修订版本”会更好吗?作为“错误对象”的错误消息,它通常是一般的,并且不太可能将某人发送给堆栈溢出来寻求答案。我想知道git社区中的人们是否会接受该请求请求...

答案 10 :(得分:0)

我在尝试挑选我从GitHub复制的哈希的提交时遇到此错误。就像PrzeoR一样,该提交在我没有拉过的分支上。

与PrzeoR不同,git fetch最初没有帮助,因为该分支已在GitHub上删除。 幸运的是,我能够找到相应的(关闭的)Pull Request并在GitHub上还原分支。

答案 11 :(得分:0)

git fetch --all

git fetch命令将提交,文件和引用从远程存储库下载到本地存储库。

答案 12 :(得分:0)

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

删除文件 .git/refs/remotes/origin/xxx(在进行备份后!)然后从服务器获取新副本对我有用。

更多详情请见 GitHub