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