70

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

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 日] 虽然这有时表明存储库损坏,但事实证明,当某些命令(通常是另一个任务中的另一个 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,它是从哪里来的?

于 2012-08-06T19:17:51.707 回答
18

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

希望它有所帮助;-D

于 2016-02-23T19:02:57.293 回答
16

我在尝试从我的客户不知道的分支合并时遇到了同样的错误(坏对象 [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]
于 2016-06-20T18:48:51.567 回答
7

git fetch --all

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

于 2019-12-25T05:40:52.457 回答
5

git 拉

或者

git 获取原点

原因:如果您尝试挑选的提​​交 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

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

与 PrzeoR 不同,a 一git fetch开始并没有帮助,因为该分支已在 GitHub 上被删除。幸运的是,我能够找到相应的(关闭的)Pull Request 并在 GitHub 上恢复分支。

于 2019-08-12T16:10:07.900 回答
2

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

获取

然后做

git 还原

于 2019-06-27T17:01:28.343 回答
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 gc --aggressive --prune=now. 它没有帮助。

这个分支是陈旧的,对我来说并不重要,所以我删除了分支文件夹

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

跑了git gc

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

于 2021-02-04T06:07:44.643 回答
0

我遇到它的原因很简单。我在主存储库和子模块之间来回切换。我试图在一个哈希(在主存储库中)和另一个我从 SourceTree 复制的哈希之间进行比较,认为很容易获得旧的 HEAD(我已经回归了一个修订以追踪回归)。我抓取的旧 HEAD 哈希是子模块的哈希,并且git diff和我一起被放出来喂它垃圾。这就是我来到这里的原因,那时我意识到这是操作员错误。如果你的哈希来自不同的存储库,git 会用这条消息责骂你。但是,如果您确实给它喂垃圾,那么报告“XXX不是此存储库中的修订版”不是更好吗?它与“坏对象”一样普遍是一条错误消息,并且不太可能将某人发送到堆栈溢出以寻求答案。我想知道 git 社区中的人们是否会接受这个拉取请求......

于 2019-07-31T22:02:27.570 回答
0

我在尝试挑选(在 A 上)另一个分支(B)的提交时遇到了同样的错误。问题很愚蠢,只是忘记了 git push 提交(B)。

于 2019-06-18T13:41:29.137 回答