Допустим, вы дисциплинированный и аккуратный программист. Все правки кода строго привязываете к задачам и ничего лишнего и не относящегося к задаче в коммит не попадает. Но как быть, если в файл были внесены правки относящиеся сразу к нескольким задачам? Можно ли теперь изменения одного файла разделить на несколько коммитов? Можно:
git add -p
Также можно указать конкретный файл:
git add -p src/script.php
Далее в интерактивном режиме будут показываться куски кода и задаваться вопрос, что с этим делать. Доступны следующие действия:
y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
Как правило будет достаточно y, n, s и e. Особенно интересен вариант с e, при выборе которого открывается текстовый редактор с возможностью вручную отредактировать фрагмент, который попадёт в коммит.