我正在通过一个关于git的在线课程工作,而他们要么提到的一件事 - 或者我可能错过了某种方式 - 是否一条线的更新总是被视为一个删除,然后在完成差异时插入。
假设您有一行代码
x = 3;
您意识到这是不正确的,并将其更改为
x = 0;
您还没有删除任何行或在编辑器中添加任何行;你只是用0来改写3。 git是否会将此视为完全删除该行,然后插入一条表示x为零的新行?我认为必须这样,因为课程中没有任何内容谈论过更新,现有的行以我描述的方式改变。
我和git专家一样确认我的假设是正确的。
答案 0 :(得分:2)
它(始终显示为"删除< thing>并插入< other-thing>")。但重要的是要注意,这只是它是如何显示的,并且Git内置了面向行的diff和面向字的diff,以及在文件上运行外部差异。
实际存储由完整快照完成:Git将以前版本的文件存储为 blob 对象,然后如果您更改了文件,Git会将新版本的文件存储为新的,独立的对象。 (如果您根本没有更改文件,或者如果您更改了文件 back ,Git会重新使用存储文件正确版本的现有blob。)Git(re)计算差异每当你要求它将带有ID X 的blob与ID Y 的blob进行比较时,它就会飞。
在对象级别,然后,Git只是一个键/值数据存储,其中键是对象的哈希ID - 根据其内容计算,或者由某人说出& #34;用哈希a1234567...
"给我一个对象例如 - 值是数据内容。
远低于此级别,Git 可以使用增量编码系统压缩对象。它使用xdelta的修改,它不是面向行的,可以用于纯二进制文件。 (这取决于各种文件的Shannon熵,因此它对已经压缩的数据通常无效。如果你有任何二进制数据,当你将它存储到Git中时,可能压缩也可能不压缩。)