gpt4 book ai didi

git - 列出和删除不在任何分支下的 Git 提交(悬空?)

转载 作者:IT王子 更新时间:2023-10-29 01:20:31 29 4
gpt4 key购买 nike

我有一个 Git 存储库,其中有大量提交不在特定分支下,我可以 git show 它们,但是当我尝试列出包含它们的分支时,它没有返回任何内容。

我认为这是悬空提交/树问题(由于 -D 分支),所以我修剪了 repo 协议(protocol),但在那之后我仍然看到相同的行为:

$ git fetch origin

$ git fsck --unreachable
$ git fsck

没有输出,没有悬空(对吧?)。但是提交存在

$ git show 793db7f272ba4bbdd1e32f14410a52a412667042
commit 793db7f272ba4bbdd1e32f14410a52a412667042
Author: ...

并且它不能通过任何分支到达

$ git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

没有输出。

该提交的确切状态是什么?如何列出处于相似状态的所有提交?我怎样才能删除这样的提交?

最佳答案

要删除所有悬空提交(包括那些仍然可以从 stash 和其他引用日志中访问的提交),请执行以下操作:

git reflog expire --expire-unreachable=now --all
git gc --prune=now

但请确定这就是您想要的。我建议您阅读手册页,但这里是 Gist :

git gc 删除无法访问的对象(提交、树、blob(文件))。如果一个对象不是某个分支历史的一部分,那么它就是不可访问的。实际上它有点复杂:

Stashes 是使用 reflog 实现的(即不是分支或标签)。这意味着它们需要进行垃圾回收。

git gc 做了一些其他的事情,但它们在这里不相关,也不危险。

不会删除小于两周的无法访问的对象,因此我们使用 --prune=now 表示“删除之前创建的无法访问的对象”。

对象也可以通过 reflog 到达。 branches 记录了一些项目的历史,而 reflogs 记录了这些分支的历史。如果你修改、重置等,提交将从分支历史记录中删除,但 git 会保留它们,以防你意识到你犯了一个错误。 Reflog 是找出在分支(或 HEAD)上执行了哪些破坏性(和其他)操作的便捷方式,从而更容易撤消破坏性操作。

所以我们还必须删除 reflogs 以实际删除从分支无法访问的所有内容。我们通过使 --all reflogs 过期来做到这一点。 git 再次保留了一些 reflogs 以保护用户,因此我们必须再次告诉它不要这样做:--expire-unreachable=now

由于我主要使用 reflog 从破坏性操作中恢复,所以我通常使用 --expire=now 来完全清除 reflog。

关于git - 列出和删除不在任何分支下的 Git 提交(悬空?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3765234/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com