我尝试使用以下命令恢复到以前的 git 提交:
git revert xxx
我现在收到此错误作为响应:
fatal: bad object xxx
我究竟做错了什么?我该如何解决?
我尝试使用以下命令恢复到以前的 git 提交:
git revert xxx
我现在收到此错误作为响应:
fatal: bad object xxx
我究竟做错了什么?我该如何解决?
我不知道发生这种情况的确切原因。对我来说,这是因为我忘记将整个存储库拉到我的本地。我有 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,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
,它是从哪里来的?
在我的情况下,我是从另一个我没有拉的分支中挑选的,但我试图从 GH 复制提交的 ID(我在我挑选樱桃的地方没有这个)。
希望它有所帮助;-D
我在尝试从我的客户不知道的分支合并时遇到了同样的错误(坏对象 [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]
git fetch --all
git fetch 命令将提交、文件和引用从远程存储库下载到本地存储库。
git 拉
或者
git 获取原点
原因:如果您尝试挑选的提交 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
至于导致问题的原因,如果没有最小的可重现示例,很难说。
子模块问题给了我一次这个错误。
我在尝试挑选我从 GitHub 复制的哈希值的提交时遇到此错误。这个提交是在一个我没有拉的分支上,就像 PrzeoR 一样。
与 PrzeoR 不同,a 一git fetch
开始并没有帮助,因为该分支已在 GitHub 上被删除。幸运的是,我能够找到相应的(关闭的)Pull Request 并在 GitHub 上恢复分支。
您需要执行 git fetch 以获取与本地同步的最新提交
获取
然后做
git 还原
当本地存储有过时或损坏的分支时,可能会出现此问题。
删除文件.git/refs/remotes/origin/xxx
(在进行备份之后!)然后从服务器获取新副本对我有用。
GitHub 上的更多详细信息。
我不确定我是如何得到这个错误的,这是我得到的错误。
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
它成功地进行了对象枚举和清理。
我遇到它的原因很简单。我在主存储库和子模块之间来回切换。我试图在一个哈希(在主存储库中)和另一个我从 SourceTree 复制的哈希之间进行比较,认为很容易获得旧的 HEAD(我已经回归了一个修订以追踪回归)。我抓取的旧 HEAD 哈希是子模块的哈希,并且git diff
和我一起被放出来喂它垃圾。这就是我来到这里的原因,那时我意识到这是操作员错误。如果你的哈希来自不同的存储库,git 会用这条消息责骂你。但是,如果您确实给它喂垃圾,那么报告“XXX不是此存储库中的修订版”不是更好吗?它与“坏对象”一样普遍是一条错误消息,并且不太可能将某人发送到堆栈溢出以寻求答案。我想知道 git 社区中的人们是否会接受这个拉取请求......
我在尝试挑选(在 A 上)另一个分支(B)的提交时遇到了同样的错误。问题很愚蠢,只是忘记了 git push 提交(B)。