deltas
而是存储snapshots
。
现在我有一个非常精确的问题。
假设我有以下代码并在master
#include <iostream>
using namespace std;
void swap(char *A, int i, int j) {
int t = A[i];
A[i] = A[j];
A[j] = t;
}
void reverse(char *A, int size) {
for (int i = 0; i < size/2; i++)
swap(A,i,size-1-i);
}
int main() {
int n;
cin >> n;
char A[n];
int k;
cin >> k;
for (int i = 0; i < n; i++)
cin >> A[i];
reverse(A,n-k);
reverse(A+n-k,k);
for (int i = 0; i < n; i++)
cout << A[i];
cout << endl;
}
然后我只在一个额外的行更改它,并在最后的第四行添加一个reverse
调用
#include <iostream>
using namespace std;
void swap(char *A, int i, int j) {
int t = A[i];
A[i] = A[j];
A[j] = t;
}
void reverse(char *A, int size) {
for (int i = 0; i < size/2; i++)
swap(A,i,size-1-i);
}
int main() {
int n;
cin >> n;
char A[n];
int k;
cin >> k;
for (int i = 0; i < n; i++)
cin >> A[i];
reverse(A,n-k);
reverse(A+n-k,k);
reverse(A,n);
for (int i = 0; i < n; i++)
cout << A[i];
cout << endl;
}
然后我在相同的分支(master
)中提交它。
现在我的问题是git store实际上是什么。不要回答我snapshot
。我想知道snapshot
在技术上意味着什么。这是否意味着它按原样存储整个文件。这将是非常低效的。或者它实际上存储增量。但如果是这样,那为什么称它们为快照。
答案 0 :(得分:2)
Git将为修改后的文件创建一个新的blob
,然后为修改后的目录创建一个新的tree
,然后创建一个新的commit
,然后将这三个(以及其他可能的对象)放入已创建)到对象数据库中。
文件的blob是一个二进制对象,它包含对象类型(blob),对象大小和实际内容。所以,是的,如果你只修改一个文件中的一行,git会将整个东西存储两次而不仅仅是diff。
一般来说,git牺牲了磁盘的速度,从这个角度来看,它无论如何都不会效率低下#34;
然而,这种存储方法(称为松散物体)并非最佳,特别是对于运输而言。因此,git能够将这些松散的对象打包到包文件和索引中。打包过程将识别具有小差异的对象,将它们放在一起并将delta压缩到包文件中。从运输的角度来看,这些将更紧凑,更高效。
我最好能解决你的问题。我在评论中指出的链接描述了在详细存储内容时会发生什么。如果您有具体问题,请更准确地询问。