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

时间:2010-04-10 15:43:15

标签: git version-control branch revision-history

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

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

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

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

3 个答案:

答案 0 :(得分:223)

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

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

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

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

答案 1 :(得分:78)

在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或{{1} })。您应该能够使用HEAD reflog来恢复已删除的指针。另请注意,在这种情况下,只有已删除分支中的无法访问提交将在git log --oneline --walk-reflogs HEAD期内受到保护,不会被修剪(删除),默认情况下为30天。

如果在HEAD的reflog中找不到刚刚删除的分支的提示,可以尝试使用gc.reflogExpireUnreachable查找“无法访问的提交&lt; sha1&gt;”,并检查这些(通过{{1 }}或git fsck)找到已删除分支的提示。

独立于如何找到已删除分支的提示,您可以撤消删除,或者使用

重新创建刚刚删除的分支
git show <sha1>

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


git log <sha1>中还有git-resurrect.sh脚本,它有助于找到具有给定名称和复活(取消删除)的分支提示的痕迹。

答案 2 :(得分:2)

如果您担心意外删除的分支机构并且不再拥有您的仓库的本地副本,那么像Gerrit这样的企业Git服务器的扩展将检测历史记录重写和分支删除,将在特殊参考下备份它们这样它们可以在需要时恢复,不会被垃圾收集修剪。出于法律原因,Gerrit管理员仍可以根据需要删除所选提交。