如果一个git分支被推送到远程,然后在合并之前被删除,它仍然是存储库历史记录的一部分吗?

如果一个git分支被推送到远程,然后在合并之前被删除,它仍然是存储库历史记录的一部分吗?,git,Git,已创建分支并将其推送到远程,并且已为其打开合并请求。在某个时刻,我们决定做出足够大的改变,简单地从一个新分支重新开始可能是最简单的方法 从远程删除原始分支时,它的历史记录是否会保留在远程存储库中,或者它(以及与之相关的任何提交)是否已从远程存储库中完全删除 更简单地说,如果我删除了一个远程分支而没有将其合并到主分支,并且有人对repo进行了git克隆,那么他们最终会下载关于现在已删除的分支的任何类型的历史信息,还是通过“clean”w.r.t.此分支进行克隆?删除远程分支不会删除提交;它们最终可

已创建分支并将其推送到远程,并且已为其打开合并请求。在某个时刻,我们决定做出足够大的改变,简单地从一个新分支重新开始可能是最简单的方法

从远程删除原始分支时,它的历史记录是否会保留在远程存储库中,或者它(以及与之相关的任何提交)是否已从远程存储库中完全删除


更简单地说,如果我删除了一个远程分支而没有将其合并到主分支,并且有人对repo进行了git克隆,那么他们最终会下载关于现在已删除的分支的任何类型的历史信息,还是通过“clean”w.r.t.此分支进行克隆?

删除远程分支不会删除提交;它们最终可能会通过运行
git gc
来清除。如果遥控器位于本地共享驱动器或类似的驱动器上,那么是否/何时在其上运行
gc
将取决于您;即使这样,
gc
run也只能在没有任何内容(包括重登录)可以到达提交时删除提交。如果它包含在服务器中(类似于TFS)或托管(由github或类似工具托管),那么它取决于服务器或托管服务公开的选项,以及是否/如何运行
gc

因此,提交可能会停留一段时间,并且可能会被知道他们在寻找什么的人访问


但是你特别问了关于克隆人/拉人的事。在拉取或克隆时发送的包不包含任何无法从某个ref访问的内容。在这种情况下,即使存在reflog条目,也不相关。如果删除远程分支,并且没有任何相关提交被标记、合并或在其上创建了另一个分支,则提交不应包含在拉入或关闭操作中。

删除远程分支不会删除提交;它们最终可能会通过运行
git gc
来清除。如果遥控器位于本地共享驱动器或类似的驱动器上,那么是否/何时在其上运行
gc
将取决于您;即使这样,
gc
run也只能在没有任何内容(包括重登录)可以到达提交时删除提交。如果它包含在服务器中(类似于TFS)或托管(由github或类似工具托管),那么它取决于服务器或托管服务公开的选项,以及是否/如何运行
gc

因此,提交可能会停留一段时间,并且可能会被知道他们在寻找什么的人访问

但是你特别问了关于克隆人/拉人的事。在拉取或克隆时发送的包不包含任何无法从某个ref访问的内容。在这种情况下,即使存在reflog条目,也不相关。如果删除远程分支,并且没有任何相关提交被标记、合并或在其上创建另一个分支,则提交不应包含在拉操作或关闭操作中

更简单地说,如果我删除了一个远程分支而没有将其合并到主分支,并且有人对repo进行了git克隆,那么他们最终会下载关于现在已删除的分支的任何类型的历史信息,还是通过“clean”w.r.t.此分支进行克隆

这真的很难说清楚。原则上,克隆存储库的人不应该从他们克隆的任何引用名称中获取任何无法访问的对象。实际上,某些服务器端捷径可能会导致“数据泄漏”

用实例来具体说明这一点,请考虑您调用的某个远程主机上的存储库R <代码> Oracle < /Cord>。R本身只有一个带有commit hash的

master
分支
1234567…
。然后您执行了
git-push-origin-newbranch
,将一些对象(包括至少一个新提交)添加到R,并在
origin
处获取git,以添加哈希ID为
fedcba9…
的新分支
newbranch
。然后你说:“哦,不,我们不想那样”,然后用git推送origin:newbranch删除名称
newbranch

如果服务器上没有重新登录,则提交
fedcba9…
及其对象(以及任何以前无法访问的提交)现在可以进行垃圾收集,如下所示。如果这些垃圾都被收集了,它们就真的消失了,用任何正常的方法都无法观察到。1

如果没有,他们仍然在R,他们只是没有名字,他们可以找到。或者,如果提交散列保存在reflogs中,则它们确实有名称,但这些名称是reflog名称,而不是常规引用。
git clone
git fetch
进程不会获得reflogs,因此无法“查看”散列ID,但在reflog项过期之前,commit
fedcba9…
和相关对象还不能进行垃圾收集

现在,我们转到
git克隆
过程。运行时:

git clone <options> <url>
git克隆
你让你的Git在给定的URL上调用另一个Git。然后,您的Git从该Git请求其所有正常(非reflog)引用的列表。对于回购而言,这只是
refs/heads/master=1234567…
,因为
refs/heads/newbranch
已经消失了。然后,Git请求一些(如果
--depth
shallow clone)或所有可从这些名称中的部分或全部访问的对象,如
master
。由于从
master
无法访问
fedcba9…
,因此他们的Git不应该发送它

但是,可以选择在服务器上走捷径。服务器具有这些“包”文件,其中包含不是松散对象的每个对象。如果只有一个包文件包含所有内容,并且没有松散的对象。。。嗯:如果服务器可以只发送一个包含所有内容的“包”文件,为什么,