Понимание того, что делает git diff - PullRequest
0 голосов
/ 16 июня 2020

Я прочитал на странице руководства для git diff, что он должен возвращать «изменения в рабочем дереве, еще не подготовленные для следующего коммита». Если я понял, что такое рабочее дерево (это должна быть ваша локальная рабочая папка репозитория git), когда я добавляю новый файл в свой рабочий каталог, я должен увидеть, что он возвращается git diff, но ничего не возвращает. Что я не получаю?

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Это не имеет ничего общего с размером. Это связано с тем, как 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.

1 голос
/ 17 июня 2020

Как только вы добавляете файл (например, I add it to index, что мы обычно подразумеваем, когда говорим, что добавляем что-то по отношению к git), он переходит в статус staged for next commit, поэтому он будет go от git diff по умолчанию . Однако он все равно будет виден, если вы попробуете git diff HEAD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...