Git提交ID丢失。

3
我们配置了一个Git仓库,该仓库包含多个分支。最近我们遇到了一个问题,我们丢失了一些从用户克隆仓库后推送的提交。
如果我运行"git log commitid",我可以看到提交ID信息,但是“git branch --contains commitid”不显示它所属的分支。
另外,如果我运行描述,结果如下。我运行了所有选项的fsck,但是看起来这些提交不是混杂提交。请分享您的想法,为什么这些提交会丢失并且没有附加到任何分支上。
git describe commitid --all 
changes/01/21112/1

我运行了git reflog命令,但是它没有显示那个提交id,实际上我们是从一个提交中挑选的该提交,现在我可以看到实际提交id(即使该提交也不属于任何提交),对应于实际提交id的挑选提交id丢失了,我无法追踪挑选提交id

我该如何找到丢失的挑选提交id?


等一下,我不明白你帖子的第二部分。一旦你将所需的提交挑选到一个分支中,当你在该分支上运行git log时,你应该会看到一个新的提交ID,并且在注释中包含了目标提交的信息,我想是这样的吧。这就是发生的情况吗?如果是这样,那你在寻找什么呢? - Vince
如果这是一个 cherry-pick 操作,而且它并不在应该接收提交的分支上,为什么不再次进行 cherry-pick 呢? - Christopher
嗨 Vince, christoper,我正在寻找的提交ID是挑选的提交ID,现在我无法在裸仓库中看到挑选的提交ID。我提到了“git log commitid”,这是我本地克隆中的实际提交ID,但是从我的提交中挑选的提交ID在远程裸体中找不到,我可以从我的本地提交中进行挑选,但问题是,我们总是看到这些缺失的挑选提交,因此我们想找到缺失挑选提交ID的原因。 - bsd
1个回答

5

您尝试过使用 git reflog 命令吗?

当一个提交被取消引用,例如使用 git reset 命令时,它实际上会在存储库中保留一段时间,即使运行 git gc 命令也无法收集它。这是因为在reflog中保持了对其的引用。

您可以通过以下方式查看是否存在这种情况:

$ git fsck --no-reflogs

Reflog有助于保护您。它使您能够回滚灾难性的resetrebase或任何其他更改历史记录的命令。

如果您想要恢复这些丢失的提交,可以从reflog中轻松获得。

如果您想永久删除它们,可以使用类似以下的命令:

$ git reflog expire --all

但要小心!这可能无法撤销。


我运行了 git reflog 命令,但它没有显示那个提交 ID。实际上,我们是从一个提交中挑选了这个提交,现在我可以看到实际的提交 ID(即使这个提交 ID 也不属于任何分支),而对应于实际提交 ID 的挑选提交 ID 却丢失了,我无法追踪到挑选提交 ID。我该如何找到丢失的挑选提交 ID?提前致谢。 - bsd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接