为啥显示在“推送”中的提交没有显示在“历史”中?

Posted

技术标签:

【中文标题】为啥显示在“推送”中的提交没有显示在“历史”中?【英文标题】:Why are commits that show up in "Pushes" not showing in "History"?为什么显示在“推送”中的提交没有显示在“历史”中? 【发布时间】:2021-09-03 08:43:05 【问题描述】:

环境:本地 TFS、Git 存储库

在过去的一个月里,我们有一个特定用户的提交从历史中“消失”,以及实际的更改。当我转到代码视图并选择推送选项卡时,我会看到该用户的每个提交(以及 SHA 哈希)。如果我从这个视图查看提交的详细信息,我可以看到它是“由 [user] 推送”和“refs/heads/[branch] udpated from ... to ...”以及差异。这一切似乎都是正常和正确的。

当我转到同一存储库的“提交”选项卡并查看 [分支] 的提交时,从特定日期开始,该用户不存在任何提交。用户的远程分支跟踪似乎是正确的,并且提交肯定会被发送,否则它们不会出现在 Pushes 视图中。我也无法通过以下任何命令使用 Git Bash 找到这些提交:

$ git branch --contains [short hash]
error: malformed object name [short hash]

$ git branch --contains [full hash]
error: no such commit [full hash]

$ git log -p [short hash]
fatal: ambiguous argument '[short hash]': unknown revision or path not in the working tree

$ git log -p [full hash]
fatal: bad object [full hash]

$ git show [short hash]
fatal: ambiguous argument '[short hash]': unknown revision or path not in the working tree

$ git show [full hash]
fatal: bad object [full hash]

有人对可能发生的事情有任何想法或见解吗?我将尽可能添加任何其他详细信息 - 我只是现在不知道什么是相关的。

【问题讨论】:

gc 在中间? gc getting in the middle? 仅适用于一位用户? 不同的用户(不同的本地仓库)可能有不同的 gc 配置。也许该用户的 gc 配置过于激进? ...configured too aggressively? 嗯,好吧。这绝对是我还没有检查过的东西,所以它不会受伤。本地 gc 会影响推送到远程的提交吗? 不...我猜 remote 本身也可以设置 gc 吗?比如说,我的意思是,你应该看到 gc 配置的仓库就是你运行这些命令的地方。 【参考方案1】:

如果交互式变基实际上已经完成...我无法从我的本地 Git 存储库甚至远程存储库中得知。 但是,这仍然有可能发生并消除了一个开发人员一个月的提交价值? (有意与否无关)

不,它不应该消灭任何东西。即使 SHA1 被 rebase 更改,提交也应该(除非被 rebase 压缩或删除)在那里。

从我在 TFS push API 中看到的内容来看,Pushes 视图显示 push events。 但是,例如,如果一个分支(这些提交被推送的地方)被删除(使这些提交可能未被引用),那么您将不再在该存储库的可见历史记录中看到它们,也你能把它们拿来吗?

其实,你可以直接试试fetch the last developer's commit SHA1,看看TFS远程Git存储库是否仍然存储(在reflog中)所说的提交。 如果可行,那么您可以从所述获取的提交中创建一个本地分支,然后推回该分支:这将使开发人员的不可见历史再次可见。

【讨论】:

我不是每天都在这个存储库中,所以有没有办法可以判断一个特定的分支是否实际上被删除/重新创建了?它会有不同的树 ID 吗? @CodeHxr 不确定,除非 TFS 在某处提出审计活动日志。 @CodeHxr 在同一提交上重新创建的分支将使这些提交再次可见,其中不涉及“分支 ID”。我的回答是关于删除了一个分支,该分支是引用这些用户提交的最后一个对象:删除会使它们不可见(仅存在于远程 TFS reflog 中,并且最多仅存在 90 天) 我能够使用您的第二个链接获取丢失的提交:git fetch origin [full hash]。它返回:* branch [random hash] -> FETCH_HEAD,这向我表明它提交的分支被搞砸或删除了。你是这样解释回应的吗? (顺便说一句:你得到了赏金,所以谢谢你!) @CodeHxr 是的,分支已经消失了,但是由于您已经获取了它的 HEAD 提交,您现在可以基于它创建一个本地分支,并推回该本地分支,从而将其恢复为使用。

以上是关于为啥显示在“推送”中的提交没有显示在“历史”中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 GitHub 在提交历史记录时不显示文件历史记录?

为啥我的最新提交没有显示,只有以前的提交

为啥我的推送中突然有合并提交?

TortoiseGit添加文件还没有提交为啥显示对号不是加号?

在推送之前如何知道提交/更改列表

TortoiseHg - 显示未推送的提交