Пошук уроків, статей та іншого контенту
Порівняєте робоче дерево, Staging Area та коміти, щоб точно побачити, які рядки було змінено.
git diffУ Git зміни можуть перебувати в різних місцях:
Робоче дерево (Working Tree) — файли, які ви зараз редагуєте.
Staging Area — зміни, підготовлені до наступного коміту.
Коміт — збережений знімок стану проєкту.
Команда git diff показує різницю між цими станами. Важливо правильно вказати, що саме потрібно порівняти.
Схема взаємодії:
Робоче дерево ── git diff ──> Staging Area ── git diff --staged ──> HEADЗвичайна команда:
git diffВона показує зміни у відстежуваних файлах, які:
вже були змінені у робочому дереві;
ще не додані до Staging Area.
Наприклад, якщо після останнього git add ви змінили рядок, git diff покаже саме цю зміну.
-Зустріч
+Зустріч командиЗнак - позначає рядок, який було вилучено, а + — доданий рядок.
Рядки без знака на початку — це контекст навколо зміни. Він допомагає зрозуміти, де саме у файлі відбулася зміна.
# Переглянути зміни, які ще не додано до Staging Area
git diffЯкщо команда нічого не вивела, це означає, що між робочим деревом і Staging Area немає відмінностей.
Щоб переглянути зміни, які вже додано командою git add, використовуйте:
git diff --stagedТакож можна записати:
git diff --cached--staged і --cached у цьому випадку є еквівалентними.
Команда порівнює:
Staging Area;
останній коміт, на який вказує HEAD.
Staging Area ── git diff --staged ──> HEADЦе корисно перед комітом: команда показує, які саме зміни потраплять до нього.
git add notes.md
git diff --stagedЯкщо після git add ви знову зміните notes.md, то:
git diff покаже нові зміни, які ще не додано;
git diff --staged покаже попередні зміни, які вже перебувають у Staging Area.
Команда:
git diff HEADпоказує всі зміни у відстежуваних файлах порівняно з останнім комітом:
зміни у робочому дереві;
зміни у Staging Area.
Робоче дерево ── git diff HEAD ──> HEADЦе зручно, коли потрібно побачити весь результат поточної роботи перед комітом.
git diff HEADне показує невідстежувані файли. Їх потрібно спочатку додати до індексу за допомогоюgit add, якщо ви хочете побачити їх як частину майбутнього коміту.
Нижче наведено послідовність команд, яка демонструє всі три основні варіанти порівняння.
mkdir git-diff-demo
cd git-diff-demo
git init
git config user.name "Demo User"
git config user.email "demo@example.com"
# Створюємо початковий файл
printf "Зустріч\nЗвіт\n" > notes.md
# Додаємо файл і створюємо перший коміт
git add notes.md
git commit -m "Додати початкові нотатки"
# Змінюємо перший рядок і додаємо зміну до Staging Area
printf "Зустріч команди\nЗвіт\n" > notes.md
git add notes.md
# Додаємо ще одну зміну, але залишаємо її поза Staging Area
printf "План на п'ятницю\n" >> notes.md
# Показуємо зміни між робочим деревом і Staging Area
git diff
# Показуємо зміни між Staging Area та останнім комітом
git diff --staged
# Показуємо всі зміни порівняно з останнім комітом
git diff HEADУ цьому прикладі:
git diff покаже доданий рядок План на п'ятницю;
git diff --staged покаже заміну Зустріч на Зустріч команди;
git diff HEAD покаже обидві зміни.
git diff може порівнювати не лише робоче дерево та Staging Area, а й два коміти:
git diff <перший-коміт> <другий-коміт>Наприклад:
git diff HEAD~1 HEADТут:
HEAD — поточний останній коміт;
HEAD~1 — коміт безпосередньо перед ним.
Команда покаже, що змінилося між цими двома комітами.
Порівняти коміти можна також за їхніми ідентифікаторами:
git diff a1b2c3d d4e5f6aТочні ідентифікатори комітів можна переглянути командою:
git log --onelineПісля створення нового коміту можна переглянути його зміни так:
git diff HEAD~1 HEADЦе корисно для перевірки вмісту вже створеного коміту.
Щоб не переглядати зміни в усьому проєкті, вкажіть шлях до файлу після --:
git diff -- notes.mdПорівняти файл у Staging Area з останнім комітом:
git diff --staged -- notes.mdПорівняти файл з останнім комітом:
git diff HEAD -- notes.mdРоздільник -- повідомляє Git, що після нього вказано шлях до файлу, а не назву гілки чи іншого об’єкта.
Іноді повний diff занадто великий. Для перегляду кількості змінених рядків використовуйте:
git diff --statПриклад результату:
notes.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)Для змін у Staging Area:
git diff --staged --statЩоб отримати лише список змінених файлів:
git diff --name-onlyА для підготовлених змін:
git diff --staged --name-onlyЦі варіанти не показують самі рядки, а лише коротку інформацію про зміни.
git diffТиповий фрагмент результату має такий вигляд:
diff --git a/notes.md b/notes.md
index 1234567..89abcde 100644
--- a/notes.md
+++ b/notes.md
@@ -1,2 +1,2 @@
-Зустріч
+Зустріч команди
ЗвітОсновні частини:
--- a/notes.md — попередній стан файлу;
+++ b/notes.md — новий стан файлу;
- на початку рядка — вилучений рядок;
+ на початку рядка — доданий рядок;
рядок без + або - — контекст;
@@ ... @@ — інформація про ділянку файлу, у якій є зміни.
Коли рядок було змінено, Git зазвичай показує це як вилучення старого рядка та додавання нового.
Перед створенням коміту зручно виконати такі команди:
# Переглянути зміни, які ще не додано
git diff
# Переглянути зміни, підготовлені до коміту
git diff --staged
# Переглянути короткий список підготовлених змін
git diff --staged --statПісля перевірки можна створити коміт:
git commit -m "Оновити нотатки"git diff покаже всі зміниЗвичайний git diff не показує зміни, які вже перебувають у Staging Area.
Якщо ви виконали:
git add notes.md
git diffі не побачили результату, це не означає, що зміни зникли. Вони вже підготовлені до коміту. Використайте:
git diff --stagedgit diff --staged, коли потрібні незбережені зміниgit diff --staged показує лише зміни між Staging Area та останнім комітом. Зміни, зроблені після git add, ця команда не покаже.
Для них використовуйте:
git diffНовий файл, який ще не додано до Git, не потрапляє до звичайного результату git diff.
Перевірити його наявність можна командою:
git statusПісля додавання файла:
git add new-file.txt
git diff --stagedйого вміст стане частиною підготовлених змін.
git diff HEAD і git diff --stagedgit diff --staged показує лише підготовлені зміни;
git diff HEAD показує підготовлені та непідготовлені зміни разом.
git diff порівнює робоче дерево зі Staging Area.
git diff --staged порівнює Staging Area з останнім комітом.
git diff HEAD показує всі зміни відносно останнього коміту.
git diff <commit-1> <commit-2> порівнює два коміти.
Щоб обмежити результат одним файлом, використовуйте -- шлях/до/файлу.
git diff --stat показує коротку статистику, а git diff --name-only — лише назви змінених файлів.
Невідстежувані файли не відображаються у git diff, доки їх не додано до Staging Area.