回滚推送的rebase

时间:2012-06-14 18:17:49

标签: git rollback rebase

在尝试改装给主人之后,我在我的树枝上弄得一团糟。

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

但是,做了什么。现在,因为rebase重写了历史记录并提交了(?)(通过在rebase期间解决冲突),我无法重置为先前的提交HEAD~2重新开始,所有提交都被重写并且提交错误。

我可以从git获取HEAD~2的快照,是否可以将快照合并(rebase)回到我的分支,回滚更改,然后重新开始?

提前致谢!

大卫

从我们的内部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结账呢?

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

1 个答案:

答案 0 :(得分:2)

fatal: reference is not a tree: 6f577850231fed07eebdacd3bc5862f84356d803

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

git reset --hard HEAD@{x},其中“x”是git reflog中的HEAD引用。


初步答案:它也适用于子模块(这里不是这种情况)

请参阅“Git submodule head 'reference is not a tree' error”:

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

因此,如果你有子模块,你需要确保父repo和子模块是同步的,并获取父repo(将你的gitweb页面中显示的历史记录更新)到 local repo,在你开始结账任何提交之前 如果该提交来自子模块,请在执行该检查之前先转到该子模块目录。

从那里,您可以将该分支合并回您推送的分支(例如,'master'),创建提交(因此不会重写历史记录) ),选择“git command for making one branch like another”中描述的方法之一。