Docs: Add subagent workflow documentation #6
@@ -91,3 +91,80 @@ OPEN → IN_PROGRESS (subagent claims it)
|
||||
|
||||
- Research/docs: `docs/issue-{N}-{short-title}`
|
||||
- Fixes/tools: `fix/issue-{N}-{short-title}`
|
||||
|
||||
## Branch Hygiene
|
||||
|
||||
When branches are created incorrectly (e.g., from HEAD instead of main), they become contaminated with unwanted commits. This section provides a standard workflow for detecting and fixing this.
|
||||
|
||||
### How Contamination Happens
|
||||
|
||||
- Running `git checkout -b new-branch` (without explicit base) creates a branch from the current HEAD
|
||||
- If HEAD is not aligned with main (e.g., detached HEAD, or a different branch), the new branch inherits that history
|
||||
- The branch then contains commits that don't belong to the intended base
|
||||
|
||||
### Detection
|
||||
|
||||
**Symptom:** `git log` shows commits from a different/wrong branch at the start of the history.
|
||||
|
||||
**Command to identify contamination:**
|
||||
```bash
|
||||
# Find commits that exist in wrong-branch but not in main
|
||||
git log main..wrong-branch --oneline
|
||||
|
||||
# Check if a specific commit is contained in main
|
||||
git branch --contains <commit-id>
|
||||
# If empty output, the commit is NOT in main (contamination)
|
||||
|
||||
# Or compare the first commit of your branch to main's tip
|
||||
git merge-base main your-branch
|
||||
# If this doesn't match the first commit on your branch, there's contamination
|
||||
```
|
||||
|
||||
### Prevention
|
||||
|
||||
**Always use explicit base when creating branches:**
|
||||
```bash
|
||||
# Correct - branch from main explicitly
|
||||
git checkout -b new-branch main
|
||||
|
||||
# Incorrect - branch from current HEAD (may not be main)
|
||||
git checkout -b new-branch # DANGEROUS if HEAD isn't main
|
||||
```
|
||||
|
||||
### Fix Procedure
|
||||
|
||||
If contamination is detected, use `git rebase --onto` to move the branch to the correct base:
|
||||
|
||||
```bash
|
||||
# Syntax: git rebase --onto <new-base> <old-base> <branch-to-move>
|
||||
git rebase --onto main wrong-branch new-branch
|
||||
|
||||
# Example:
|
||||
# - main is the correct base
|
||||
# - wrong-branch is the contaminated branch (the old base that was used incorrectly)
|
||||
# - new-branch is your current branch that has wrong commits
|
||||
|
||||
# After rebase, verify with:
|
||||
git log --oneline main..
|
||||
git branch --contains <original-first-commit-id> # Should be empty
|
||||
```
|
||||
|
||||
### Force Push with Lease
|
||||
|
||||
After rebasing, a force push is required. Use `--force-with-lease` for safety:
|
||||
|
||||
```bash
|
||||
git push --force-with-lease origin new-branch
|
||||
```
|
||||
|
||||
`--force-with-lease` is safer than `--force` because it will fail if someone else has pushed to the branch since you last fetched, preventing accidental overwrites.
|
||||
|
||||
### Quick Reference
|
||||
|
||||
| Scenario | Command |
|
||||
|----------|---------|
|
||||
| Create clean branch | `git checkout -b new-branch main` |
|
||||
| Detect contamination | `git log main..my-branch` (if non-empty, contaminated) |
|
||||
| Check commit presence | `git branch --contains <commit-id>` |
|
||||
| Fix contaminated branch | `git rebase --onto main wrong-base my-branch` |
|
||||
| Safe force push | `git push --force-with-lease origin my-branch` |
|
||||
|
||||
Reference in New Issue
Block a user