home / skills / krosebrook / source-of-truth-monorepo / git-advanced-workflow

git-advanced-workflow skill

/.claude-custom/skills/git-advanced-workflow

This skill guides advanced Git workflows and monorepo strategies to improve collaboration, automation, and trunk-based development in large codebases.

npx playbooks add skill krosebrook/source-of-truth-monorepo --skill git-advanced-workflow

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
6.7 KB
---
name: Git Advanced Workflow Expert
description: Expert guidance for advanced Git workflows, trunk-based development, monorepo strategies, and Git automation. Use when implementing Git workflows, managing complex repositories, or automating Git operations.
version: 1.0.0
allowed-tools:
  - Bash
  - Read
  - Write
---

# Git Advanced Workflow Expert

Advanced Git workflows and automation for modern development teams.

## Trunk-Based Development

```bash
# Main branch protection
git config branch.main.mergeoptions --no-ff

# Short-lived feature branches
git checkout -b feature/user-auth
# Work on feature (max 2 days)
git commit -m "feat: add user authentication"
git push origin feature/user-auth
# Create PR → Review → Merge → Delete branch

# Feature flags for incomplete features
if (featureFlags.isEnabled('new-ui')) {
  renderNewUI();
} else {
  renderOldUI();
}
```

## Conventional Commits

```bash
# Format: <type>(<scope>): <subject>

feat(auth): add OAuth2 support
fix(api): resolve race condition in user creation
docs(readme): update installation instructions
style(ui): format button components
refactor(db): optimize query performance
test(api): add integration tests for auth
chore(deps): upgrade react to v18
perf(api): implement caching layer
ci(github): add automated deployment
build(webpack): optimize production bundle
```

## Git Hooks with Husky

```json
// package.json
{
  "scripts": {
    "prepare": "husky install"
  },
  "lint-staged": {
    "*.{ts,tsx}": ["eslint --fix", "prettier --write"],
    "*.{json,md}": ["prettier --write"]
  }
}
```

```bash
# .husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

# Run lint-staged
npx lint-staged

# Run tests on staged files
npm test -- --findRelatedTests --passWithNoTests

# Prevent commits to main
branch="$(git rev-parse --abbrev-ref HEAD)"
if [ "$branch" = "main" ]; then
  echo "Direct commits to main are not allowed"
  exit 1
fi
```

```bash
# .husky/commit-msg
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

# Validate conventional commit format
npx commitlint --edit $1
```

## Monorepo Strategies

### Git Sparse Checkout

```bash
# Clone only specific directories
git clone --filter=blob:none --sparse https://github.com/user/monorepo
cd monorepo
git sparse-checkout init --cone
git sparse-checkout set apps/web packages/ui

# Add more paths
git sparse-checkout add apps/api
```

### Git Worktrees

```bash
# Multiple working directories from same repo
git worktree add ../monorepo-feature feature/new-ui
git worktree add ../monorepo-hotfix hotfix/critical-bug
git worktree list

# Clean up
git worktree remove ../monorepo-feature
```

## Advanced Git Operations

### Interactive Rebase

```bash
# Clean up commits before PR
git rebase -i HEAD~5

# Squash fixup commits
git commit --fixup HEAD~2
git rebase -i --autosquash HEAD~5

# Edit commit history
pick a1b2c3d feat: add feature
fixup d4e5f6g fix typo
reword g7h8i9j Update message
drop j0k1l2m Remove this commit
```

### Cherry-Pick Workflows

```bash
# Apply specific commits
git cherry-pick abc123

# Cherry-pick range
git cherry-pick abc123..def456

# Cherry-pick from another branch
git cherry-pick feature-branch~3..feature-branch
```

### Bisect for Bug Hunting

```bash
# Find bug-introducing commit
git bisect start
git bisect bad HEAD
git bisect good v1.0.0

# Mark each commit
git bisect good  # or bad

# Automated bisect
git bisect run npm test
```

## Git Automation Scripts

### Auto-sync Script

```bash
#!/bin/bash
# auto-sync.sh

MAIN_BRANCH="main"
CURRENT_BRANCH=$(git branch --show-current)

# Fetch latest
git fetch origin

# Check if main has updates
if [ "$(git rev-parse $MAIN_BRANCH)" != "$(git rev-parse origin/$MAIN_BRANCH)" ]; then
  echo "Main branch has updates. Rebasing..."

  # Stash changes
  git stash

  # Update main
  git checkout $MAIN_BRANCH
  git pull --rebase origin $MAIN_BRANCH

  # Rebase current branch
  git checkout $CURRENT_BRANCH
  git rebase $MAIN_BRANCH

  # Restore stash
  git stash pop

  echo "✅ Successfully synced with main"
else
  echo "✅ Already up to date"
fi
```

### Release Automation

```bash
#!/bin/bash
# release.sh

VERSION=$1
if [ -z "$VERSION" ]; then
  echo "Usage: ./release.sh <version>"
  exit 1
fi

# Ensure clean working directory
if [[ -n $(git status -s) ]]; then
  echo "❌ Working directory not clean"
  exit 1
fi

# Update version
npm version $VERSION --no-git-tag-version

# Build
npm run build

# Commit
git add package.json package-lock.json
git commit -m "chore: release v$VERSION"

# Tag
git tag -a "v$VERSION" -m "Release v$VERSION"

# Push
git push origin main --tags

echo "✅ Released v$VERSION"
```

## GitHub Actions Integration

```yaml
# .github/workflows/ci.yml
name: CI

on:
  pull_request:
    branches: [main]
  push:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0  # Full history for better diffs

      - name: Get changed files
        id: changed-files
        uses: tj-actions/changed-files@v40
        with:
          files: |
            **/*.ts
            **/*.tsx

      - name: Run tests on changed files
        if: steps.changed-files.outputs.any_changed == 'true'
        run: |
          npm test -- ${{ steps.changed-files.outputs.all_changed_files }}

  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm run lint

  semantic-release:
    needs: [test, lint]
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: cycjimmy/semantic-release-action@v4
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

## Git Aliases

```bash
# ~/.gitconfig
[alias]
  # Shortcuts
  co = checkout
  ci = commit
  st = status
  br = branch

  # Logging
  lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
  recent = for-each-ref --count=10 --sort=-committerdate refs/heads/ --format='%(refname:short)'

  # Workflow
  undo = reset --soft HEAD~1
  amend = commit --amend --no-edit
  sync = !git fetch origin && git rebase origin/main
  cleanup = !git branch --merged | grep -v '\\*\\|main\\|develop' | xargs -n 1 git branch -d

  # Review
  diff-staged = diff --staged
  contributors = shortlog --summary --numbered --email
```

## Best Practices

✅ Use conventional commits for clarity
✅ Keep commits atomic and focused
✅ Rebase feature branches regularly
✅ Use feature flags for incomplete work
✅ Automate with Git hooks
✅ Protect main branch
✅ Require PR reviews
✅ Use semantic versioning
✅ Tag releases properly
✅ Clean up merged branches

---

**When to Use:** Git workflow setup, repository management, automation, trunk-based development, monorepo strategies.

Overview

This skill provides expert guidance for advanced Git workflows, trunk-based development, monorepo strategies, and Git automation. It distills practical commands, automation patterns, and governance rules to keep large TypeScript codebases stable and fast to iterate. Use it to design repeatable processes for branching, commits, CI, and release flows.

How this skill works

I inspect current workflow pain points and recommend concrete changes: branch protection, conventional commit enforcement, pre-commit and commit-msg hooks, and targeted CI steps. I provide commands and scripts you can copy to implement sparse checkouts, worktrees, interactive rebases, cherry-pick patterns, bisect workflows, and release automation. I also map these practices into CI/CD with GitHub Actions and Git aliases to speed daily developer tasks.

When to use it

  • Designing or migrating to trunk-based development for faster integration
  • Consolidating many repositories into a monorepo while minimizing local checkout costs
  • Automating sync, release, and test workflows for a TypeScript ecosystem
  • Enforcing commit conventions and pre-merge quality gates
  • Troubleshooting regressions with bisect or backporting fixes across branches

Best practices

  • Enforce conventional commits and validate messages with commitlint
  • Protect main with no direct commits, required reviews, and CI checks
  • Keep feature branches short-lived and rebase frequently onto main
  • Use husky + lint-staged to lint and test staged changes before commit
  • Adopt sparse-checkout and worktrees in large monorepos to reduce local overhead

Example use cases

  • Implement an auto-sync script to rebase feature branches onto an updated main automatically
  • Set up GitHub Actions that run tests only on changed files and gate merges to main
  • Migrate 53 repositories into a unified monorepo and enable sparse-checkout for developers
  • Create release automation that builds, tags, and pushes releases with a single command
  • Use interactive rebase and autosquash to produce clean commit history before PR

FAQ

How do I keep local clones lightweight in a large monorepo?

Use git clone --filter=blob:none --sparse, then git sparse-checkout set to pull only needed paths; combine with CI builds that have full context.

When should I rebase vs merge?

Rebase to maintain a linear history for short-lived feature branches; use merge when preserving merge commits adds useful context for long-lived branches.

How do I prevent accidental commits to main?

Add a pre-commit hook that rejects commits on main and enable branch protection rules in your Git host requiring PRs and passing CI.