Постепенное формирование commit в git

Поделитесь опытом, как вы формируете коммиты для гита. У меня иногда бывает так, что делаю что-то одно, а параллельно что-то исправляю, дополняю (в типах, например). И круто было бы все эти правочки не забыть и записать в коммит. Но вот только иногда забываю некоторые махинации и их суть, хоть и файлы изменённые и высвечиваются. Пробовал записывать в блокнот и оттуда потом копировать, но это как-то не очень разумно будто бы и по-австролопитекски. Может быть команда какая есть, чтобы складировать формирующийся commit.


Ответы (3 шт):

Автор решения: eri

Пиши комментарии в коде. Коммит открывай графической оболочкой. Там смотри diff. Текст комментария переноси в коммит.

Ещё можно в некоторых интерфейсах коммитить исправления отдельными коммитами, выделяя только нужные строки.

→ Ссылка
Автор решения: user7860670

Имеет смысл в начале работы еще до внесения изменений сразу создать пустой коммит-заготовку с сообщением чтобы сразу наметить вектор работ.

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. Подсказка по разным способам манипуляции с коммитами в любом случае доступна текстом в редакторе.

→ Ссылка