Как распилить одно большое изменение на несколько коммитов?
Создадим три файла:
george@inspiron:~/src/gitadd-p> git init george@inspiron:~/src/gitadd-p> cal > month george@inspiron:~/src/gitadd-p> cal -3 > 3months george@inspiron:~/src/gitadd-p> cal -y > year george@inspiron:~/src/gitadd-p> git add . george@inspiron:~/src/gitadd-p> git commit -a -m "Initial" [master (root-commit) 6b5e406] Initial 3 files changed, 50 insertions(+) create mode 100644 3months create mode 100644 month create mode 100644 year
Общий вид:
Отредактируем эти файлы:
month:
3months:
year:
Что покажет git diff:
george@inspiron:~/src/gitadd-p> git diff
В этом diff-е несколько ханков, каждый начинается (воображаемой) командой diff --git, которая сравнивает два (воображаемых) каталога a (предыдущее состояние) b (текущее). А файлы в этих каталогах настоящие.
Дальше "--- a/" отмечает, как файл назывался раньше, а "+++ b/" — как он называется после изменения (например, его ещё и переименовали при этом)
Затем "@@@" описывает, какие строки файла подверглись изменению (какие откуда удалить и какие куда вставить)
После чего показаны изменившиеся части файла в окружении неизменившихся(т. н. контексте). Контекст нужен для того, чтобы была возможность применить ханк, даже если соответствующие строки находятся в другом месте файла, например, если мы хотим накатить свой коммит на файл, в котором кто-то за это время сделал свои изменения. "--- " означает, что было в старом файле, а "+++ " — что получилось в новом.
Вот здесь приложен получившийся патч в текстовом формате.
Если сейчас закоммитить все эти изменения, получится один коммит, включающий в себя все три файла. Но предположим, что мы хотим разбить изменения на три коммита (выделение даты в одном файле, подчёркивания в двух и осень в другом).