Команди Git

git diff

git diff: показати різницю (difference) між комітами, гілками, файлами або робочою директорією.

Команда git diff показує різницю між різними станами твого репозиторію Git: наприклад, між робочою директорією та областю підготовки або між двома комітами. Так видно, що саме змінилося. Це зручно, щоб переглянути роботу перед комітом або розібратися в історії проєкту.

За замовчуванням git diff показує різницю між робочою директорією та областю підготовки. Так можна побачити внесені зміни, які ще не підготовлено до коміту. Також через git diff можна порівнювати конкретні файли, гілки або коміти.

git diff особливо корисний, коли треба:

  • Переглянути внесені зміни перед додаванням в область підготовки або комітом.
  • Порівняти різні версії проєкту й побачити, як він розвивався з часом.
  • Знайти конкретні рядки коду, змінені в певному коміті.
  • Зрозуміти різницю між гілками перед їх злиттям.

Коли вивід git diff не вміщується на одному екрані, термінал перейде в режим pager — він створений для перегляду довгих списків. У цьому режимі вивід можна гортати стрілками і на клавіатурі (або клавішами PageUp і PageDown, щоб гортати швидше). Щоб вийти з режиму pager, натисни q.

Приклади

Показати всі непідготовлені зміни в робочій директорії:

git diff

Показати всі підготовлені зміни (тобто зміни, готові до коміту):

git diff --staged

Показати зміни між двома комітами:

git diff 1234abc 5678def

Показати зміни між двома гілками:

git diff main feature-branch

Показати зміни в конкретному файлі між двома гілками. Зверни увагу: спеціальна опція -- каже Git, що всі наступні аргументи — це шляхи до файлів. Вона потрібна, щоб уникнути неоднозначності, коли шлях до файлу можна сплутати з гілкою або комітом:

git diff main feature-branch -- path/to/file.js

Як читати вивід

Уявімо, що у файл index.html додано кілька нових тегів і змінено один наявний. Ось як може виглядати вивід команди git diff:

Результат:
diff --git a/index.html b/index.html
index 1c2s3z5..4f5g6h7 100644
--- a/index.html
+++ b/index.html
@@ -8,1 +8,3 @@
-<h1>Old header</h1>
+<h2>New header</h2>
+
+<p>New text.</p>

Такий формат виводу називається патч (англ. patch означає латку): він показує, що саме змінилося у файлі. За іронією, хоч вивід і задуманий як зрозумілий людині, цей формат придумали в 1970-х, тож він не такий інтуїтивний, як сучасні інтерфейси. Спершу він може здатися шифровкою, але в ньому є система. Ось як його читати:

  • Перший рядок показує, що diff порівнює дві версії файлу index.html.
  • Другий рядок — внутрішні метадані Git. Для розуміння змін у файлі вони не важливі.
  • Рядки --- і +++ зі шляхами до файлів показують, чому відповідають рядки з - та +.
  • Рядок @@ показує номери рядків для змін у старій і новій версіях файлу.
  • Рядки з префіксом - видалено в новій версії.
  • Рядки з префіксом + додано в новій версії.
  • Незмінені рядки показано для контексту, префікса вони не мають.

Цей вивід каже нам, що:

  • Файл index.html змінився — це видно зі шляхів у перших рядках.
  • Рядок <h1>Old header</h1> видалено.
  • Замість нього з'явився новий рядок <h2>New header</h2>.
  • Внизу додано новий блок <p>New text.</p> — це видно з рядка, що починається з +.

Такий патч-файл може містити кілька змін в одному файлі — кожну відділяє рядок @@. Також він може охоплювати кілька файлів.