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

来自svn,刚开始熟悉git。

当一个分支在git中被删除,它是否从历史中删除?

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

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

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

如果分支在被删除之前被合并到另一个分支中,那么当第一个分支被删除时,所有的提交仍然可以从另一个分支到达。 他们保持完全一样。

如果分支被删除而没有被合并到另一个分支中,那么该分支中的提交(直到从仍然可达的提交分叉的点)将不再可见。

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

在Git中,分支只是在提交的有向无环图(DAG)中进行提交的指针(引用)。 这意味着删除分支只会删除对提交的引用,这可能会导致DAG中的某些提交无法访问,从而不可见。 但是,删除分支上的所有提交仍然会存储在存储库中,至less在不可恢复的提交被修剪之前(例如使用git gc )。

请注意, git branch -d会拒绝删除一个分支,如果它不能确定删除它不会留下不可达的提交。 你需要使用更强大的git branch -D强制删除分支,如果它可能会留下不可达的提交。

还要注意,不可达的提交(如果存在的话)只是已删除分支的最后一个提示与已经合并到另一个现有分支的提交,任何已标记的提交或分支点之间的那些提交; 以后到者为准。 例如在以下情况下:

 ---- O ---- * ---- * ---- / M ---- * < -  master < -  HEAD
      \ /
       \  - 。---- .-- /  -  x --- y < - 删除分支

只有在删除分支后提交'x'和'y'将变得不可用。

如果你在gc.reflogExpire期间的一个被删除的分支上gc.reflogExpire ,默认90天,你可以在HEAD reflog中logging被删除分支的最后一个提示(参见git reflog show HEAD或者git log --oneline --walk-reflogs HEAD )。 您应该可以使用HEAD reflog来恢复已删除的指针。 还要注意的是,在这种情况下,只有被删除的分支中的不可达提交将被保护,以免在gc.reflogExpireUnreachable期间内删除(删除),默认为30天。

如果在HEAD的reflog中找不到一个刚刚被删除的分支的提示,你可以尝试使用git fsck来查找“unreachable commit <sha1>”,并检查那些(通过git show <sha1>git log <sha1> )来查找已删除分支的提示。

独立于您如何find已删除分支的提示,您可以撤消删除,或者使用重新创build一个刚删除的分支

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

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


contrib/还有git-resurrect.sh脚本,它可以帮助find给定名称的分支提示的痕迹,并重新生成(取消删除)它。

如果您担心意外删除了分支机构,并且没有本地副本,那么可以使用像Gerrit这样的企业Git服务器的扩展程序来检测历史重写和分支删除,并将其备份到特殊的参考文献中,以便他们如果需要可以恢复,不会被垃圾回收修剪。 如果法律原因需要,Gerritpipe理员仍然可以删除选定的提交。