我刚开始学习git并且这样做我开始阅读Git社区书,在本书中他们说SVN和CVS存储文件之间的差异,而git存储所有文件的快照.
但我并没有真正了解快照的含义.git是否真的复制了每个提交中的所有文件,因为这是我从他们的解释中理解的.
PS:如果有任何人有更好的学习git的来源我会很感激.
我刚刚在Ruby on Rails项目上运行了以下命令:
git init
git add .
git commit -a -m 'Initial'
Run Code Online (Sandbox Code Playgroud)
Git在哪里实际存储此存储库?(它在我的本地机器上,但在哪里?)
Git使用增量压缩来存储彼此相似的对象.
此算法是否已标准化并在其他工具中使用?是否有描述格式的文档?它与xdelta/VCDIFF/RFC 3284兼容吗?
我没有在薄包装上找到太多东西,而且手册页的信息对此非常神秘.我知道它与慢速连接有关,但什么是"慢速连接"?
它的优点和缺点是什么?我什么时候应该使用它,什么时候不应该使用它?
阅读git的文档他们强调的一件事是git存储快照而不是增量.自从我看到Git的课程说Git存储了文件版本之间的差异后,我尝试了以下内容:我在一个空文件夹上初始化了一个git存储库,创建了一个lorem.txt包含一些lorem ipsum文本的文件,该文件暂存并提交.
然后find .git/objects -type f在命令行上使用我列出了在对象文件夹上保存的git,并且按照预期找到了一个提交对象,该对象指向指向包含我保存的lorem ispum文本的blob对象的树对象.
然后我修改了lorem ipsum文本,添加了更多内容,暂存了这个更改并提交了.再次列出文件,我现在可以看到新的提交对象,指向一个新的三个对象和一个新的blob对象.使用git cat-file -p 331cf0780688c73be429fa602f9dd99f18b36793我可以看到新blob的内容.它们正是完整lorem.txt文件的内容,旧内容加上更改.
这符合文档的预期:git存储快照,而不是增量.但是,在互联网上搜索我发现了这个问题.在接受的答案中,我们看到以下内容:
虽然这在概念层面上是真实而重要的,但在存储层面却并非如此.
Git确实使用增量来存储.
不仅如此,它比其他任何系统都更有效率.因为它不保留每个文件的历史记录,所以当它想要进行增量压缩时,需要每个blob,选择一些可能相似的blob(使用包含最接近的先前版本和其他一些版本的试探法),尝试生成增量并选择最小的增量.通过这种方式,它可以(通常取决于启发式方法)利用其他类似文件或比以前更相似的旧版本."pack window"参数允许delta压缩质量的交易性能.默认值(10)通常会得到不错的结果,但是当空间有限或加速网络传输时,git gc --aggressive使用值250,这使得它运行速度非常慢,但为历史数据提供了额外的压缩.
这说Git确实使用增量进行存储.据我所知,Git不会一直使用增量,但只有在检测到它时才有必要.这是真的?
我在文件上放了很多lorem文本,所以它的大小是2mb.我认为当对一个大文本文件做一个小改动时,Git会自动使用增量,但正如我所说的那样.
当Git使用deltas以及它是如何工作的?
我已经阅读了有关在Git存储库中存储二进制文件的现有问题,但有些方面仍然不清楚.
存储库包含大约50 MB的代码源和大约1 GB的二进制文件.二进制文件很少更改.



以上是合并和rebase的结果.
我的问题是,在最终状态下,C5和C3'是否相同?
或者说,git rebase等于git merge+删除C3?
据我了解,一些VCS存储修订版之间的差异,因为,差异有时很小 - 源代码中的一行被更改或者后续修订中添加了注释.另一方面,Git为每个修订版存储压缩的"快照".
如果只做了很小的改动(大文本文件中的一行),Git如何处理这个?它是否存储了两个几乎完全相同的副本?我想,这将是对空间的低效利用.
我有一些svg文件希望通过git. 但是,大多数软件都可以透明处理svgz(基本上是svg.gz)。因此,我正在考虑切换到svgz以节省磁盘空间。
将它们作为svgz而不是svg从一个git角度来看有什么优点和缺点?
我天真的想法是git 差异算法针对文本文件进行了优化,并且在它们的压缩副本上效果不佳。由于差异也被压缩,我认为整体方法对于文本文件非常有效,其中差异占用的磁盘空间非常少。相反,对于压缩数据,它倾向于在内部保存更大的文件,最终我预计存储库最终可能会为压缩文件占用更多空间。
鉴于我目前的分支是分支A.
分支A包含:
line 1 -- "i love you Foo"
Run Code Online (Sandbox Code Playgroud)
分支B包含:
line 1 -- "i love you Bar"
Run Code Online (Sandbox Code Playgroud)
如果我这样做:
git merge Branch B
Run Code Online (Sandbox Code Playgroud)
我会得到什么?
我有兴趣了解Git源代码,也许有一天会对它做出贡献.
我理解Git源代码是基于:
2)HTTP,HTTPS,SSH等技术
我只是想知道,还有什么是理解Git源代码的先决条件吗?