【问题标题】:What happens to a git branch after delete if it was not merged?如果没有合并,删除后 git 分支会发生什么?
【发布时间】:2016-04-14 04:20:12
【问题描述】:

我有一个小型 repo,其中包含一个 master 和一个实验分支,用于尝试一些新功能。我决定不在master上实现这些功能。

当我使用git push origin --delete <branchName> 删除该实验分支时,该分支的提交会发生什么情况? git 会保留一些不可访问的残余吗?如果我没记错的话,我在那个分支上有标签,它被上传到了 github。这会引起什么问题吗?

编辑:

我按照建议检查了gitk --all,提交图如下所示:

我想删除 babel 分支及其所有提交,并且我不希望它可以恢复。这可能吗?

【问题讨论】:

    标签: git github


    【解决方案1】:

    删除分支只会这样做:删除分支。由于分支只是对提交的引用,因此只有该引用消失了。提交仍然存在。

    与编程语言类似,Git 有一个垃圾收集器,它最终会删除不再引用的提交对象。因此,如果该分支是指向该提交的唯一指针,那么您实际上将无法访问它,并且它会“很快”被删除。

    如果您有其他引用,包括间接引用该提交的其他分支、标签和提交(即该提交是其父提交),则该提交仍被引用且不会被删除。

    因此,如果您想删除一个提交,您需要删除对该提交的所有引用。如果您想删除分支,并且还有其他内容引用该分支的提交,那么这不是问题并且不会导致问题:然后保留提交是期望的行为,以便其他内容不会中断.

    【讨论】:

    • 谢谢!所以我不需要手动处理这些未引用的提交,gc 会处理它们。
    • 是的,最终。至于您的编辑,删除 babel 分支(本地和远程)并删除该存储,将使这些提交可用于垃圾收集。
    【解决方案2】:

    当我删除时,实验分支的提交会发生什么 那个分支使用git push origin --delete <branchName> ?

    将在您的本地和远程存储库中删除特定分支。我可能无法再次恢复它。

    git 会保留一些不可访问的残余吗?

    根据这个答案https://*.com/a/4674570/1654730,也许可以借助 reflog 来恢复分支。

    如果我没记错的话,我在那个分支上有标签,它被上传到 github。这会引起什么问题吗?

    这不会导致任何问题。如果您在该分支上有标签,您仍然可以访问标签并基于它们创建新分支。

    【讨论】:

      【解决方案3】:

      是的,git 会保留一些不可访问的残余 - 至少在开始时是这样。无法从现有分支或标签访问的提交称为悬空提交。例如看这个问题:Git: what is a dangling commit/blob and where do they come from?

      如果您在分支上创建标签并将这些标签推送到 GitHub,那么这些标签仍将存在于您的本地存储库中,因此从这些标签访问的提交将永远不会被删除。

      您可以使用例如gitk --all 来显示本地存储库中的所有分支和标签,如果您看到旧分支上的标签现在已删除,您也可以删除每个标签,使用

      git tag -d TAG-NAME
      

      在本地删除标签,并从 GitHub 中删除标签:

      git push origin :refs/tags/TAG-NAME
      

      当 git 在存储库中执行垃圾收集时,最终会删除不可访问的提交。正如另一个 Stack Overflow 问题中提到的,在 git-scm.comMaintenance and Data Recovery 部分中有更多信息。

      【讨论】: