migrations
This commit is contained in:
parent
d1b0670d71
commit
f2b07c9f30
57 changed files with 2970 additions and 1 deletions
232
10-linux/00-utils/commits.md
Normal file
232
10-linux/00-utils/commits.md
Normal file
|
|
@ -0,0 +1,232 @@
|
|||
## Как писать коммиты как senior девелопер
|
||||
|
||||
Это не просто про формат — это про философию. Senior коммиты рассказывают историю проекта, облегчают отладку и экономят часы времени команде при code review. Вот полный гайд.[dev+5](https://dev.to/aneeqakhan/best-practices-for-git-and-version-control-588m)
|
||||
|
||||
## 📋 Фундаментальный принцип: Atomic Commits
|
||||
|
||||
**Основное правило:** Один коммит = один логический блок работы. Не больше, не меньше.[gitbybit+1](https://gitbybit.com/gitopedia/best-practices/atomic-commits)
|
||||
|
||||
**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](https://justinjoyce.dev/git-commit-and-commit-message-best-practices/)
|
||||
|
||||
## 🎯 Conventional Commits (стандарт индустрии)
|
||||
|
||||
Используй этот формат — его поддерживают инструменты автоматизации, CI/CD пайплайны генерируют CHANGELOG сами:[philipp-doblhofer+2](https://www.philipp-doblhofer.at/en/blog/automatic-changelog-and-versioning-with-git/)
|
||||
|
||||
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](https://blog.opensight.ch/git-semantic-versioning-und-conventional-commits/)
|
||||
|
||||
**Примеры:**
|
||||
|
||||
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](https://www.gitkraken.com/learn/git/best-practices/git-commit-message)
|
||||
|
||||
- Проверка: "If applied, my commit will **[ваше сообщение]**"
|
||||
|
||||
- "If applied, my commit will **add JWT token refresh**" ✅
|
||||
|
||||
- "If applied, my commit will **added JWT token**" ❌
|
||||
|
||||
2. **Не ставь точку в конце**[gitkraken](https://www.gitkraken.com/learn/git/best-practices/git-commit-message)
|
||||
|
||||
3. **Начни с заглавной буквы**[dev+1](https://dev.to/aneeqakhan/best-practices-for-git-and-version-control-588m)
|
||||
|
||||
4. **Конкретно описывай ЧТО, не ПОЧЕМУ** (ПОЧЕМУ — в body)[dev+2](https://dev.to/this-is-learning/the-power-of-atomic-commits-in-git-how-and-why-to-do-it-54mn)
|
||||
|
||||
|
||||
**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](https://dev.to/theramoliya/git-interactive-add-for-precise-staging-33m1)
|
||||
|
||||
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](https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging)
|
||||
|
||||
## 2. Commit Often, Squash on PR
|
||||
|
||||
**Local workflow (когда разрабатываешь):**
|
||||
|
||||
Коммиться часто — чуть ли не каждые 5-10 минут:[justinjoyce+1](https://justinjoyce.dev/git-commit-and-commit-message-best-practices/)
|
||||
|
||||
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](https://graphite.dev/guides/how-to-squash-git-commits)
|
||||
|
||||
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](https://www.freecodecamp.org/news/git-squash-commits/)
|
||||
|
||||
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](https://www.datacamp.com/tutorial/git-amend)
|
||||
|
||||
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](https://kodaschool.com/blog/amending-the-most-recent-commit-with-git)
|
||||
|
||||
## 4. Reflog для спасения
|
||||
|
||||
Если переборщил с rebase и потерял коммиты — не паникуй:[justinjoyce](https://justinjoyce.dev/git-commit-and-commit-message-best-practices/)
|
||||
|
||||
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 review[gitbybit+1](https://gitbybit.com/gitopedia/best-practices/atomic-commits)
|
||||
|
||||
- **Вагие сообщения** ("fix bug", "updated", "wip") — потом сам не поймёшь[codefinity+2](https://codefinity.com/blog/7-Best-Practices-of-Git-Commit-Messages)
|
||||
|
||||
- **Смешивать логику и форматирование** — затрудняет `git blame`[gitbybit+1](https://gitbybit.com/gitopedia/best-practices/atomic-commits)
|
||||
|
||||
- **Коммитить commented code** — если не нужно, удали[dev](https://dev.to/aneeqakhan/best-practices-for-git-and-version-control-588m)
|
||||
|
||||
- **Амендить уже pushed коммиты** в shared branch — травма для команды[datacamp](https://www.datacamp.com/tutorial/git-amend)
|
||||
|
||||
|
||||
## Итог для твоего стека
|
||||
|
||||
Если ты 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](https://dev.to/aneeqakhan/best-practices-for-git-and-version-control-588m)
|
||||
2. [https://gitbybit.com/gitopedia/best-practices/atomic-commits](https://gitbybit.com/gitopedia/best-practices/atomic-commits)
|
||||
3. [https://www.philipp-doblhofer.at/en/blog/automatic-changelog-and-versioning-with-git/](https://www.philipp-doblhofer.at/en/blog/automatic-changelog-and-versioning-with-git/)
|
||||
4. [https://justinjoyce.dev/git-commit-and-commit-message-best-practices/](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](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](https://codefinity.com/blog/7-Best-Practices-of-Git-Commit-Messages)
|
||||
7. [https://blog.opensight.ch/git-semantic-versioning-und-conventional-commits/](https://blog.opensight.ch/git-semantic-versioning-und-conventional-commits/)
|
||||
8. [https://dev.to/devsatasurion/automate-changelogs-to-ease-your-release-282](https://dev.to/devsatasurion/automate-changelogs-to-ease-your-release-282)
|
||||
9. [https://www.gitkraken.com/learn/git/best-practices/git-commit-message](https://www.gitkraken.com/learn/git/best-practices/git-commit-message)
|
||||
10. [https://dev.to/theramoliya/git-interactive-add-for-precise-staging-33m1](https://dev.to/theramoliya/git-interactive-add-for-precise-staging-33m1)
|
||||
11. [https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging](https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging)
|
||||
12. [https://dev.to/etcwilde/git-and-the-interactive-patch-add](https://dev.to/etcwilde/git-and-the-interactive-patch-add)
|
||||
13. [https://graphite.dev/guides/how-to-squash-git-commits](https://graphite.dev/guides/how-to-squash-git-commits)
|
||||
14. [https://www.freecodecamp.org/news/git-squash-commits/](https://www.freecodecamp.org/news/git-squash-commits/)
|
||||
15. [https://www.datacamp.com/tutorial/git-squash-commits](https://www.datacamp.com/tutorial/git-squash-commits)
|
||||
16. [https://www.datacamp.com/tutorial/git-amend](https://www.datacamp.com/tutorial/git-amend)
|
||||
17. [https://kodaschool.com/blog/amending-the-most-recent-commit-with-git](https://kodaschool.com/blog/amending-the-most-recent-commit-with-git)
|
||||
18. [https://www.codecademy.com/article/git-commit-amend](https://www.codecademy.com/article/git-commit-amend)
|
||||
19. [https://www.cockroachlabs.com/blog/parallel-commits/](https://www.cockroachlabs.com/blog/parallel-commits/)
|
||||
20. [https://stackoverflow.com/questions/68095467/git-interactive-rebase-squash-commits-any-shortcuts](https://stackoverflow.com/questions/68095467/git-interactive-rebase-squash-commits-any-shortcuts)
|
||||
Loading…
Add table
Add a link
Reference in a new issue