14 KiB
Как писать коммиты как senior девелопер
Это не просто про формат — это про философию. Senior коммиты рассказывают историю проекта, облегчают отладку и экономят часы времени команде при code review. Вот полный гайд.dev+5
📋 Фундаментальный принцип: Atomic Commits
Основное правило: Один коммит = один логический блок работы. Не больше, не меньше.gitbybit+1
Bad (как junior):
text
commit 6a7f9c3: "Добавил купоны, отфиксил ссылки в письмах и рефакторил email scheduler"
Good (как senior):
text
commit a1b2c3d: "feat(coupons): add coupon validation and application logic" commit d4e5f6g: "fix(email): correct notification template links" commit h7i8j9k: "refactor(scheduler): simplify email scheduling algorithm"
Почему? Потому что через месяц ты найдёшь баг в купонах и сделаешь git bisect — он точно укажет именно на первый коммит, не трогая остальное.justinjoyce+2
🎯 Conventional Commits (стандарт индустрии)
Используй этот формат — его поддерживают инструменты автоматизации, CI/CD пайплайны генерируют CHANGELOG сами:philipp-doblhofer+2
text
<type>[optional scope]: <description> [optional body] [optional footer(s)]
Типы коммитов:
| Тип | Использование | Semver |
|---|---|---|
feat |
Новая фича | MINOR (+0.1.0) |
fix |
Исправление бага | PATCH (+0.0.1) |
BREAKING CHANGE |
Ломающее изменение API | MAJOR (+1.0.0) |
refactor |
Переписал без изменения поведения | PATCH |
perf |
Улучшил производительность | PATCH |
docs |
Только документация | - |
chore |
Build, deps, tooling | - |
test |
Добавил/изменил тесты | - |
ci |
Изменения CI/CD конфига | - |
style |
Форматирование (не логика) | - |
Примеры:
bash
# ✅ Good feat(auth): add JWT token refresh mechanism fix(api): handle null response from external service refactor(parser): extract token validation into separate function perf(cache): implement Redis caching for frequently accessed data docs(readme): update installation instructions for Node 18+ # ❌ Bad updated code fix bug changes WIP todo
📝 Правила написания сообщения
Subject (первая строка — максимум 50 символов):
-
Используй повелительное наклонение (imperative mood) — "Add", "Fix", а не "Added", "Fixed"gitkraken+3
-
Проверка: "If applied, my commit will [ваше сообщение]"
-
"If applied, my commit will add JWT token refresh" ✅
-
"If applied, my commit will added JWT token" ❌
-
-
Не ставь точку в концеgitkraken
-
Начни с заглавной буквыdev+1
-
Конкретно описывай ЧТО, не ПОЧЕМУ (ПОЧЕМУ — в body)dev+2
Body (опционально, но рекомендуется):
-
Отдели пустой строкой от subject
-
Обясни ПОЧЕМУ ты это сделал, не ЧТО сделал
-
Укажи мотивацию и контекст
-
Упомяни issue/ticket номер
text
feat(payment): implement Stripe webhook handler Add webhook endpoint to handle Stripe payment events. This replaces the previous polling mechanism which caused 5-10 second delays in payment confirmation. Supports events: - payment_intent.succeeded - payment_intent.payment_failed Closes #1234 Related-to: #5678
🎮 Advanced techniques для senior
1. Interactive Staging (git add -p)
Когда в одном файле несколько независимых изменений — stage их отдельно:dev+2
bash
# Запустить интерактивный режим git add -p # Git покажет каждый "hunk" (блок) изменений: # (1/2) Stage this hunk [y,n,q,a,d,j,J,k,K,s,e,?]? # Команды: # y = stage this hunk # n = skip # s = split into smaller hunks (если hunk слишком большой) # e = manually edit this hunk
Пример: Ты отфиксил баг в функции AND случайно отреформатировал другую функцию. Используй git add -p, чтобы добавить только багфикс в один коммит, а рефакторинг — в другой.git-scm+2
2. Commit Often, Squash on PR
Local workflow (когда разрабатываешь):
Коммиться часто — чуть ли не каждые 5-10 минут:justinjoyce+1
bash
# 5 минут работы git commit -m "WIP: parsing implementation" # 5 минут работы git commit -m "add error handling" # 5 минут работы git commit -m "fix edge case"
Перед push на PR:
Используй interactive rebase для squash в один красивый коммит:graphite+2
bash
# Узнай количество коммитов git log --oneline | head -10 # Rebase последних 3 коммитов git rebase -i HEAD~3
В редакторе измени команды:
text
pick a1b2c3d WIP: parsing implementation squash d4e5f6g add error handling squash h7i8j9k fix edge case
Сохрани → Git откроет редактор для финального message → напиши нормальный subject:freecodecamp+2
text
feat(parser): implement JSON parser with error handling - Parse nested structures - Handle validation errors gracefully - Support edge cases with null/undefined values
3. Amending commits
Забыл добавить файл или опечатка в message? Не создавай новый коммит:datacamp+2
bash
# Опечатка в message последнего коммита git commit --amend -m "fix(auth): correct typo in comment" # Забыл файл git add forgotten-file.rs git commit --amend --no-edit
⚠️ Важно: Не амендь коммиты, которые уже pushed в shared branch! Это сломает историю для всех.kodaschool+2
4. Reflog для спасения
Если переборщил с rebase и потерял коммиты — не паникуй:justinjoyce
bash
# Увидишь всю историю операций git reflog # Вернёшься на нужное состояние git reset --hard abc123d@{2}
🎯 Настройки для удобства
~/.gitconfig:
text
[user] name = Your Name email = you@example.com [core] editor = vim # или nano, code, etc. [alias] # Удобные aliases cm = commit -m amend = commit --amend --no-edit co = checkout br = branch unstage = reset HEAD last = log -1 HEAD # Красивый лог lg = log --graph --oneline --all --decorate [rebase] autostash = true # Автоматически stash перед rebase [pull] rebase = true # Rebase вместо merge при pull
📊 Workflow: step-by-step для PR
1. Работаешь над фичей:
bash
git checkout -b feat/user-authentication # Часто коммитишься (не думаешь об истории) git commit -m "WIP: add login form" git commit -m "add password validation" git commit -m "integrate with auth service" git commit -m "fix bug with token expiry"
2. Перед PR: cleanup история
bash
# Посмотри что есть git log --oneline origin/main..HEAD # Если совсем много коммитов git rebase -i origin/main # Или если точно знаешь кол-во git rebase -i HEAD~4
3. В редакторе:
text
pick a1b2c3d WIP: add login form squash d4e5f6g add password validation squash h7i8j9k integrate with auth service squash k9l0m1n fix bug with token expiry
4. Напиши финальный message:
text
feat(auth): implement JWT-based user authentication Add login/logout functionality with password validation. Tokens refresh automatically after 1 hour. Implements RFC 7519 JWT standard. - User registration with email verification - Secure password hashing with bcrypt - Token refresh mechanism - Logout clears session Closes #456
5. Push:
bash
git push origin feat/user-authentication
🚫 Что НЕ делать (как junior)
-
Огромные коммиты с кучей фич — невозможно code reviewgitbybit+1
-
Вагие сообщения ("fix bug", "updated", "wip") — потом сам не поймёшьcodefinity+2
-
Смешивать логику и форматирование — затрудняет
git blamegitbybit+1 -
Коммитить commented code — если не нужно, удалиdev
-
Амендить уже pushed коммиты в shared branch — травма для командыdatacamp
Итог для твоего стека
Если ты backend-разработчик на Rust/FastAPI:
Пример реального коммита для Axum middleware:
text
feat(auth): add rate limiting middleware Implement token bucket algorithm for request rate limiting. Prevents brute force attacks on login endpoint. - Configurable requests-per-minute limit - Per-IP rate limiting with Redis backend - Returns 429 Too Many Requests on limit exceeded - Exports Prometheus metrics for monitoring Performance: ~0.1ms per request overhead Closes #892
Это куда важнее, чем технические skills — senior ценят за историю, которая сама себя документирует и облегчает дебагинг всвсей команде.
- https://dev.to/aneeqakhan/best-practices-for-git-and-version-control-588m
- https://gitbybit.com/gitopedia/best-practices/atomic-commits
- https://www.philipp-doblhofer.at/en/blog/automatic-changelog-and-versioning-with-git/
- https://justinjoyce.dev/git-commit-and-commit-message-best-practices/
- https://dev.to/this-is-learning/the-power-of-atomic-commits-in-git-how-and-why-to-do-it-54mn
- https://codefinity.com/blog/7-Best-Practices-of-Git-Commit-Messages
- https://blog.opensight.ch/git-semantic-versioning-und-conventional-commits/
- https://dev.to/devsatasurion/automate-changelogs-to-ease-your-release-282
- https://www.gitkraken.com/learn/git/best-practices/git-commit-message
- https://dev.to/theramoliya/git-interactive-add-for-precise-staging-33m1
- https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging
- https://dev.to/etcwilde/git-and-the-interactive-patch-add
- https://graphite.dev/guides/how-to-squash-git-commits
- https://www.freecodecamp.org/news/git-squash-commits/
- https://www.datacamp.com/tutorial/git-squash-commits
- https://www.datacamp.com/tutorial/git-amend
- https://kodaschool.com/blog/amending-the-most-recent-commit-with-git
- https://www.codecademy.com/article/git-commit-amend
- https://www.cockroachlabs.com/blog/parallel-commits/
- https://stackoverflow.com/questions/68095467/git-interactive-rebase-squash-commits-any-shortcuts