Постепенное формирование commit в git
Поделитесь опытом, как вы формируете коммиты для гита. У меня иногда бывает так, что делаю что-то одно, а параллельно что-то исправляю, дополняю (в типах, например). И круто было бы все эти правочки не забыть и записать в коммит. Но вот только иногда забываю некоторые махинации и их суть, хоть и файлы изменённые и высвечиваются. Пробовал записывать в блокнот и оттуда потом копировать, но это как-то не очень разумно будто бы и по-австролопитекски. Может быть команда какая есть, чтобы складировать формирующийся commit.
Ответы (3 шт):
Пиши комментарии в коде. Коммит открывай графической оболочкой. Там смотри diff. Текст комментария переноси в коммит.
Ещё можно в некоторых интерфейсах коммитить исправления отдельными коммитами, выделяя только нужные строки.
Имеет смысл в начале работы еще до внесения изменений сразу создать пустой коммит-заготовку с сообщением чтобы сразу наметить вектор работ.
git commit --allow-empty -m "my commit"
А затем по мере внесения правок инкрементально дополнять его, править сообщение и т.п. При выполнении этой команды откроется тектовый редактор, где можно все подредактировать.
git commit --amend
Когда возникает желание записать что-то в блокнот, и добавить это позже, не смешивая с основной задачей, то без разделения по коммитам, конечно же не обойтись. Решить это можно разными способами, например:
Помещать в индекс фиксы, которые предполагалось записать в блокнот, и продолжить работу над основной задачей. Для частичного (поблочного) помещения изменений в индекс существует команда
git add -p
. Её можно вызвать как для отдельного файла, так и для группы файлов. Например, чтобы затронуть все файлы в текущей папке можно выполнить следующееgit add -p .
. Это приведёт к интерактивному выбору блоков изменённого текста, которые предполагается добавить в индекс. В этом режиме есть несколько вариантов:- добавить блок и перейти к следующему или остановиться на этом
- разбить блок на более мелкие части
- пропустить блок и продолжить рассматривать следующие блоки
- и т.п.
После этого можно сформировать коммит из данных в индексе git commit -m "Some other changes beside main job"
и продолжить работу над основной задачей. Каждый самодостаточный фикс можно помещать таким образом в отдельный коммит.
- Вносить изменения в другой ветке и не затрагивать этими изменениями текущую ветку. Для этого имеет смысл создать отдельное рабочее пространство командой
git worktree add
. И делать там исключительно то, что хотелось записать в блокнот, в обычном режиме создавая коммиты. Созданные таким образом коммиты в дальнейшем можно поместить в основную ветку при помощиgit cherry-pick
.
Когда работа над основной задачей закончена (имеется в виду локально) и все мелкие изменения (из "блокнота") реализованые в отдельных коммитах в текущей ветке, можно выполнить склеивание "squash" коммитов и их перегрупирование если необходимо. Для этого хорошо подходит команда git rebase -i
в интерактивном режиме. В редакторе можно расположить коммиты в желаемом порядке (просто перемещая строки вверх/вниз), смежные коммиты можно объединить, заменив pick
на squash
(или просто s
), в коммитах, которые объединяются с предыдущим (строками выше), помеченным как pick
. При объединении коммитов откроется редактор, где можно переформулировать сообщение объединённого коммита. Для переписывания сообщения отдельного коммита следует выбрать reword
. Подсказка по разным способам манипуляции с коммитами в любом случае доступна текстом в редакторе.