首页 > 解决方案 > Git:试图在已删除的分支上追溯压缩的提交 - 有可能吗?

问题描述

在过去 6 周的某个时候,代码库中引入了一个问题。我已经确定了哪个分支引入了它(以及该分支的头/尾提交),但我现在想开始跟踪该分支上的各个提交以确定确切原因。

我的问题是:

  1. 有问题的分支在合并到主服务器后被构建服务器删除
  2. 在合并之前,提交被压缩(由构建服务器)。
  3. 我无权访问最初提交和推送提交的本地环境。

我可以在我们的构建服务器上看到现已删除的分支的提交历史记录,但是如果我尝试在本地签出其中一个,我只会收到错误消息

error: pathspec '<commit-id>' did not match any file(s) known to git

构建服务器也很乐意向我展示每个提交的差异,这意味着它们仍在某个地方的 git 中(或者构建服务器已经缓存了它们,但这似乎不太可能)。

我已经看到了对git reflog但似乎仅适用于本地存储库历史记录的引用(或者,更有可能的是,我未能找到它提供的一些高级选项)。

有没有办法做到这一点?TIA。

标签: git

解决方案


我可以在我们的构建服务器上看到现在删除的分支的提交历史......

登录到构建服务器,并从壁球之前的最新提交 ID 创建一个新分支并推送它:

git branch investigation-branch 1234abcd # use the last commit id before the squash
git push origin investigation-branch # assuming your remote is "origin"

现在从您的本地机器上获取,您应该能够像以前一样看到该分支。如果您愿意,您可以在完成调查后简单地删除遥控器上的分支。

注意:如果您不想登录构建服务器,则可能另一台机器也有提交。可能仍然有它们的地方是:

  1. 推送提交的原始机器。(已经排除了你不能访问这个。)
  2. 构建服务器。(确认的。)
  3. 任何在这些提交存在于分支上且尚未被垃圾收集的时间窗口内获取 repo 的机器。期望的提交在被压扁之前存在于分支上的时间越长,它们被另一台机器获取的可能性就越大。请注意,孤立提交的默认垃圾收集时间为 90 天,因此 6 周前正好在默认时间窗口内,尽管可以手动运行命令来清理本地 repo 并更快地清除那些孤立提交。
  4. 您使用集中式存储库吗?如果是,它应该仍然具有未引用提交的副本,并且可能存在访问它们的机制。有些工具甚至允许您直接从 UI 中从任何历史提交创建新分支。这基本上可以实现您的目标,而无需手动登录服务器。

推荐阅读