docs: add git hygiene guidelines to CLAUDE.md
- No 'fix' commits for typos/syntax errors - Use interactive rebase to keep history clean - Examples: squash, amend, reorder commits - Keep one logical change per commit
This commit is contained in:
@@ -309,3 +309,94 @@ PM runs autonomously every 30 minutes. **No human approval needed unless blocked
|
|||||||
**Audience:** All Claude agents, PM, developers
|
**Audience:** All Claude agents, PM, developers
|
||||||
|
|
||||||
> **Remember:** This document is your north star. Follow it. Extend it. Improve it.
|
> **Remember:** This document is your north star. Follow it. Extend it. Improve it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Part 5: Git Hygiene - Keep the Repo Clean
|
||||||
|
|
||||||
|
### No "Fix" Commits
|
||||||
|
❌ **NEVER** commit fixes for typos, syntax errors, or accidentally added files:
|
||||||
|
```bash
|
||||||
|
# BAD - Creates noise in history:
|
||||||
|
commit 1a2b3c: feat: add feature
|
||||||
|
commit 1a2b3d: fix: typo in feature ← NO!
|
||||||
|
commit 1a2b3e: chore: remove extra file ← NO!
|
||||||
|
```
|
||||||
|
|
||||||
|
✅ **INSTEAD:** Use interactive rebase to clean up BEFORE pushing:
|
||||||
|
```bash
|
||||||
|
# GOOD - Clean, single commit:
|
||||||
|
commit 1a2b3c: feat: add feature (with typo fixed)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Interactive Rebase Workflow
|
||||||
|
|
||||||
|
**1. Check recent commits:**
|
||||||
|
```bash
|
||||||
|
git log --oneline -5
|
||||||
|
# abc1234 feat: add feature
|
||||||
|
# def5678 fix: typo in feature ← Oops!
|
||||||
|
# ghi9012 chore: remove extra file ← Oops!
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. Rebase the last 3 commits:**
|
||||||
|
```bash
|
||||||
|
git rebase -i HEAD~3
|
||||||
|
```
|
||||||
|
|
||||||
|
**3. Edit in your editor:**
|
||||||
|
```
|
||||||
|
pick abc1234 feat: add feature
|
||||||
|
squash def5678 fix: typo in feature
|
||||||
|
squash ghi9012 chore: remove extra file
|
||||||
|
```
|
||||||
|
|
||||||
|
Change `pick` to `squash` (or `s`) for commits you want to merge into the previous one.
|
||||||
|
|
||||||
|
**4. Save and edit the commit message:**
|
||||||
|
The editor will ask for a final commit message. Edit it to be clean:
|
||||||
|
```
|
||||||
|
feat: add feature
|
||||||
|
|
||||||
|
- Added feature X
|
||||||
|
- Removed extra file
|
||||||
|
```
|
||||||
|
|
||||||
|
**5. Force-push (only if not yet pushed):**
|
||||||
|
```bash
|
||||||
|
git push -f origin branch-name
|
||||||
|
```
|
||||||
|
|
||||||
|
### When to Rebase
|
||||||
|
|
||||||
|
- ✅ **Before first push** — Fix typos, add forgotten files
|
||||||
|
- ✅ **Before review** — Squash "work in progress" commits
|
||||||
|
- ❌ **After pushed to shared branch** — Don't force-push to main/develop
|
||||||
|
|
||||||
|
### Common Rebase Scenarios
|
||||||
|
|
||||||
|
**Fix a typo in last commit:**
|
||||||
|
```bash
|
||||||
|
git commit --amend
|
||||||
|
# Edit the file, save
|
||||||
|
# Git updates the commit without a new one
|
||||||
|
```
|
||||||
|
|
||||||
|
**Reorder commits:**
|
||||||
|
```bash
|
||||||
|
git rebase -i HEAD~3
|
||||||
|
# Reorder the lines in the editor
|
||||||
|
```
|
||||||
|
|
||||||
|
**Combine last 2 commits:**
|
||||||
|
```bash
|
||||||
|
git rebase -i HEAD~2
|
||||||
|
# Change second line from "pick" to "squash"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rule of Thumb
|
||||||
|
|
||||||
|
**One logical change = One commit**
|
||||||
|
|
||||||
|
If you're writing a commit message that says "fixed typo from previous commit", you should have rebased instead.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user