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

删除git中的分支是否会将其从历史记录中删除?,git,version-control,branch,revision-history,Git,Version Control,Branch,Revision History,来自svn,刚刚开始熟悉git 在git中删除分支时,它是否从历史记录中删除 在svn中,您可以通过还原删除操作(反向合并)轻松恢复分支。与svn中的所有删除一样,分支从未真正删除,它只是从当前树中删除 如果该分支实际上是从git中的历史记录中删除的,那么从该分支合并的更改会发生什么变化?它们被保留了吗?分支只是git中提交的指针。在git中,每个提交都有一个完整的源代码树,它的结构与svn非常不同,svn中的所有分支和标记(按照约定)都位于存储库的单独“文件夹”中,与特殊的“主干”一起 如果该

来自svn,刚刚开始熟悉git

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

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


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

分支只是git中提交的指针。在git中,每个提交都有一个完整的源代码树,它的结构与svn非常不同,svn中的所有分支和标记(按照约定)都位于存储库的单独“文件夹”中,与特殊的“主干”一起

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

如果该分支被删除而没有合并到另一个分支中,那么该分支中的提交(直到从仍然可访问的提交中派生出的分支)将不再可见


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

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

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

还要注意,不可访问的提交(如果存在)仅指已删除分支的最后一个尖端与合并到另一个现有分支的提交、任何标记的提交或分支点之间的提交;以较晚者为准。例如,在以下情况下:

----O----*----*----/M----* <-- master <-- HEAD \ / \--.----.--/--x---y <-- deleted branch 但是请注意,分支的reflog将丢失



contrib/
中还有一个脚本,可以帮助您找到具有给定名称的分支提示的痕迹,并重新恢复(取消删除)它。

如果您担心意外删除分支,并且不再拥有回购协议的本地副本,像Gerrit这样的企业Git服务器有一些扩展,它们将检测历史重写和分支删除,并在一个特殊的ref下对它们进行备份,以便在需要时可以恢复它们,而不会被垃圾收集删减。如果出于法律原因需要,Gerrit管理员仍然可以删除选定的提交

谢谢你的回答。你能澄清一下“每个提交都有一个完整的源代码树”是什么意思吗?据我所知,git中的每个提交都是一组delta,它们引用的是父提交,而不是整个树。@Ken Liu:提交包含指向零个或多个父提交的指针、一个树对象和一些有关提交的元数据。因此,提交可以唯一地标识一对源树,以及在对照其父树查看时,它所引入的更改。@Ken Liu:这完全取决于“包含”所包含的内容,但实际上每个提交都包含一个完整的树。在对象数据库中,对象是按id索引的,因此对象在引用它们的所有对象(树和提交)之间共享,因此隐含的存储开销不会像最初听起来那么大。git还有一个高效的存储优化(打包文件),它可以更有效地利用磁盘空间。“最终它们会被垃圾收集”-最终会在什么时候?@BadHorsie,.Awesome
git reflog show HEAD
列出了提交,我创建了一个新的分支,就像你说的,完美。
git branch <deleted-branch> <found-sha1-id>