Как в git изменить комментарий к коммиту?
Рабочий процесс в системе контроля версий git сводится к тому, что разработчик создает от ветки develop новую ветку для реализации конкретной задачи. Принято, что в ветке каждому коммиту соответствует более-менее логически законченная единица работы или же изменения, которые в будущем может потребоваться отменить.
Однако порой в спешке под конец рабочего дня разработчик может закоммититься с подписью вроде такой «WIP» или «TMP». В статье рассмотрим, как в git переименовать коммит. При этом возможны два основных случая — коммит является последним или коммит не является последним.
Переименование последнего коммита
На следующий день разработчик приходит на работу, просматривает изменения в ветке и вспоминает, что нужно изменить комментарий к коммиту. Для этого достаточно использовать команду git commit --amend -m "Новое название коммита"
.
Изменение комментария к не последнему коммиту
Допустим разработчик забыл с утра откорректировать название коммита, и в течение дня сделал ещё несколько коммитов. Тогда встаёт вопрос, как обновить комментарий, например для четвёртого коммита вглубь истории.
Итак, чтобы в git исправить комментарий такого коммита потребуется выполнить rebase в интерактивном режиме.
1. Сначала нужно посмотреть, на сколько коммитов назад находится тот коммит, которые нужно отредактировать. Для этого можно использоваться либо git log --oneline
, либо консольный GUI для Git, например, tig.
Видим, что изменить комментарий нужно к коммиту «tmp», находящийся позади на четыре коммита относительно HEAD.
2. Теперь запускаем rebase в интерактивной режиме:
git rebase -i HEAD~5
3. В появившемся редакторе следует в строках коммитов изменить команду pick
на reword
.
Затем сохраняем файл и выходим.
4. Автоматически начнется ребейз и откроется файл редактирования коммита. Здесь необходимо ввести новую подпись к коммиту.
5. Остаётся сохранить и выйти. Теперь название коммита изменено.
Важно. Оба описанных способа приводят к изменению коммитов, а значит коммиты на сервере и в локальной ветке будут теперь отличаться. Поэтому запушить ветку так просто не получится — нужно использовать флаг --force
.
git push --force
Однако, если работа в ветке ведётся несколькими разработчиками одновременно, тогда такой подход неприемлем.
Однако, если работа в ветке ведётся несколькими разработчиками одновременно, тогда такой подход неприемлем.
—
А какой будет приемен, в таком случае?
Здесь имелось ввиду, что если вы хотите переименовать коммиты, которые другие разработчики команды уже спулили себе. Когда вы внесёте изменения и запушите их с помощью force, то при следующем получении обновлений у остальных возникнут конфликты. Если же обновления ещё никто не забрал, тогда вы смело можете быстро запушить с force, предварительно проверив, не успел ли кто-то добавить коммиты, просто сделав git fetch.
При командной разработке есть несколько вариантов:
1. Сообщить всем, что сейчас вы хотите поменять историю. После того, как вы запушите изменения, всем членам команды нужно будет обновить актуальное состояние ветки либо путём git pull —force, либо откатиться на N коммитов с помощью git reset —hard HEAD~N и спулить актуальную версию. Всё это будет вполне нормально, если другие разработчики не успели за это время закоммитить в эту ветку свой код. В таком случае разрешать конфликты гораздо сложнее, поэтому более легким выходом станет перенести разработку в новую ветку.
2. Вы вносите изменения как написано в статье, а затем переименовываете её git branch -m branch-old branch-new. Далее пушим новую ветку и сообщаем другим членам команды, что разработка фичи переехала в новую ветку и все свои коммиты, начиная с такого-то hash_commit следует перенести в неё. Делается это с помощью команды git cherry-pick hash_commit, с помощью неё можно перенести сразу несколько коммитов (можно посмотреть тут http://paratapok.ru/developer-tools/2593_kak-v-git-perenesti-commit-iz-odnoj-vetki-v-druguyu/). Таким образом, начиная работу в новой ветке вы сможете избежать возникновение конфликтов.