删除git中未命名的孤立远程分支

删除git中未命名的孤立远程分支,git,Git,我们团队中有人将一系列提交推送到了孤立的远程存储库。也就是说,第一次提交没有父级。后面的是第一个的后代。分支上也没有名字。从图形上看,它是这样的 master o Commit #4 | (no branch) o commit #3 o commit #7 | | o commit #2 o commit #6 | | o commit #1 o commit #5 我想删除第5-7条

我们团队中有人将一系列提交推送到了孤立的远程存储库。也就是说,第一次提交没有父级。后面的是第一个的后代。分支上也没有名字。从图形上看,它是这样的

master
o Commit #4
|               (no branch)
o commit #3     o commit #7
|               |
o commit #2     o commit #6
|               |
o commit #1     o commit #5
我想删除第5-7条。我尝试在commit 5创建一个分支。然后,提交6和7被列为该分支上的提交。然后,我试着修剪树枝,但无济于事

我该怎么做


更新:我认为问题与不匹配的分支名称有关。开发人员以某种方式将远程服务器上的新分支命名为master。原来已经有一位大师了,在我的地盘上仍然存在。因此,(我使用GitExt)在本地查看存储库时,我认为它混淆了GitExt,并显示本地分支没有任何名称。当我将主分支重置回远程上的原始分支时,新分支不再有任何引用并消失。我认为问题已经解决。

没有被任何分支引用的提交将被git垃圾收集器删除。无需执行任何操作。

未被任何分支引用的提交将由git垃圾收集器删除。不需要做任何事情。

是理解所有这些的关键

在Git存储库中,DAG的提交图表示为提交对象的集合。与往常一样,每个对象都由其哈希ID标识,每个提交都有一定数量的父对象ID(零个或多个,但通常为1个)。Git使用父链接来构建图形,但是为了开始这个图形构建过程,它必须有某种方法来识别“起点”。(其他版本控制系统,包括Mercurial,使用其他技术,不需要此起点列表。)

这些起点是Git的参考。最常见的两个引用是分支和标记名,但还有其他“常规”引用,所有引用的名称都以
refs/
开头,还有一些特殊的引用,如
HEAD
(当
HEAD
被分离时)和
FETCH\u HEAD
(在运行了
git FETCH
的存储库中)。还有额外的特殊引用:索引(aka staging area,aka cache)保持对“blob”(存储在存储库数据库中的文件对象)的直接引用,这些对象不参与提交图,但都是相同总体存储方案的一部分

创建一个对象,然后放弃它是很正常的。提交和blob是最典型的,但四种对象类型中的任何一种都可以经历这个过程。例如,当我们使用
git commit将旧的提交复制到新的提交时,我们放弃了旧的提交——修改
git rebase
。1当我们
git添加一个文件时,我们放弃了blob对象,然后意识到它还没有完成,再对它进行编辑,然后在提交之前再次添加它。每个
git add
都将文件本身作为blob对象复制到存储库中,但在我们
git commit
结果之前,它仅通过索引引用,并且重新添加新版本会覆盖旧的索引项

Git可以(偶尔也会)对每个存储库对象进行全面扫描,这将发现没有起始点的对象。这些有时被称为不可访问的对象。2执行这些操作的两个面向用户的命令仍然非常容易维护,并且对于大多数用户来说通常不是必需的,它们是存储库一致性检查器
git fsck
,以及垃圾收集器
git gc
。因为他们进行这种全扫描,所以速度相对较慢

由于速度较慢,自动垃圾收集是在“后台”完成的:各种命令根据需要自动派生
git gc
,以丢弃未引用/无法访问的提交和文件。这意味着后台清理可以与普通Git活动竞争,后者可以创建尚未被引用的新对象,但将在命令完成后立即进行。例如,GC可能与
git commit
命令同时运行。如果GC在添加到分支之前发现了一个新创建的提交,并删除了该提交,那将是不好的。因此,出于安全考虑,默认情况下,自动GC避免删除在过去14天内创建的任何内容:这给了
git commit
336个小时来完成,这通常应该是足够的时间。:-)

您总是可以通过它的原始散列ID找到任何现有的Git对象:Git就是这样访问每个对象的,无论是在缓慢的完全扫描操作中(它只是枚举存储库中的每个ID),还是在以起点(例如分支或标记引用)开始的快速操作中。因此,如果提交确实不可访问,但仍在存储库中,您可以通过其哈希ID查看它们。但最终,垃圾回收器将运行,并且它们将至少存在14天。在这一点上,GC将删除它们,它们将永远消失

通常情况下,您不需要关心这些,但是如果您意外地将一些敏感信息(如明文密码、密钥或证书)放入存储库,您可能希望更快地将其删除。这是很困难的(参见脚注),当您注意到谷仓门打开时,这些马可能已经被克隆了,5因此明智的做法是使证书无效,即使您确实设法找到并删除了有问题的Git对象


1这些被放弃的提交通常通过重登录保留。每个普通的
refs/
名称空间引用有一个reflog,另外一个大的reflog用于特殊的
HEAD
引用。默认情况下,reflog中的项目至少可以使用30天,有时最多可以使用90天。(这两个时间值都是可配置的:请参见
gc.reflogExpire
gc.reflogExpi。)
A--B--C--D   <-- master
    \
     E--F    <-- branch
      \
       G--H