代码之家  ›  专栏  ›  技术社区  ›  Ken Liu

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

  •  167
  • Ken Liu  · 技术社区  · 15 年前

    来自SVN,刚刚开始熟悉Git。

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

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

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

    3 回复  |  直到 15 年前
        1
  •  217
  •   CB Bailey    15 年前

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

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

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

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

        2
  •  78
  •   deadly    11 年前

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

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

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

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

    删除分支后,只有提交“x”和“y”将无法访问。

    如果您在 gc.reflogExpire period,默认为90天,您将在head reflog中记录已删除分支的最后一个提示(请参见 git reflog show HEAD ,或者 git log --oneline --walk-reflogs HEAD )您应该能够使用head reflog来恢复删除的指针。还请注意,在这种情况下,只删除一个分支中无法访问的提交将受到保护,不会在 gc.reflogExpireUnreachable 期间,默认为30天。

    如果在reflog for head中找不到刚刚删除的分支的提示,可以尝试使用 git fsck 查找“不可访问的提交”并检查这些提交(通过 git show <sha1> git log <sha1> )查找已删除分支的尖端。

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

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

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


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

        3
  •  2
  •   Bo Persson Touseef    12 年前

    如果您担心意外删除的分支,并且不再有您的repo的本地副本,那么对企业git服务器(如gerrit)的扩展将检测历史重写和分支删除,并将它们备份到一个特殊的引用下,以便在需要时恢复它们。不会被垃圾收集修剪。如果出于法律原因需要,Gerrit管理员仍然可以删除选定的提交。