删除git中的分支是否会从历史记录中删除它?

Ken*_*Liu 180 git version-control branch revision-history

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

当在git中删除分支时,它是否从历史记录中删除了?

在svn中,您可以通过还原删除操作(反向合并)轻松恢复分支.与svn中的所有删除一样,分支永远不会被删除,它只是从当前树中删除.

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

CB *_*ley 236

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

如果在删除分支之前将分支合并到另一个分支,则在删除第一个分支时,仍可以从另一个分支访问所有提交.他们保持原样.

如果在没有合并到另一个分支的情况下删除分支,那么该分支中的提交(直到从仍然可访问的提交分叉的点)将不再可见.

提交仍将保留在存储库中,并且可以在删除后立即恢复它们,但最终它们将被垃圾收集.

  • *"最终他们将被垃圾收集"* - 最终什么时候? (21认同)
  • @Ken Liu:这取决于你所拥有的'包含',但是,基本上每个提交都包含一个完整的树.在对象数据库中,对象由id索引,因此对象在引用它们的所有对象(树和提交)之间共享,因此隐含的存储开销不像最初的声音那么糟糕.git还具有高效的存储优化(包文件),可以更有效地利用磁盘空间. (9认同)
  • @BadHorsie,[取决于](https://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery). (5认同)
  • 谢谢你的回答.你能澄清一下"每个提交都有一个完整的源代码树"的含义吗?据我所知,git中的每个提交都是一组deltas,它们引用父提交,而不是整个树. (3认同)
  • @Ken Liu:一个提交包含指向零个或多个父提交的指针,一个树对象和一些关于提交的元数据.因此,提交唯一地标识两个源树,并且当针对其父节点查看时,它引入的更改. (2认同)
  • 由挑剔的 git 管理员(人类)收集的垃圾还是会自动发生? (2认同)

Jak*_*ski 83

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

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

另请注意,无法访问的提交(如果存在)只是已删除分支的最后一个提示与已合并到另一个现有分支,任何标记提交或分支点的提交之间的提交; 以较晚者为准.例如,在以下情况中:

----O----*----*----/M----*    <-- master <-- HEAD
     \            /
      \--.----.--/--x---y     <-- deleted branch

只有提交'x'和'y'在删除分支后才会无法访问.

如果您在该gc.reflogExpire期间内默认操作已删除的分支,默认为90天,您将在HEAD reflog中记录已删除分支的最后一个提示(请参阅git reflog show HEAD,或git log --oneline --walk-reflogs HEAD).您应该能够使用HEAD reflog来恢复已删除的指针.另请注意,在这种情况下,仅在已删除的分支中的无法访问提交将受到保护,以免在该gc.reflogExpireUnreachable时间段内进行修剪(删除),默认情况下为30天.

如果在HEAD的reflog中找不到刚刚删除的分支的提示,您可以尝试使用git fsck查找"无法访问的提交<sha1>",并检查这些(通过git show <sha1>git log <sha1>)以查找已删除分支的提示.

独立于如何找到已删除分支的提示,您可以撤消删除,或者更确切地说,使用重新创建刚刚删除的分支

git branch <deleted-branch> <found-sha1-id>
Run Code Online (Sandbox Code Playgroud)

但请注意,分支的reflog将丢失.


还有git-resurrect.sh脚本,contrib/其中有助于找到具有给定名称的分支尖端的痕迹并复活(取消删除)它.