Буває, що в одному файлі змішалися дві задачі: виправлення помилки й рефакторинг. 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) дають той самий механізм через галочки біля рядків - під капотом те саме часткове додавання в індекс.