Answers:
分支只是git中提交的指针。在git中,每个提交都具有完整的源代码树,它与svn的结构截然不同,在svn中,所有分支和标签(按照惯例)都与特殊的“ trunk”一起位于存储库的单独“文件夹”中。
如果该分支在删除之前已合并到另一个分支,则在删除第一个分支时,所有提交仍可从另一个分支到达。它们保持原样。
如果删除该分支但未将其合并到另一个分支,则该分支中的提交(直到从仍然可以到达的提交派生的那一点)将不再可见。
提交仍将保留在存储库中,可以在删除后立即将其恢复,但是最终它们将被垃圾回收。
在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 HEAD
或git 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/
该脚本可帮助查找具有给定名称的分支提示的痕迹并使其复活(取消删除)。
git reflog show HEAD
列出提交,就像您所说的,我创建了一个新分支,完美。
如果您担心分支意外删除并且不再拥有本地存储库副本,则可以使用Gerrit等企业Git服务器扩展,这些扩展将检测历史记录重写和分支删除,并在特殊引用下对其进行备份,以便它们可以在需要时进行还原,并且不会被垃圾回收修剪。Gerrit管理员仍然可以出于法律原因删除选定的提交。