Краткий обзор команды git diff
Итак, продолжаю знакомиться с системой Git и на этот раз вопрос будет касаться команды
. Это краткая заметка, которая ни в коей мере не претендует на полноценный обзор. Скорее всего - философское рассуждение на тему сравнения в Git.1
git diff
С помощью этой команды в Git можно сравнивать между собой файлы для того, чтобы увидеть - где произошло изменение.
Когда изменение обнаружено, тогда можно решать, что с ним делать - оставить, удалить или отредактировать.
Перед использованием команды
стоит напомнить о трех состояниях системы Git: Working Area, Staging Area, Repository. Фактически, команда 1
diff
производит сравнение между разными состояниями одного файла.1
diff
Поэтому, когда запускается команда
, следует принимать во внимание, что и с чем будет сравниваться.1
diff
Working Area
Рассмотрим первый случай, когда имеется отслеживаемый файл
, в который вносятся изменения.1
index.html
Но изменения в этом файле не индексируются (
) и не фиксируются (1
git add
).1
git commit
В этом случае, чтобы увидеть изменения, нужно запустить команду:
В этом случае производится сравнение между фиксированной версией файла
(в области Repository) и его измененной версией (в области Working Area).1
index.html
Вывод будет примерно таким:
В этом примере все предельно ясно и понятно. Строка
- это фиксированная версия файла 1
--- a/index.html
. Строка 1
index.html
- это измененная версия файла 1
+++ b/index.html
.1
index.html
Две строки:
… отображают, сколько и каких строк удалено (знак минус); сколько и каких строк добавлено (знак плюс).
Итак, с первым вариантом разобрались. Комадна
выполняет сравнение версии файла из области Repository и этой же версии из области Working Area.1
git diff
Staging Area
Второй вариант - файл
отслеживается, в него внесено изменение, которое проиндексировано (внесено в область Staging Area).1
index.html
Команда
ничего не покажет, так как изменения в файле 1
git diff
были перенесены (1
index.html
) из области Working Area в область Staging Area. Другими словами, область Working Area чистая и в ней нет ничего, чтобы можно было сравнить с областью Repository.1
git add
В этом случае для команды
необходимо добавить ключ 1
git diff
. Тогда вывод будет примерно таким:1
--staged
Ключ
указывает, что необходимо сравнивать область Repository с областью Staging Area.1
--staged
Итак, разобрались со вторым случаем. Команда
производит сравнение области Repository с областью Staging Area.1
git diff --staged
Repository
Третий вариант - файл
отслеживается, в него внесены изменения, которые проиндексированы (1
index.html
) и зафиксированы (1
git add
).1
git commit
В этом случае область Working Area и Staging Area чистые от изменений, поэтому область Repository нельзя сравнивать с ними - там нет ничего для сравнения.
Поэтому команда
или 1
git diff
ничего не покажет - сравнивать то не с чем!1
git diff --staged
Так как все изменения зафиксированы и перенесены в область Repository, то и сравнивать их между собой нужно только там, в этой области.
В этом случае команда сравнения
будет выглядеть примерно таким образом:1
git diff
Здесь
- это первые семь символов hash-суммы последнего commit’а, 1
0644c20
- первые семь символов hash-суммы предпоследнего commit’а.1
73a4c4c
Их можно получить командой:
Другими словами, в этом случае сравниваются между собой различные коммиты. И это могут быть совсем не обязательно соседние коммиты - можно сравнить, к примеру, первый и последний коммиты.
Итак, разобрались с третим вариантом - когда сравниваются командой
между собой различные коммиты, расположенные в области Repository.1
git diff hash_sum_1 hash_sum_2
На этом все.