Вы встречались с проблемой, когда вы пишите много кода, нажимаете коммит и не знаете как сформулировать комментарий? Такое случается, когда во время кодинга было сделано несколько подзадач, еще рефакторинг, еще code cleanup небольшой и т.п. Приходится писать либо очень большой комментарий, либо опустить руки и написать «fixes» или «big changes» или подобный комментарий, который ничего не значит. При работе в команде такие комментарии наносят большой вред, т.к. становится сложно понять, что происходит с кодом:
Когда мы уже знаем, что такое хороший коммит, можно еще эффективнее использовать DVCS. Для этого предлагаю модифицировать рабочий процесс.
Пример я буду показывать на TortoiseHg, но тоже самое было опробовано и на TortoiseGit. Я думаю, что конкретная реализация интерфейса DVCS не должна вызывать сложность.
- Для начала открываем Workbench и пишем комментарий на задачу, которую мы сделаем за ближайшие 10-30 минут. Здесь надо привыкнуть писать комментарий в прошедшем времени, как будто задачу уже реализовали:
- Переходим в IDE и начинаем печатать код
- Когда задача реализована, возвращаемся в Workbench, комментарий к коммиту у нас уже есть, обновляем список измененных файлов и жмем коммит:
Получается, что мы сначала пишем комментарий к будущим изменениям, потом эти изменения делаем.
Плюсы
- Делаем только одну задачу. Захотели порефакторить или отвлечься? Уже нельзя, коммитом четко обозначена небольшая задача;
- Моделируем будущее у себя в сознании и думаем как бы быстрее до него дойти;
- Когда вы привыкните работать в таком стиле, то без готового комментария уже будете испытывать дискомфорт, появится стремление написать себе мини-задачу;
- Очень частые коммиты (не буду объяснять почему это хорошо);
- Если вы отвлеклись, то легко вернуться в поток, прочитав мини-задачу, которую в данный момент решаем;
- Равномерная нагрузка в течение дня. Мы ставим маленькие задачи и получаем постоянные легкие «победы» после их завершения.
Минусов нет, это отлично работает для обычных повседневных задач, когда можно декомпозировать большую User Story. Есть единственное ограничение: если вы будете работать с VCS (VSS, SVN и т.п.), то вам нужно будет использовать feature branching, иначе не получится делать такие маленькие коммиты.
Это работа с DVCS в духе TDD, когда мы сначала ставим перед собой маленькую легкодостижимую задачу и в рамках нее двигаемся. Получается задача и быстрый результат, движение маленькими шажками.
Опробовано на нескольких проектах в нашей компании, приводит к крайне положительным результатам.
К единовременному минусу, я думаю, можно отнести долгое привыкание.
ОтветитьУдалитьКак быть если в процессе написания кода видно, что в процессе будет выполнен так же и рефакторинг?
ОтветитьУдалитьЛучше коммитить по отдельности...
ОтветитьУдалитьНе всегда видно сразу, но надо стараться...
Александр: Техника очень интересная.. А как можно в hg с командной строки заранее указать коммит месседж?
Александр, Вы пробовали применять Mikado Method для рефакторинга? Если да, то удаётся ли сочетать его с подходом "комментарий до коммита"?
ОтветитьУдалитьНа мой взгляд, Mikado достаточно хорош для проведения крупных рефакторингов, но вступает в определённое противоречие с описанной здесь практикой на шаге переключения задач. Непоятно, удаётся ли его как-то разрешить?
Согласен, что надо коммиты делать отдельно. Если надо сделать рефакторинг (больше чем rename), то можно оставить TODO и через 15 минут вернуться к нему.
ОтветитьУдалитьВот я думал на счет командной строки и пока ничего не придумал, может у вас будут идеи :)
И долгое отвыкание
ОтветитьУдалитьНе пробовал, спасибо за ссылку на новое для меня, буду смотреть.
ОтветитьУдалитьCDD - Comment Driven Development
ОтветитьУдалить> Здесь надо привыкнуть писать комментарий в прошедшем времени, как будто задачу уже реализовали
ОтветитьУдалитьраспространена практика написания коммит-мессаджей в виде инфинитивов, таким образом перестраиваться даже не придется
>Здесь надо привыкнуть писать комментарий в прошедшем времени, как будто задачу уже реализовали
ОтветитьУдалитьВ гайдлайнах для Git говорится, что описание коммита нужно писать в настоящем времени.
В гайдлайнах для какого именно проекта?
ОтветитьУдалитьОчень сложно поверить в то, что инструмент должен диктовать как именно должны писать комментарии в нём.
Да, можно и в настоящем. Дело в том, что мы изначально писали задачу так, как будто ее еще надо сделать, было не привычно писать о задаче, как о готовой.
ОтветитьУдалитьУже 4 года как это стандарт дефакто. Вот к примеру описание с гитхаба https://github.com/blog/926-shiny-new-commit-styles
ОтветитьУдалитьвот оригинальное предложение http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
Что делать, когда в процессе выясняется что нужно сделать рефакторинг или исправить ошибку?
ОтветитьУдалить:-S
ОтветитьУдалитьЭто не стандарт де-факто, это предложение от разработчиков одного из гит-хостингов.
Возводить в абсолют стандарт комментирования как-то дико для меня.
Соглашения по поводу соглашений насчёт комментов и прочей культуры вокруг репозитория - проблемы отдельно взятой команды или проекта.
Погуглите по тексту описания и вы поймете, что не правы.
ОтветитьУдалитьНеправы в чём? Что я не могу писать комменты, как я хочу? И что я для своего проекта не могу придумать собственного конвеншна?
ОтветитьУдалитьТак недолго до того, чтобы де-факто заставили всех выучить английский язык и писать комментарии только на нём.
Кстати, из примера этого стандарта - а как вы переведёте "Fix bug" на русский?
ОтветитьУдалитьЭто недостаток русского языка. Я не вижу никакого смысла писать комментарии на русском, кроме эстетического и потакания тем, кому лень выучить английский.
ОтветитьУдалитьответ пиши @ комментарий не читай.
ОтветитьУдалитьPS: разработчик должен знать английский.
Ну и всё таки? Как перевести эту строку? Она вообще грамматически корректна?
ОтветитьУдалитьГрамматически корректна. По-русски "исправить жука"
ОтветитьУдалитьИсправить жука это таки "To fix a/the bug".
ОтветитьУдалитьУговорили. Буду писать комментарии на русском.
ОтветитьУдалитьДа не, я не уговаривал никого :-) Я просто удивлён, что "Fixed foo", которое корректно (за исключением артикля, но их много где опускают), предлагается заменить на "Fix foo", в котором вообще непонятно, что выполняет роль глагола.
ОтветитьУдалитьПричём аргументация строится на создании консистентного с автоматически генерируемыми текстами, которые хз кто как, но я всегда меняю на более осмысленные.
Ivan Kurnosov , hazzik Грамматически оба варианта правильные и имеют смысл.
ОтветитьУдалить"If you’re saying what you did today, then fixed bug is fine. If you’re saying what you’re doing tomorrow, it would be normal to write fix bug, as a note, in imperative form, to remind yourself and others what you’ll be doing."
(Подробнее тут http://english.stackexchange.com/questions/51399/fixed-vs-fixes-when-things-are-already-done )
Т.е. если последовательность commit'ов для команды представляется набором императивов, то лучше писать "fix bug". Если последовательностью репортов, то "fixed bug"
Пример более автоматизированной работы с помощью phpstorm и redmine: http://www.zagirov.name/phpstorm-redmine-changelist-workflow
ОтветитьУдалитьhttp://whatthecommit.com/
ОтветитьУдалитьКласс))
ОтветитьУдалитьУниверсальное решение:
$ curl http://whatthecommit.com/ | grep -P "^.*$" | xargs git commit -m
а если до решения задачи конкретно неизвестно, что в итоге будет предпринято в качестве решения? я конечно могу обобщить свое описание к задаче максимум кратко и не париться, но это ни есть хорошо
ОтветитьУдалитьВ любом случае понятно, что надо получить. Комментарий к коммите содержит результат, а не способ его достижения.
ОтветитьУдалитьиз описания таска то же можно получить информацию о требуемом результате. Например, моя задача: добавить новый сервис для доплат по путевке. Мой результат: добавлен новый сервис для доплат. И в чем прикол? Другое дело, если я опишу, какое решение было выбрано в процессе выполнения задачи. А если просто напишу, что добавил новый сервис, никому легче не станет. Так вот, заранее не всегда прозрачно решение задачи, поэтому заранее все описать, как с заранее написанным тестом по технологии TDD - не всегда возможно.
ОтветитьУдалитьhttp://mercurial.selenic.com/wiki/MqExtension
ОтветитьУдалитьПозволяет делать не один а несколько подряд идущих отложенных коммитов... без модификации репозитория.
Это позволяет писать код, одновременно проводя рефакторинг в предварительном коммите.
Или всякие похожие вещи..
Это я уточнил собственно, взял себе не вооружение :)
В git когда происходит ситуация, подобная описанной в начале, хорошо использовать git add -p и добавлять код в коммит "патчами". Хорошо это еще и тем, что перед коммитом просматривается весь измененный код, чтоб не закоммитить то, что на самом деле там не должно быть.
ОтветитьУдалитьhttp://johnkary.net/blog/git-add-p-the-most-powerful-git-feature-youre-not-using-yet/
hg collapse (http://mercurial.selenic.com/wiki/CollapseExtension). обычный воркфлоу - коммит раз 2-5-10 минут, с понятным для себя сообщением (типа rename method blaBlaBla, minor refactoring, trying one more time). потом, при завершении задачи, через час-день - collapse - перечитываешь коммит сообщения, переосмысливаешь изменения, пишешь нормальный коммит мессадж.. коммиты сливаются... и коллегам в паблик отдается только один красивый коммит (ну или сколько хочешь).
ОтветитьУдалить