是否删除在Git中从历史记录中删除一个分支?
-
26-09-2019 - |
题
这SVN编辑,刚开始熟悉GIT中。
当一个分支在GIT中被删除时,它被从记录中移除?
在SVN,可以很容易地通过恢复删除操作(反向合并)恢复一个分支。像SVN所有的删除,分支永远不会真正删除,它只是从当前的树中删除。
如果该分支实际上从git的历史中删除,会发生什么情况,从该分支合并的变化?是他们保留?
解决方案
分行只是指针在GIT中的提交。在GIT中的每个已提交一个完整的源代码树,它是从SVN一个非常不同的结构,其中所有分支和标签(约定)居住在存储库旁边的特殊的“主干”的单独的“文件夹”。
如果该分支被合并到另一个分支被删除之前,那么所有的提交的仍然是从另一个分支可到达时第一分支被删除。它们完全保持原样。
如果该分支不被合并到另一个分支然后在该分支的提交(直到点,其中来自一个分叉提交即仍可达)删除将不再是可见的。
在提交仍然会在仓库中保留,并且可以删除后立即恢复他们,但他们最终会被垃圾回收。
其他提示
在GIT中,分支是只是指针(参考文献),以在提交的有向非循环图(DAG)的提交。这意味着,在删除一个分支,以去除仅提交引用,这可能使DAG中的一些提交可达,从而无形。但是,这是在一个已删除的分支中的所有的提交将仍然是在存储库中,至少直到不可达提交获得(例如使用git gc
)修剪。
请注意git branch -d
将拒绝删除一个分支,如果它不能确信删除它不会离开不可达的提交。您需要使用更强的git branch -D
给力缺失的一个分支,如果它可能会留下不可达的提交。
还要注意的是不可达的提交,如果它们存在,只是删除的分支的最后尖端之间的那些提交和使用COMMIT该GOT合并到另一个现有分支,任何标记提交,或者分支点;以较迟者为准。例如,在以下情况:
----O----*----*----/M----* <-- master <-- HEAD \ / \--.----.--/--x---y <-- deleted branch
仅提交“x”和“y”的将成为删除分支后可达。
如果您对gc.reflogExpire
期间内已删除的分支操作,缺省的90天,你就必须记录在HEAD引用日志删除的分支的最后尖端(参见git reflog show HEAD
,或git log --oneline --walk-reflogs HEAD
)。你应该能够使用HEAD引用日志恢复被删除的指针。还要注意的是在这种情况下,在刚刚被删除的分支不可达的提交将受到保护从修剪(拆除)gc.reflogExpireUnreachable
期间,缺省情况下是30天之内。
如果您无法找到引用日志的头刚刚删除分支的顶端,你可以尝试使用git fsck
找到“不可达提交git show <sha1>
或git log <sha1>
)找到尖端被删除的分支的。
独立你如何找到已删除的分支的末端,您可以撤消删除,或者更确切地说,重新创建使用刚删除分支
git branch <deleted-branch> <found-sha1-id>
请注意然而,对于一个分支引用日志将会丢失。
还有 git-resurrect.sh 脚本中contrib/
这有助于找到一个分支末端的具有给定名称和复活(撤消删除)它。
如果你担心不小心删除了分公司和没有你的回购不再的本地副本,还有扩展到企业的Git服务器,比如格里特将检测历史重写和分支删除,将其备份在一个特殊的裁判使他们可以在需要时可以恢复,不会受到垃圾收集被修剪。如果需要,出于法律原因格里特的管理员仍然可以删除选定的提交。