我尝试使用以下命令恢复到之前的git提交:
git revert xxx
我现在收到此错误作为回复:
fatal: bad object xxx
我做错了什么?我该如何解决这个问题?
答案 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)