如果一个尚未合并的Git分支被删除,会发生什么?

17

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

当我使用git push origin --delete <branchName>删除该分支时,实验分支的提交会发生什么? Git会保留一些不可访问的残留吗? 如果我记得对那个分支有标签,并且它已上传到GitHub,这会造成任何问题吗?

编辑:

如建议所述,我使用gitk --all进行了检查,提交图看起来像这样:

commit graph

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

3个回答

25

删除分支只会做这一件事:删除该分支。由于分支仅是对提交的引用,因此只有该引用被删除。但是提交仍然存在。

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

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

因此,如果您想要摆脱某个提交,则需要删除所有引用该提交的引用。如果您想删除分支,而有其他东西引用了该分支中的提交,则这并不是问题,并且不会导致问题:希望保留该提交,以便其他事物不会破裂。


谢谢!所以我不需要手动处理这些未引用的提交,垃圾回收会处理它们。 - inf3rno
1
是的,最终会被清除。至于你的编辑,删除 babel 分支(本地和远程),以及删除那个存储,将使这些提交可供垃圾回收使用。 - poke

2
当使用git push origin --delete <branchName>命令删除实验分支时,该特定分支将在本地和远程存储库中被删除。可能无法恢复它。
根据这个答案https://dev59.com/aW445IYBdhLWcg3w1tkS#4674570,可以通过reflog的帮助来恢复该分支。
如果我记得正确,我有标签在那个分支上,并且它已上传到github。这会引起任何问题吗?
这不应该引起任何问题。如果您在该分支上有标签,则仍然可以访问这些标签并基于它们创建一个新分支。

1

是的,Git会保留一些不可访问的残留物-至少在开始时会这样。无法从现有分支或标签访问的提交称为“悬挂提交”。例如,请参见此问题:Git:什么是悬挂提交/ blob,它们从哪里来?

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

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

git tag -d TAG-NAME

要在本地删除标签,同时使用以下命令从GitHub中删除标签:

git push origin :refs/tags/TAG-NAME

当Git在存储库中执行垃圾回收时,不可访问的提交最终会被删除。正如其他Stack Overflow问题中提到的那样,在git-scm.com上的Maintenance and Data Recovery部分提供了更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接