Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Як закомітити лише частину змін у файлі за допомогою git add -p?

Буває, що в одному файлі змішалися дві задачі: виправлення помилки й рефакторинг. git add -p (--patch) дозволяє додати в індекс лише окремі фрагменти (hunks) змін і зробити з них два чисті коміти.

git add -p app/Services/InvoiceService.php

Git показує кожен фрагмент і питає, що з ним робити:

@@ -42,7 +42,7 @@ public function total(): int
-        return $this->lines->sum('price');
+        return $this->lines->sum(fn ($line) => $line->price * $line->quantity);
(1/3) Stage this hunk [y,n,q,a,d,s,e,?]?

Основні відповіді:

Клавіша Дія
y / n додати / пропустити фрагмент
s розбити фрагмент на менші (якщо між змінами є незмінені рядки)
e відредагувати фрагмент вручну - для змін у сусідніх рядках
a / d додати / пропустити всі решта фрагменти файлу
q вийти

Типовий процес:

git add -p                         # обрати фрагменти виправлення
git diff --staged                  # перевірити, що в індексі
git commit -m "Fix invoice total for multiple quantities"
git add -p                         # тепер рефакторинг
git commit -m "Extract line total calculation"

Той самий режим є в інших командах:

  • git restore -p - відкинути частину змін у робочому каталозі;
  • git restore --staged -p - прибрати частину з індексу;
  • git stash push -p - відкласти лише вибрані фрагменти;
  • git commit -p - обрати фрагменти й одразу закомітити.

Про що пам'ятати:

  • нові файли add -p не показує, бо Git їх ще не відстежує. Спершу git add -N файл (intent-to-add) - тоді вміст з'явиться як фрагменти;
  • проміжний стан може не працювати: закомічена половина змін не перевірялася окремо. Перед пушем корисно прогнати тести на кожному коміті чи хоча б на останньому;
  • IDE (PhpStorm, VS Code) дають той самий механізм через галочки біля рядків - під капотом те саме часткове додавання в індекс.

Докладніше в документації: git add: інтерактивний режим

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання