git:这些是悬而未决的提交吗?

git: Are these dangling commits?

最后给出的是从 SourceTree 分支树视图中提取的屏幕截图(屏幕截图中间有空隙)

其中,#1指向曾经是分支的行1.7.6.14.X#2指向同一分支的当前状态。

#3 引用的提交和该行上的前 8 个提交先前已附加到分支 1.7.6.14.X。然后另一位开发人员据称检查了同一个分支并进行了 #4 指出的修复。此 #4 提交已从分支 1.7.6.14.X 中删除了前 9 次提交,并使它们悬空。
因此,分支 1.7.6.14.X 现在从原始分支点开始,而不是仅仅从提交 #3.

延伸

运行 git fsck--unreachable--dangling 等不会给出任何错误。我也试过了--lost-found

然而,git fsck <hash of commit #3> 产生了五个悬空提交和一大堆悬空标签:

Checking object directories: 100% (256/256), done.
Checking objects: 100% (3148/3148), done.
dangling commit ec213...
dangling commit ab82a...
dangling commit 7d262...
dangling commit a6f06...
dangling commit 6674a...

我有两个问题:

  1. 是什么导致了这种情况(即分支 #1 分离)?

  2. 如何检测其他仓库是否存在类似问题? (无需 知道分离提交的哈希值,例如 #3

更新:

我们找到了问题 (1) 的答案。这种情况是由拥有分支旧快照的开发人员强制推送到中央裸仓库造成的。

Here 是 post Linus Torvalds:

Linus describes what dangling objects are, when they are left behind, and how to view their relationship with branch heads in gitk


What could have caused this situation (i.e. branch #1 getting detached)?

悬挂数据是存储在 git 存储库中但无法访问的数据。
这意味着您拥有(添加或提交)在您的存储库中无法访问的内容,(没有提交或分支拥有或指向此内容)

所以答案是肯定的,分支 #1 旁边的任何提交都无法访问分支 #1 上的所有提交。


How can I detect whether there are similar issues in other repositories?
(without having to know the hashes of detached commits such as #3)

git fsck --full

此命令将检查所有 存储库中的悬挂内容


您的存储库中可能有 2 种悬挂内容:

悬挂斑点

进入暂存阶段的更改 area/index(一旦您执行 git add git 计算 SHA-1 并开始跟踪内容)但从未提交.

悬空提交

未直接或由其任何分支链接到任何分支或标记的提交。

  1. 如你所说;这是由于使用 git push --force
  2. 因为您的所有提交都可以通过标签获得; git 永远不会说他们是悬空的,因为他们 不是 。它们永远不会丢失或清理,因为标签引用了它们。

至于如何找到这些(找不到更好的词)悬而未决 提交;我没有找到任何纯粹 git 的东西,但我想出了一个允许检测它们的小脚本。可能有一种方法可以提高性能,但它确实有效:

for sha in $(git log --all --pretty=format:"%H")
do
    if [ -z "$(git branch --contains $sha)" ]
    then
        echo "commit not on a branch: $sha"
    fi
done

注意我知道测试-z ""不是很干净,但是git branch的return值总是0。 ..