hyperion/10-linux/00-utils/commits.md
2025-11-22 17:48:07 +03:00

14 KiB
Raw Permalink Blame History

Как писать коммиты как 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 Форматирование (не логика) -

opensight+2

Примеры:

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 символов):

  1. Используй повелительное наклонение (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"

  2. Не ставь точку в концеgitkraken

  3. Начни с заглавной буквыdev+1

  4. Конкретно описывай ЧТО, не ПОЧЕМУ (ПОЧЕМУ — в 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 ценят за историю, которая сама себя документирует и облегчает дебагинг всвсей команде.

  1. https://dev.to/aneeqakhan/best-practices-for-git-and-version-control-588m
  2. https://gitbybit.com/gitopedia/best-practices/atomic-commits
  3. https://www.philipp-doblhofer.at/en/blog/automatic-changelog-and-versioning-with-git/
  4. https://justinjoyce.dev/git-commit-and-commit-message-best-practices/
  5. https://dev.to/this-is-learning/the-power-of-atomic-commits-in-git-how-and-why-to-do-it-54mn
  6. https://codefinity.com/blog/7-Best-Practices-of-Git-Commit-Messages
  7. https://blog.opensight.ch/git-semantic-versioning-und-conventional-commits/
  8. https://dev.to/devsatasurion/automate-changelogs-to-ease-your-release-282
  9. https://www.gitkraken.com/learn/git/best-practices/git-commit-message
  10. https://dev.to/theramoliya/git-interactive-add-for-precise-staging-33m1
  11. https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging
  12. https://dev.to/etcwilde/git-and-the-interactive-patch-add
  13. https://graphite.dev/guides/how-to-squash-git-commits
  14. https://www.freecodecamp.org/news/git-squash-commits/
  15. https://www.datacamp.com/tutorial/git-squash-commits
  16. https://www.datacamp.com/tutorial/git-amend
  17. https://kodaschool.com/blog/amending-the-most-recent-commit-with-git
  18. https://www.codecademy.com/article/git-commit-amend
  19. https://www.cockroachlabs.com/blog/parallel-commits/
  20. https://stackoverflow.com/questions/68095467/git-interactive-rebase-squash-commits-any-shortcuts