Это не имеет ничего общего с размером. Это связано с тем, как git «видит» и чем вы просите разницу.
Во-первых, есть три места: HEAD (самая последняя фиксация) , индекс (к которому вы add
) и рабочее дерево. Итак, есть две "простые команды сравнения":
git diff
спрашивает о различиях между индексом и рабочим деревом. git diff --cached
спрашивает о различиях между HEAD и индексом.
Во-вторых, то, чего нет в HEAD или индексе, не существует в отношении git; он "неотслеживаемый".
Если файл отслеживается (он находится в индексе или HEAD), то изменения в рабочем дереве, но не в индексе, являются неустановленными . Но если файл не отслеживается, то изменения в рабочем дереве не отслеживаются ; они еще не достигли уровня отсутствия постановки, и они не будут ни в одном виде различий.
Хорошо. Итак, когда вы впервые создаете файл, независимо от того, имеет он размер или нет, он еще не входит в компетенцию git (он не отслеживается), поэтому он не является частью any diff:
$ touch Z # this one has no size
$ echo testing > ZZ # this one has size
$ git diff # (crickets...)
$ git diff --cached # (crickets...)
Затем, когда вы add
этот файл, теперь git знает о нем (он отслеживается). по-прежнему нет разницы между индексом и рабочим пространством, потому что индекс идентичен рабочему пространству; вы только что скопировали эти файлы из второго в первый! Но теперь разница между HEAD и индексом существует :
$ git add .
$ git diff # (crickets...)
$ git diff --cached
diff --git a/Z b/Z
new file mode 100644
diff --git a/ZZ b/ZZ
new file mode 100644
Хорошо, теперь эти файлы находятся под контролем git, потому что они находятся в индексе. Итак, сейчас , если мы внесем изменения в один из них (в рабочем дереве), там будет разница (неустановленная) между индексом и рабочим деревом:
$ echo testing2 >> ZZ
$ git diff
diff --git a/ZZ b/ZZ
--- a/ZZ
+++ b/ZZ
@@ -1 +1,2 @@
testing
+testing2
То же верно и в обратном направлении. Чтобы показать, что я имею в виду, я все добавлю и зафиксирую; теперь нет простого различия, как и ожидалось:
$ git add .
$ git commit -m'xxxx'
$ git diff # (crickets...)
$ git diff --cached # (crickets...)
Теперь я удалю ZZ из индекса с помощью rm
и из HEAD с помощью commit
:
$ git rm --cache ZZ
rm 'ZZ'
$ git commit -m'removed'
Теперь, еще раз, нет разницы между индексом и рабочим деревом, даже если файл ZZ все еще находится в рабочем дереве:
$ git diff # (crickets...)
$ ls
Z ZZ
Это потому, что, поскольку ZZ не дольше в HEAD или в рабочем дереве, он снова не отслеживается; это еще раз не входит в компетенцию git.