是否在git中删除分支将其从历史记录中删除?


189

来自svn,刚刚开始熟悉git。

在git中删除分支后,是否会将其从历史记录中删除?

在svn中,您可以通过还原删除操作(反向合并)轻松地恢复分支。像svn中的所有删除一样,该分支从未真正删除过,只是从当前树中删除了。

如果实际上从git的历史记录中删除了该分支,那么从该分支合并的更改会如何处理?他们被保留吗?

Answers:


249

分支只是git中提交的指针。在git中,每个提交都具有完整的源代码树,它与svn的结构截然不同,在svn中,所有分支和标签(按照惯例)都与特殊的“ trunk”一起位于存储库的单独“文件夹”中。

如果该分支在删除之前已合并到另一个分支,则在删除第一个分支时,所有提交仍可从另一个分支到达。它们保持原样。

如果删除该分支但未将其合并到另一个分支,则该分支中的提交(直到从仍然可以到达的提交派生的那一点)将不再可见。

提交仍将保留在存储库中,可以在删除后立即将其恢复,但是最终它们将被垃圾回收。


3
感谢你的回答。您能否阐明“每次提交都有完整的源代码树”的含义?据我了解,git中的每个提交都是一组增量,它们引用了父提交,而不是整个树。
刘坚

2
@Ken Liu:一个提交包含指向零个或多个父提交,一个树对象以及一些有关该提交的元数据的指针。因此,提交唯一地标识了一对源代码树,并且在相对于其父树查看时,它也标识了引入的更改。
CB Bailey 2010年

9
@刘肯:这完全取决于您对“包含”的理解,但是,是的,基本上每个提交都包含完整的树。在对象数据库中,对象由ID索引,因此对象在引用它们的所有对象(树和提交)之间共享,因此隐含的存储开销没有最初听起来那么糟糕。git还具有有效的存储优化(打包文件),可以更有效地利用磁盘空间。
CB Bailey 2010年

22
“最终它们将被垃圾收集” -最终何时?
BadHorsie

7
@BadHorsie,取决于
AliOli

86

在Git中,分支只是提交的有向无环图(DAG)中指向提交的指针(引用)。这意味着删除分支将仅删除对提交的引用,这可能会使DAG中的某些提交不可访问,因此不可见。但是,至少在删除无法访问的提交(例如使用git gc)之前,所有已删除分支上的提交仍将在存储库中。

请注意,git branch -d如果无法确定删除分支不会留下无法访问的提交,它将拒绝删除分支。如果git branch -D分支可能留下无法到达的提交,则需要使用更强的功能来强制删除分支。

还要注意,如果存在无法到达的提交,则仅是已删除分支的最后一个提示与已合并到另一个现有分支的提交,任何带标记的提交或分支点之间的提交。以较晚者为准。例如在以下情况下:

---- O ---- * ---- * ---- / M ---- * <-主控<-HEAD
     \ /
      \ --.----.-- /-x --- y <-删除的分支

删除分支后,仅提交'x'和'y'将变得不可访问。

如果您在gc.reflogExpire默认情况下90天之内对删除的分支进行了操作,则将在HEAD reflog中记录已删除分支的最后提示(请参阅git reflog show HEADgit log --oneline --walk-reflogs HEAD)。您应该能够使用HEAD reflog恢复已删除的指针。还要注意,在这种情况下,仅在删除的分支中无法访问的提交将受到保护,以防止在gc.reflogExpireUnreachable默认为30天的期限内进行修剪(删除)。

如果您在reflog中git fsck找不到用于HEAD的刚刚删除的分支的提示,则可以尝试查找“无法到达的提交<sha1>”,然后检查(通过git show <sha1>git log <sha1>)以找到已删除的分支的提示。

与如何找到已删除分支的提示无关,您可以撤消删除,或者使用以下方法重新创建刚删除的分支

git branch <deleted-branch> <found-sha1-id>

但是请注意,分支的引用日志将丢失。


还有git-resurrect.sh脚本,contrib/该脚本可帮助查找具有给定名称的分支提示的痕迹并使其复活(取消删除)。


1
太棒了!git reflog show HEAD列出提交,就像您所说的,我创建了一个新分支,完美。
史蒂文·阿尔默罗斯

2

如果您担心分支意外删除并且不再拥有本地存储库副本,则可以使用Gerrit等企业Git服务器扩展,这些扩展将检测历史记录重写和分支删除,并在特殊引用下对其进行备份,以便它们可以在需要时进行还原,并且不会被垃圾回收修剪。Gerrit管理员仍然可以出于法律原因删除选定的提交。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.