Files
homelab-optimized/docs/admin/GIT_BRANCHES_GUIDE.md
Gitea Mirror Bot a63c410ce3
Some checks failed
Documentation / Deploy to GitHub Pages (push) Has been cancelled
Documentation / Build Docusaurus (push) Has been cancelled
Sanitized mirror from private repository - 2026-04-18 12:12:12 UTC
2026-04-18 12:12:12 +00:00

255 lines
6.4 KiB
Markdown

# Git Branches Guide for Homelab Repository
Last updated: 2026-02-17
## What Are Git Branches?
Branches are like parallel timelines for your code. They let you make changes without affecting the main codebase. Your `main` branch is the "production" version - stable and working. Other branches let you experiment safely.
## Why Use Branches?
1. **Safety**: Your production services keep running while you test changes
2. **Collaboration**: If someone helps you, they can work on their own branch
3. **Easy Rollback**: If something breaks, just delete the branch or don't merge it
4. **Code Review**: You can review changes before merging (especially useful for risky changes)
5. **Parallel Work**: Work on multiple things at once without conflicts
## Common Use Cases for This Homelab
### 1. Feature Development
Adding new services or functionality without disrupting main branch.
```bash
git checkout -b feature/add-jellyfin
# Make changes, test, commit
git push origin feature/add-jellyfin
# When ready, merge to main
```
**Example**: Adding a new service like Jellyfin - you can configure it, test it, document it all in isolation.
### 2. Bug Fixes
Isolating fixes for specific issues.
```bash
git checkout -b fix/perplexica-timeout
# Fix the issue, test
# Merge when confirmed working
```
**Example**: Like the `fix/admin-acl-routing` branch - fixing specific issues without touching main.
### 3. Experiments/Testing
Try new approaches without risk.
```bash
git checkout -b experiment/traefik-instead-of-nginx
# Try completely different approach
# If it doesn't work, just delete the branch
```
**Example**: Testing if Traefik works better than Nginx Proxy Manager without risking your working setup.
### 4. Documentation Updates
Large documentation efforts.
```bash
git checkout -b docs/monitoring-guide
# Write extensive docs
# Merge when complete
```
### 5. Major Refactors
Restructure code over time.
```bash
git checkout -b refactor/reorganize-compose-files
# Restructure files over several days
# Main stays working while you experiment
```
## Branch Naming Convention
Recommended naming scheme:
- `feature/*` - New services/functionality
- `fix/*` - Bug fixes
- `docs/*` - Documentation only
- `experiment/*` - Testing ideas (might not merge)
- `upgrade/*` - Service upgrades
- `config/*` - Configuration changes
- `security/*` - Security updates
## Standard Workflow
### Starting New Work
```bash
# Always start from updated main
git checkout main
git pull origin main
# Create your branch
git checkout -b feature/new-service-name
# Work, commit, push
git add .
git commit -m "Add new service config"
git push origin feature/new-service-name
```
### When Ready to Merge
```bash
# Update main first
git checkout main
git pull origin main
# Merge your branch (--no-ff creates merge commit for history)
git merge feature/new-service-name --no-ff -m "Merge feature/new-service-name"
# Push and cleanup
git push origin main
git push origin --delete feature/new-service-name
# Delete local branch
git branch -d feature/new-service-name
```
## Real Examples for This Homelab
**Good branch names:**
- `feature/add-immich` - Adding new photo service
- `fix/plex-permissions` - Fixing Plex container permissions
- `docs/ansible-playbook-guide` - Documentation work
- `upgrade/ollama-version` - Upgrading a service
- `experiment/kubernetes-migration` - Testing big changes
- `security/update-vaultwarden` - Security updates
## When to Use Branches
### ✅ Use a branch when:
- Adding a new service
- Making breaking changes
- Experimenting with new tools
- Major configuration changes
- Working on something over multiple days
- Multiple files will be affected
- Changes need testing before production
### ❌ Direct to main is fine for:
- Quick documentation fixes
- Typo corrections
- Emergency hotfixes (but still be careful!)
- Single-line configuration tweaks
## Quick Command Reference
```bash
# List all branches (local and remote)
git branch -a
# Create and switch to new branch
git checkout -b branch-name
# Switch to existing branch
git checkout branch-name
# See current branch
git branch
# Push branch to remote
git push origin branch-name
# Delete local branch
git branch -d branch-name
# Delete remote branch
git push origin --delete branch-name
# Update local list of remote branches
git fetch --prune
# See branch history
git log --oneline --graph --all --decorate
# Create backup branch before risky operations
git checkout -b backup-main-$(date +%Y-%m-%d)
```
## Merge Strategies
### Fast-Forward Merge (default)
Branch commits are simply added to main. Clean linear history.
```bash
git merge feature-branch
```
### No Fast-Forward Merge (recommended)
Creates merge commit showing branch integration point. Better for tracking features.
```bash
git merge feature-branch --no-ff
```
### Squash Merge
Combines all branch commits into one commit on main. Cleaner but loses individual commit history.
```bash
git merge feature-branch --squash
```
## Conflict Resolution
If merge conflicts occur:
```bash
# Git will tell you which files have conflicts
# Edit the files to resolve conflicts (look for <<<<<<< markers)
# After resolving, stage the files
git add resolved-file.yml
# Complete the merge
git commit
```
## Best Practices
1. **Keep branches short-lived**: Merge within days/weeks, not months
2. **Update from main regularly**: Prevent large divergence
3. **One feature per branch**: Don't mix unrelated changes
4. **Descriptive names**: Use naming convention for clarity
5. **Test before merging**: Verify changes work
6. **Delete after merging**: Keep repository clean
7. **Create backups**: Before risky merges, create backup branch
## Recovery Commands
```bash
# Undo last commit (keep changes)
git reset --soft HEAD~1
# Abandon all local changes
git reset --hard HEAD
# Restore from backup branch
git checkout main
git reset --hard backup-main-2026-02-17
# See what changed in merge
git diff main feature-branch
```
## Integration with This Repository
This repository follows these practices:
- `main` branch is always deployable
- Feature branches are merged with `--no-ff` for clear history
- Backup branches created before major merges (e.g., `backup-main-2026-02-17`)
- Remote branches deleted after successful merge
- Documentation changes may go direct to main if minor
## See Also
- [Git Documentation](https://git-scm.com/doc)
- [GitHub Flow Guide](https://guides.github.com/introduction/flow/)
- Repository: https://git.vish.gg/Vish/homelab