Пошук уроків, статей та іншого контенту
Порівнюйте робочу директорію, індекс і commit за допомогою git diff та його основних опцій.
git diffgit diff показує відмінності між різними станами файлів у Git. За його допомогою можна перевірити:
що змінилося у робочій директорії;
які зміни вже додано до індексу;
що зміниться порівняно з останнім комітом;
чим відрізняються два коміти.
Це особливо корисно перед git add і git commit, щоб випадково не зберегти неправильні зміни.
Під час роботи з Git файл може перебувати у трьох важливих станах:
Робоча директорія — поточний стан файлів, які ви редагуєте.
Індекс — зміни, підготовлені командою git add.
Commit — збережений знімок проєкту в історії Git.
Основні порівняння мають такий вигляд:
робоча директорія ← git diff → індекс
індекс ← git diff --staged → останній commit
робоча директорія ← git diff HEAD → останній commitКоманда без аргументів:
git diffпорівнює робочу директорію з індексом. Вона показує зміни, які ще не додані командою git add.
Наприклад, якщо файл app.js було змінено:
diff --git a/app.js b/app.js
index 1234567..abcdefg 100644
--- a/app.js
+++ b/app.js
@@ -1,3 +1,4 @@
const name = "Анна";
+console.log(name);Основні позначення:
рядок із + додано;
рядок із - видалено;
--- позначає стару версію файлу;
+++ позначає нову версію файлу;
рядок @@ показує фрагмент файлу, у якому відбулася зміна.
git diff не показує нові невідстежувані файли. Git не порівнює їх із попереднім станом, поки вони не будуть додані до індексу.
Після виконання:
git add app.jsзміни потрапляють до індексу. Щоб переглянути саме їх, використовуйте:
git diff --stagedТакож можна використати скорочений варіант:
git diff --cachedОбидві команди показують різницю між:
індексом;
останнім commit.
Це перевірка, яку варто виконувати перед створенням commit:
git add app.js
git diff --staged
git commit -m "Add greeting output"Якщо після git add ви знову зміните файл, ці нові зміни не потраплять до вже підготовленої версії. Тоді:
git diff покаже нові непідготовлені зміни;
git diff --staged покаже попередньо підготовлені зміни.
Щоб побачити всі зміни у робочій директорії порівняно з останнім commit, виконайте:
git diff HEADHEAD — це посилання на поточний commit, зазвичай останній commit активної гілки.
На відміну від git diff, команда git diff HEAD враховує:
зміни, які ще не додані до індексу;
зміни, які вже додані до індексу.
Тобто вона показує повну різницю між поточним станом файлів і останнім commit.
Наведена послідовність створює невеликий репозиторій і демонструє різні варіанти git diff:
mkdir git-diff-example
cd git-diff-example
git init
git config user.name "Example User"
git config user.email "example@example.com"
printf 'const message = "Привіт";\n' > app.js
git add app.js
git commit -m "Add initial app"
printf 'const message = "Вітаю";\n' > app.js
git diff
git add app.js
git diff --staged
printf 'console.log(message);\n' >> app.js
git diff
git diff --staged
git diff HEADПісля виконання команд:
перший git diff покаже зміну "Привіт" на "Вітаю";
git diff --staged покаже цю саму зміну після git add;
другий git diff покаже доданий рядок console.log(message);;
наступний git diff --staged покаже лише зміну, яка вже була додана до індексу;
git diff HEAD покаже обидві зміни порівняно з останнім commit.
Щоб переглянути зміни лише одного файлу, передайте його шлях:
git diff -- app.jsРоздільник -- повідомляє Git, що все після нього є шляхом до файлу, а не параметром команди.
Для підготовлених змін:
git diff --staged -- app.jsДля порівняння з останнім commit:
git diff HEAD -- app.jsЦе зручно у великих проєктах, коли не потрібно переглядати зміни в усіх файлах.
Щоб порівняти два commit, передайте їхні ідентифікатори:
git diff a1b2c3d d4e5f6aGit покаже, чим другий commit відрізняється від першого.
Повні ідентифікатори commit можна переглянути командою:
git log --onelineНаприклад:
d4e5f6a Add validation
a1b2c3d Add initial formТоді порівняння можна виконати так:
git diff a1b2c3d d4e5f6aПорядок важливий:
git diff старіший_commit новіший_commitЯкщо поміняти commit місцями, додані рядки стануть видаленими, а видалені — доданими.
git diff --statКоманда показує для кожного файлу:
кількість змінених рядків;
кількість доданих рядків;
кількість видалених рядків.
Для підготовлених змін:
git diff --staged --statgit diff --name-onlyДля змін в індексі:
git diff --staged --name-onlyЦе корисно, коли потрібно швидко дізнатися, які файли були змінені, без перегляду самого вмісту.
git diff --checkКоманда допомагає знайти поширені проблеми, наприклад:
пробіли наприкінці рядків;
зайві пробіли в порожніх рядках.
Для підготовлених змін:
git diff --staged --checkДля змін у тексті іноді зручніше бачити відмінності між словами:
git diff --word-diffЗамість повністю змінених рядків Git позначає змінені фрагменти всередині рядка.
Команда git diff не показує файл, який ще не відстежується Git:
printf 'Нова інформація\n' > notes.txt
git diffУ цьому випадку notes.txt не з’явиться у виведенні git diff.
Спочатку додайте файл до індексу:
git add notes.txt
git diff --stagedТепер Git покаже його як новий файл. У diff його вміст буде позначений доданими рядками.
Якщо ви не хочете залишати файл підготовленим до commit, приберіть його з індексу:
git restore --staged notes.txtПісля цього файл залишиться у робочій директорії, але більше не буде підготовлений до commit.
Перед створенням commit зручно виконати такі команди:
git status
git diff
git diff --staged
git diff --staged --checkВони допомагають відповісти на різні запитання:
git status — які файли змінилися та які підготовлені;
git diff — які зміни ще не підготовлені;
git diff --staged — що саме потрапить до commit;
git diff --staged --check — чи немає проблем із пробілами.
Якщо до commit потрібно додати всі актуальні зміни, спочатку виконайте:
git add .
git diff --staged
git commit -m "Describe the changes"Перевірка через git diff --staged важлива: команда git add . може додати більше файлів, ніж ви очікували.
git diff після git addПісля команди:
git add app.jsкоманда:
git diffможе нічого не показати. Це не означає, що зміни зникли. Вони вже перебувають в індексі.
Для їх перегляду використовуйте:
git diff --stagedgit diff і git diff HEADgit diff показує лише непідготовлені зміни;
git diff HEAD показує всі зміни порівняно з останнім commit.
git diff покаже нові файлиНевідстежувані файли не потрапляють у результат git diff. Їх потрібно спочатку додати:
git add new-file.txt
git diff --stagedПоточний commit позначається як HEAD. Якщо потрібно порівняти два конкретні commit, вказуйте їх явно:
git diff first-commit second-commitТак результат буде однозначним.
Команда:
git add .може підготувати всі зміни в поточній директорії. Перед commit обов’язково перевірте:
git diff --stagedgit diff показує зміни між робочою директорією та індексом.
git diff --staged або git diff --cached показує підготовлені зміни порівняно з останнім commit.
git diff HEAD показує всі поточні зміни порівняно з останнім commit.
git diff <commit1> <commit2> порівнює два commit.
git diff -- <file> обмежує перегляд одним файлом.
--stat показує коротку статистику.
--name-only показує лише імена змінених файлів.
--check знаходить проблеми з пробілами.
Перед git commit варто перевірити саме git diff --staged.