我的问题比标题中声明的更普遍。版本控制系统如何恢复版本?
我知道源版本控制只存储有关差异的信息。 据我所知,维基百科也是如此,github也是如此。
但他们都有能力显示整个文件与特定的修订。他们是否会逐步将其从第一次修订恢复到特定版本?
还有一个问题。如果他们仅存储差异,他们如何在UI中用上下文(在改变之前和之后的一些文本)显示它们。
编辑: github上存储整个快照,而不是增量
我的问题比标题中声明的更普遍。版本控制系统如何恢复版本?
我知道源版本控制只存储有关差异的信息。 据我所知,维基百科也是如此,github也是如此。
但他们都有能力显示整个文件与特定的修订。他们是否会逐步将其从第一次修订恢复到特定版本?
还有一个问题。如果他们仅存储差异,他们如何在UI中用上下文(在改变之前和之后的一些文本)显示它们。
编辑: github上存储整个快照,而不是增量
我知道源代码版本控制只存储不同的信息。
由于问题Git design decision on storing content rather than differences说明,这不正是什么 Git的一样。
尽管它具有“打包”格式,但使用LibXDiff库中的二进制增量以变化形式存储对象。但主要用于网络传输。
请参阅“Is the git binary diff algorithm (delta storage) standardized?”。
这就是为什么当你读取时git是“resolving delta”。
关于存储版本控制数据的不同方式的优缺点,我非常推荐阅读Eric Sink的文章Time and Space Tradeoffs in Version Control Storage。
存储是版本控制 系统中最困难的挑战之一。对于每个文件,我们都必须存储每个有 存在的版本。版本控制库的逻辑大小从不减少。它只是不断增长和增长,每个旧版本 需要保持可用。
那么,什么是最好的方式来存储每一个版本的一切?
维基百科,悲哀地......用XML(?)以文本形式保存数据库中的每一个修订版本。
看看wikipedia database schema。特别是最近的变化和文字。
因此,他们对“生物学”页面的第一个副本有精彩的O(1)查找。这有不幸的副作用,导致维基百科的technology cost从2010 - 2011年的800万美元膨胀到2011 - 2012年的1200万美元。这是尽管硬盘(和其他)变得更便宜,而不是更昂贵。
对于保存每个文件的修订控制如此之多。 Git采取一个可爱的方法。请参阅Is the git storage model wasteful?。
它存储每个文件,类似于上述方法。一旦回购所用的空间超过了一定限度,它就会重新进行蛮力重组(这是一个可以花费很多时间设置难度的选项--window = [N],--depth = [N])。它使用增量和无损压缩相结合的方式进行重新包装(递归增量,然后在任何位上应用无损)。
其他像SVN一样使用简单的增量压缩。 (来自记忆,你不应该信任)。
脚注: 增量压缩存储增量更改。 无损压缩非常类似于zip,rar等。