【发布时间】:2015-08-13 18:29:13
【问题描述】:
在很长一段时间里,我认为 git 提交会保留更改文件的差异,而不是副本。我能找到的任何信息都相反。我做了一个小实验:
$ git init
$ subl wtf
这里我创建了一个99999行的文件,每一行都是foo bar baz #line
$ ls -la
total 1760
drwxrwxr-x 3 __user__ __user__ 4096 Aug 13 21:02 .
drwxr-xr-x 3 __user__ __user__ 4096 Aug 13 19:57 ..
drwxrwxr-x 7 __user__ __user__ 4096 Aug 13 21:02 .git
-rw-rw-rw- 1 __user__ __user__ 1788875 Aug 13 21:02 wtf
$ git add --all
$ git commit -m 'Initial commit'
[master (root-commit) 6ef5084] Initial commit
1 file changed, 99999 insertions(+)
create mode 100644 wtf
$ subl wtf
$ git diff
diff --git a/wtf b/wtf
index 7ba3acb..bf7a9ed 100644
--- a/wtf
+++ b/wtf
@@ -14156,7 +14156,7 @@ foo bar baz 14155
foo bar baz 14156
foo bar baz 14157
foo bar baz 14158
-foo bar baz 14159
+foo qux baz 14159
foo bar baz 14160
foo bar baz 14161
foo bar baz 14162
$ git add --all
$ git commit -m 'bar -> qux on #14159'
[master 1b5ab4b] bar -> qux on #14159
1 file changed, 1 insertion(+), 1 deletion(-)
$ subl wtf
$ git diff
diff --git a/wtf b/wtf
index bf7a9ed..1aeeaa3 100644
--- a/wtf
+++ b/wtf
@@ -14156,7 +14156,7 @@ foo bar baz 14155
foo bar baz 14156
foo bar baz 14157
foo bar baz 14158
-foo qux baz 14159
+xyz abc baz 14159
foo bar baz 14160
foo bar baz 14161
foo bar baz 14162
$ git add --all
$ git commit -m 'foo qux -> xyz abc on #14159'
[master 85ccf97] foo qux -> xyz abc on #14159
1 file changed, 1 insertion(+), 1 deletion(-)
$ ls -la
total 1760
drwxrwxr-x 3 __user__ __user__ 4096 Aug 13 21:02 .
drwxr-xr-x 3 __user__ __user__ 4096 Aug 13 19:57 ..
drwxrwxr-x 9 __user__ __user__ 4096 Aug 13 21:05 .git
-rw-rw-rw- 1 __user__ __user__ 1788875 Aug 13 21:04 wtf
即使在有冲突的不同分支上提交也没有改变这种情况。
如果 git 真的在每次提交时都保留所有更改文件的副本,为什么使用的空间没有显着变化?
【问题讨论】:
-
Pro Git 这本书有一个interesting chapter,它非常详细地解释了 Git 如何存储跟踪的数据。