2

在尝试重新定位到 master 之后,我在我的分支上弄得一团糟。

在我的提交历史中,我进行了相当多的重构(重命名和移动),以及删除类。而且我不应该推送到远程存储库。(我知道,从那以后我就在踢自己)。

然而,该做的就做完了。现在,由于 rebase 重写了历史记录和提交(?)(通过 rebase 期间的冲突解决),我无法重置为更早的提交 HEAD~2 重新开始,所有提交都被重写并且提交错误。

我可以从 git 获取 HEAD~2 的快照,我有没有办法将快照合并(重新设置)回我的分支,回滚更改并重新开始?

先谢谢了!</p>

大卫

更新,从我们内部的 git 网页,我可以看到之前的提交:

commit  6f577850231fed07eebdacd3bc5862f84356d803
tree    8be1d60056697bc1b8d7284c4e85a6d1738ac3e2    tree | snapshot
parent  1ca61d4dd69b7be649906834d44bb7fec390153d    commit | diff

我可以通过单击“快照”链接在 gz 中下载快照。但是,当我尝试这样做时:

git checkout -b newBranch 6f577850231fed07eebdacd3bc5862f84356d803

我有:

fatal: reference is not a tree: 6f577850231fed07eebdacd3bc5862f84356d803

如果我运行:

git checkout -b --force newBranch 6f577850231fed07eebdacd3bc5862f84356d803

我有:

fatal: git checkout: updating paths is incompatible with switching branches.

我猜这个提交只存在于远程存储库中?那我怎样才能在git中签出呢?

解决方案:这个 SO 答案是我的问题的解决方案:Undoing a git rebase

4

1 回答 1

2
fatal: reference is not a tree: 6f577850231fed07eebdacd3bc5862f84356d803

OP David Zhao发现不完整的 rebase 或无效的 HEAD 引用也可能触发该消息:“
Undoing a git rebase

即,git reset --hard HEAD@{x}' x' 是在 中找到的 HEAD 引用git reflog


最初的答案:子模块也会发生这种情况(这里不是这种情况)

参见“ Git submodule head 'reference is not a tree' 错误”:

有人做了一个超级项目提交,它引用了子模块 sub 中未发布的提交。

所以,如果你有子模块,你需要确保父 repo 和子模块是同步的,并获取父 repo(更新它们在你的 gitweb 页面中显示的历史)到你的本地repo,然后才能开始结帐任何提交.
如果该提交来自子模块,请先转到该子模块目录,然后再进行签出。

从那里,您可以将该分支合并回您已推送的分支(例如,' master'),创建一个提交(因此无需重写历史记录),选择“ git 命令中描述的方法之一来制作一个像另一个分支一样“。

于 2012-06-14T19:58:31.487 回答