来自svn,刚刚开始熟悉git。
在git中删除分支时,是否从历史记录中删除了?
在svn中,您可以通过恢复删除操作(反向合并)轻松恢复分支。与svn中的所有删除一样,分支永远不会被删除,它只是从当前树中删除。
如果分支实际上已从git中的历史记录中删除,那么从该分支合并的更改会发生什么变化?他们被保留了吗?
答案 0 :(得分:223)
分支只是指向git中提交的指针。在git中,每个提交都有一个完整的源代码树,它是一个与svn完全不同的结构,其中所有分支和标记(按照惯例)与特殊的“主干”一起位于存储库的单独“文件夹”中。
如果在删除分支之前将分支合并到另一个分支,则在删除第一个分支时,仍可以从另一个分支访问所有提交。它们保持原样。
如果在没有合并到另一个分支的情况下删除分支,那么该分支中的提交(直到从仍然可以访问的提交分叉的那一点)将不再可见。
提交仍将保留在存储库中,并且可以在删除后立即恢复它们,但最终它们将被垃圾收集。
答案 1 :(得分:78)
在Git中,分支只是提交的有向非循环图(DAG)中提交的指针(引用)。这意味着删除分支仅删除对提交的引用,这可能使DAG中的某些提交无法访问,因此不可见。但是,删除分支上的所有提交仍然在存储库中,至少在无法访问的提交被修剪之前(例如使用git gc
)。
请注意,git branch -d
如果无法确定删除分支是否会导致无法访问的提交,则会拒绝删除分支。您需要使用更强大的git branch -D
来强制删除分支,如果它可能会留下无法访问的提交。
另请注意,无法访问的提交(如果存在)只是已删除分支的最后一个提示与已合并到另一个现有分支,任何标记提交或分支点的提交之间的提交;以较晚者为准。例如,在以下情况中:
----O----*----*----/M----* <-- master <-- HEAD \ / \--.----.--/--x---y <-- deleted branch
只有提交'x'和'y'在删除分支后才会无法访问。
如果您在gc.reflogExpire
期限内的已删除分支上操作,默认为90天,您将在HEAD reflog中记录已删除分支的最后一个提示(请参阅git reflog show HEAD
或{{1} })。您应该能够使用HEAD reflog来恢复已删除的指针。另请注意,在这种情况下,只有已删除分支中的无法访问提交将在git log --oneline --walk-reflogs HEAD
期内受到保护,不会被修剪(删除),默认情况下为30天。
如果在HEAD的reflog中找不到刚刚删除的分支的提示,可以尝试使用gc.reflogExpireUnreachable
查找“无法访问的提交&lt; sha1&gt;”,并检查这些(通过{{1 }}或git fsck
)找到已删除分支的提示。
独立于如何找到已删除分支的提示,您可以撤消删除,或者使用
重新创建刚刚删除的分支git show <sha1>
但请注意,分支的reflog将丢失。
git log <sha1>
中还有git-resurrect.sh脚本,它有助于找到具有给定名称和复活(取消删除)的分支提示的痕迹。
答案 2 :(得分:2)
如果您担心意外删除的分支机构并且不再拥有您的仓库的本地副本,那么像Gerrit这样的企业Git服务器的扩展将检测历史记录重写和分支删除,将在特殊参考下备份它们这样它们可以在需要时恢复,不会被垃圾收集修剪。出于法律原因,Gerrit管理员仍可以根据需要删除所选提交。