来自svn,刚开始熟悉git。
当在git中删除一个分支时,它是否从历史记录中删除了?
在svn中,您可以通过恢复删除操作(反向合并)轻松地恢复分支。就像svn中的所有删除一样,分支永远不会被真正删除,它只是从当前树中删除。
如果从git的历史记录中删除了该分支,那么从该分支合并的更改会发生什么?他们被保留了吗?
来自svn,刚开始熟悉git。
当在git中删除一个分支时,它是否从历史记录中删除了?
在svn中,您可以通过恢复删除操作(反向合并)轻松地恢复分支。就像svn中的所有删除一样,分支永远不会被真正删除,它只是从当前树中删除。
如果从git的历史记录中删除了该分支,那么从该分支合并的更改会发生什么?他们被保留了吗?
当前回答
分支只是git中指向提交的指针。在git中,每个提交都有一个完整的源代码树,它与svn的结构非常不同,在svn中,所有的分支和标签(按照惯例)都位于存储库的单独“文件夹”中,旁边是特殊的“主干”。
如果该分支在被删除之前被合并到另一个分支,那么当第一个分支被删除时,其他分支仍然可以访问所有提交。它们保持原样。
如果分支被删除而没有被合并到另一个分支中,那么该分支中的提交(直到仍然可以到达的提交的分叉点为止)将不再可见。
提交仍将保留在存储库中,并且在删除后可以立即恢复它们,但最终它们将被垃圾收集。
其他回答
如果你担心不小心删除了分支,并且你的回购不再有本地副本,企业Git服务器(如Gerrit)有扩展,可以检测历史重写和分支删除,将它们备份到一个特殊的引用下,以便在需要时可以恢复它们,而不会被垃圾收集修剪。如果出于法律原因需要,Gerrit管理员仍然可以删除选定的提交。
在Git中,分支只是指向提交的有向无循环图(DAG)中的提交的指针(引用)。这意味着删除分支只会删除对提交的引用,这可能会使DAG中的某些提交不可达,从而不可见。但是所有被删除的分支上的提交仍然会在存储库中,至少直到不可达的提交被修剪(例如使用git gc)。
注意,如果git branch -d不能确保删除分支不会留下不可访问的提交,它将拒绝删除分支。你需要使用更强的git分支-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中进行修剪(删除)。reflogexpire不可达周期,默认为30天。
如果你在reflog for HEAD中找不到刚刚删除的分支的尖端,你可以尝试使用git fsck来找到“unreachable commit <sha1>”,并检查那些(通过git show <sha1>或git log <sha1>)来找到被删除的分支的尖端。
与您如何找到已删除分支的顶端无关,您可以使用撤销删除,或者重新创建刚刚删除的分支
git branch <deleted-branch> <found-sha1-id>
但是请注意,分支的reflog将会丢失。
在contrib/中还有git- resurrection .sh脚本,它可以帮助查找具有给定名称的分支提示的痕迹并恢复(删除)它。
分支只是git中指向提交的指针。在git中,每个提交都有一个完整的源代码树,它与svn的结构非常不同,在svn中,所有的分支和标签(按照惯例)都位于存储库的单独“文件夹”中,旁边是特殊的“主干”。
如果该分支在被删除之前被合并到另一个分支,那么当第一个分支被删除时,其他分支仍然可以访问所有提交。它们保持原样。
如果分支被删除而没有被合并到另一个分支中,那么该分支中的提交(直到仍然可以到达的提交的分叉点为止)将不再可见。
提交仍将保留在存储库中,并且在删除后可以立即恢复它们,但最终它们将被垃圾收集。