首页 > 解决方案 > 孤立的分支是否完全从 GitHub 中消失了?

问题描述

如果我有一个孤立的分支或提交,假设无法通过 Git 或 GitHub 访问此提交或分支的内容是否安全?

我要问的原因是我想将我的所有提交压缩到我的一个私人存储库中,该存储库可能(在其整个历史中)有一个密钥或类似的提交作为提交。

通过压缩所有内容并将其作为孤立分支推送,我假设所有其他可能包含秘密的提交都完全消失了,只能看到初始内容和最新内容。

这个假设正确吗?

我希望我已经把这个问题写得足够好。

标签: gitgithub

解决方案


git 的目的是保存信息,而不是丢失它。

假设某些东西是孤立的就不能访问它是不正确的。孤儿与否,如果这东西一直存在,那是因为它是可访问的。可访问性和持久性在 git 中是一样的。通常一个东西是持久的/可访问的,因为它有一个名字,或者被有名字的东西指向。分支是一个名字。

因此,根据定义,这个东西是可以访问的。因此,您将推动作为孤立分支的想法完全是红鲱鱼。孤立的分支是一个分支。

反过来说,如果这个东西不能被访问,它就会死掉——它会被垃圾回收。因此它不会被保存。它将无法访问,因为它已经消失了。这听起来不像你想要的。

现在,让我们关注问题的另一部分,似乎是这个。在某个时候,您在文件中提交了一条信息。所以让我们假设你做了这样的事情:

A <- B <- C <- D <- [mybranch]
     ^         ^
     |         |
    add      delete

在这里,我假设您在提交 B 中向某个文件添加了一条信息,而在提交 D 中,您意识到这是一个坏主意并删除了该信息。

所以现在的问题是:如果 B 和 C 是该文件中出现该信息的唯一提交,并且如果我们现在将所有这些提交压缩为单个提交,那么信息是否消失了?

是的。壁球会导致一个提交 D´ 让您从 A 到 D:

A <- D´ <- [mybranch]

由于 A 不包含不需要的信息,D´ 也不包含它,所以它不会出现在任何地方。如果您对此表示怀疑,可以使用 轻松确认git show,这将显示目标文件在 A 和 D´ 中的显示。

展示:

$ git init
$ echo good > A.txt
$ git add .
$ git commit -m"A"
$ echo bad >> A.txt
$ git add .
$ git commit -m"B"
$ echo indifferent >> A.txt
$ git add .
$ git commit -m"C"
$ cat A.txt
good
bad
indifferent
$ echo good > A.txt
$ echo indifferent >> A.txt
$ git add .
$ git commit -m"D"
$ cat A.txt
good
indifferent
$ git log
commit a61db7370bb38986e7cd6394a03491d185f0da08 (HEAD -> master)
commit ab271d3e51cfcac447399bfa2b5e5500c0fa0261
commit 496d8f9332372609856cc8f96565ef038658e81b
commit f3eccf8c081611ab13a9fc06cccb3c9b3b4e2275
$ git reset --soft f3eccf8
$ git commit -m"Dprime"
$ git show f3eccf8:A.txt
good
$ git show HEAD:A.txt
good
indifferent

如您所见,f3eccf8andHEAD是唯一剩余的提交,并且A.txt是唯一的文件,并且bad不会出现在任何提交中的该文件中。因此它永远不会出现,这是期望的结果。

但是请注意,在这个简单的示例中,我们有一个简单的历史记录,没有其他提交,也没有其他分支。我不知道您可能对任何可能包含不需要信息的“坏”提交有哪些其他参考。如果有任何此类引用,则不需要的信息仍然存在。原因是将 B、C 和 D 压缩为单个提交 D´ 不会编辑破坏B、C 和 D;所以它们很可能会持续存在,仍然包含不需要的信息。如果没有其他参考指向它们,那么是的,它们最终将不复存在;但我不知道是不是这样。


推荐阅读