我尝试使用以下命令恢复到之前的 git 提交:
git revert xxx
现在我收到了以下错误响应:
fatal: bad object xxx
我做错了什么? 我该如何修复?
我尝试使用以下命令恢复到之前的 git 提交:
git revert xxx
现在我收到了以下错误响应:
fatal: bad object xxx
我做错了什么? 我该如何修复?
我不知道为什么会发生这种情况的确切原因。对于我来说,这是因为我忘记将整个代码库拉到本地。我有两个或更多路径,每个路径从不同的分支拉取。
/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(-)
我也遇到了相同的错误(坏的对象[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]
[编辑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
是什么,它来自哪里呢?git fetch
命令,以便将远程提交同步到本地。 - parisssssgit fetch --all
git fetch
命令将远程仓库的提交记录、文件和引用下载到本地仓库。
我不确定我是如何出现这个错误的, 这是我得到的错误。
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
它成功地执行了对象枚举和清理。
git pull
或者
git fetch origin
原因: 如果你尝试挑选的提交ID在你本地的Git中不可用,那么就有可能出现这个错误。
执行 git pull
将会解决此问题。如果问题没有被解决,请联系共享提交ID的人将更改推送到 origin
并执行 git pull
。
不存在于代码库中的对象会出现该错误信息
例如:
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获取可能的最浅提交历史记录。如果您的构建依赖于完整的存储库历史记录,请勿使用。
- jxramos在尝试从 GitHub 拷贝哈希值并挑选提交时,我遇到了这个错误。这个提交存在于一个我尚未拉取的分支上,就像 PrzeoR 一样。
不同于 PrzeoR,第一时间运行 git fetch
并没有帮助,因为该分支已经被删除了。幸运的是,我能够找到相应的(已关闭的)拉取请求,并在 GitHub 上恢复了该分支。
git gc
。 - Luiz E.