Git diff команда документации - PullRequest
3 голосов
/ 01 июля 2019

У меня проблемы с пониманием объяснения команды git diff, приведенной в книге, размещенной на сайте git.

Согласно Pro Git Book , там написано

Эта команда (git diff) сравнивает то, что находится в вашем рабочем каталоге, с тем, что находится в вашей промежуточной области.

.

Из моей работы с git кажется, что git diff сравнивает ваш рабочий каталог с вашим хранилищем . У меня есть файл, который был передан в репо. Я сейчас изменяю этот файл. Без постановки, запуск git status показывает мне файл в Изменения, не подготовленные для фиксации . Теперь, если я запускаю git diff, я получаю разницу в коде между тем, что было в репо, и тем, что находится в рабочем каталоге. Разве я не получу никакого вывода, так как измененный файл даже не был подготовлен?

Что-то не так с моим пониманием в том, что автор пытался передать?

1 Ответ

1 голос
/ 01 июля 2019
  • git diff Просмотр разницы между рабочей и рабочей папками
  • git diff --staged Просмотр разницы между HEAD и Stage
  • git diff HEAD Просмотр разницы между HEAD и рабочим каталогом

Здесь Stage - это помеченные вами изменения для включения в следующий коммит.

Working Directory - это текущий каталог, над которым вы работаете и вносите изменения.

HEAD - это ссылка на последний коммит в текущей извлеченной ветке.

Попробуйте один раз, что может помочь вам разобраться:

Предположим, у меня есть файл test.txt, и у меня есть содержимое Hello в файле, который в данный момент находится в моем хранилище. Теперь я изменяю файл и добавляю World и делаю git status:

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   test.txt

И когда я проверяю git diff, он показывает что-то вроде этого:

--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-Hello
+Hello World

Теперь, если я создаю этот файл и проверяю git status:

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   test.txt

Теперь я заметил, что забыл добавить восклицательный знак к тексту, поэтому добавляю его и снова проверяю git status:

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   test.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   test.txt

Таким образом, вы можете видеть, что у нас есть один и тот же файл в промежуточной и неподготовленной областях. И когда я проверяю git diff, это показывает мне это:

--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-Hello World
+Hello World!

Мы изменили Hello World, который сейчас находится в стадии подготовки, на Hello World!, поэтому он сравнивается с областью подготовки. А теперь, если я проверю git diff --staged:

--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-Hello
+Hello World

Сравнивает staged изменения с HEAD (последний коммит). Поскольку я не поставил изменение !, оно здесь не отображается. И наконец, когда я сделаю git diff HEAD, он покажет это:

--- a/test.txt
+++ b/test.txt
@@ -1 +1 @@
-Hello
+Hello World!

Изменения между HEAD (последним коммитом) и вашим Working Directory. Поскольку HEAD содержит только Hello в файле, а в вашем Working Directory вы изменили его на Hello World! (не имеет значения, что вы не поставили изменение !, он просто будет смотреть файл для изменений, независимо от того, являются ли они постановочными или неустановленными).

Надеюсь, это поможет.

...