UNPKG

homebridge-rabbitair

Version:
779 lines (579 loc) 14 kB
--- name: git-workflow description: Git workflows including branching strategies, commits, changesets, and collaborative development patterns --- # Git Workflow Guide Use this skill for git operations, branching strategies, commit conventions, changeset workflows, and collaborative development. ## Branch Management ### Branch Naming Conventions ```bash # Feature branches feature/user-authentication feature/add-dark-mode # Bug fixes fix/login-validation fix/memory-leak # Hotfixes (critical production issues) hotfix/security-patch hotfix/payment-failure # Refactoring refactor/user-service refactor/database-layer # Documentation docs/api-reference docs/contributing-guide # Chores/maintenance chore/update-dependencies chore/cleanup-tests ``` ### Creating and Switching Branches ```bash # Create and switch to new branch git checkout -b feature/new-feature # Switch to existing branch git checkout main # Create branch from specific commit git checkout -b fix/bug <commit-hash> # Delete branch (local) git branch -d feature/completed-feature # Delete branch (force) git branch -D feature/abandoned-feature # Delete remote branch git push origin --delete feature/old-feature # List all branches git branch -a # List remote branches git branch -r ``` ### Branch Workflows **Feature Branch Workflow**: ```bash # 1. Create feature branch from main git checkout main git pull origin main git checkout -b feature/new-feature # 2. Make changes and commit git add . git commit -m "feat: add new feature" # 3. Push to remote git push -u origin feature/new-feature # 4. Create PR, review, merge # 5. Delete feature branch git checkout main git pull origin main git branch -d feature/new-feature ``` **Gitflow Workflow**: ```bash # Main branches: main (production) and develop (integration) # Create feature from develop git checkout develop git checkout -b feature/new-feature # Merge feature to develop git checkout develop git merge --no-ff feature/new-feature # Create release branch git checkout -b release/v1.2.0 develop # Merge release to main and develop git checkout main git merge --no-ff release/v1.2.0 git tag -a v1.2.0 -m "Release v1.2.0" git checkout develop git merge --no-ff release/v1.2.0 # Hotfix from main git checkout -b hotfix/critical-bug main # ... fix bug ... git checkout main git merge --no-ff hotfix/critical-bug git tag -a v1.2.1 -m "Hotfix v1.2.1" git checkout develop git merge --no-ff hotfix/critical-bug ``` ## Commit Conventions ### Conventional Commits Format: `<type>(<scope>): <subject>` **Types**: - `feat`: New feature - `fix`: Bug fix - `docs`: Documentation only - `style`: Formatting, missing semi-colons, etc. - `refactor`: Code change that neither fixes a bug nor adds a feature - `perf`: Performance improvement - `test`: Adding or updating tests - `chore`: Maintenance tasks, dependencies - `ci`: CI/CD changes - `build`: Build system changes **Examples**: ```bash git commit -m "feat(auth): add OAuth2 login" git commit -m "fix(api): handle null response from server" git commit -m "docs(readme): update installation instructions" git commit -m "refactor(user-service): extract validation logic" git commit -m "test(calculator): add edge case tests" git commit -m "chore(deps): upgrade react to v18" ``` ### Breaking Changes ```bash git commit -m "feat(api)!: change user endpoint response format BREAKING CHANGE: User endpoint now returns array instead of object. Migration guide: Update client code to handle array response." ``` ### Multi-line Commits ```bash git commit -m "feat(payment): add Stripe integration" -m " - Add Stripe SDK dependency - Create payment service - Add webhook handler - Add tests for payment flow " ``` ## Changesets Workflow ### Setup Changesets ```bash pnpm add -D @changesets/cli pnpm changeset init ``` This creates `.changeset/config.json`: ```json { "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", "changelog": "@changesets/cli/changelog", "commit": false, "fixed": [], "linked": [], "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", "ignore": [] } ``` ### Creating Changesets ```bash # 1. Make code changes # 2. Create changeset pnpm changeset # You'll be prompted: # - Select packages to bump # - Choose bump type (major/minor/patch) # - Write summary ``` This creates `.changeset/random-name.md`: ```markdown --- "@myorg/package-a": minor "@myorg/package-b": patch --- Add new feature X and fix bug Y in package B ``` ### Versioning Packages ```bash # Apply changesets and bump versions pnpm changeset version # This: # - Updates package.json versions # - Updates CHANGELOG.md # - Deletes changeset files # - Updates dependencies ``` ### Publishing ```bash # Build packages pnpm -r build # Publish to npm pnpm changeset publish # Push tags to GitHub git push --follow-tags ``` ### Complete Changeset Workflow ```bash # 1. Create feature branch git checkout -b feature/new-api # 2. Make changes # ... code changes ... # 3. Create changeset pnpm changeset # Select: @myorg/api (minor) # Summary: "Add new endpoint for user profile" # 4. Commit changeset git add .changeset/ git commit -m "feat(api): add user profile endpoint" # 5. Push and create PR git push -u origin feature/new-api # 6. After PR approval and merge to main git checkout main git pull origin main # 7. Version packages (on main branch) pnpm changeset version # 8. Commit version changes git add . git commit -m "chore: version packages" # 9. Build and publish pnpm -r build pnpm changeset publish # 10. Push tags git push --follow-tags ``` ### Changeset Pre-releases ```bash # Enter pre-release mode pnpm changeset pre enter beta # Create changesets as normal pnpm changeset # Version with pre-release tag pnpm changeset version # Creates versions like: 1.2.0-beta.0 # Publish pnpm changeset publish --tag beta # Exit pre-release mode pnpm changeset pre exit ``` ## Collaborative Development ### Syncing with Remote ```bash # Fetch latest changes git fetch origin # Pull and merge git pull origin main # Pull and rebase git pull --rebase origin main # Update all remote branches git fetch --all # Show remote info git remote -v git remote show origin ``` ### Resolving Conflicts ```bash # During merge/rebase, conflicts occur git status # Shows conflicted files # 1. Open conflicted files and resolve # Look for conflict markers: # <<<<<<< HEAD # Your changes # ======= # Their changes # >>>>>>> branch-name # 2. After resolving, mark as resolved git add conflicted-file.ts # 3. Continue merge/rebase git merge --continue # or git rebase --continue # Abort if needed git merge --abort git rebase --abort ``` ### Stashing Changes ```bash # Stash current changes git stash # Stash with message git stash save "WIP: feature X" # List stashes git stash list # Apply most recent stash git stash apply # Apply and remove stash git stash pop # Apply specific stash git stash apply stash@{2} # Show stash contents git stash show -p stash@{0} # Drop stash git stash drop stash@{0} # Clear all stashes git stash clear ``` ### Cherry-picking ```bash # Apply specific commit to current branch git cherry-pick <commit-hash> # Cherry-pick multiple commits git cherry-pick <hash1> <hash2> # Cherry-pick range git cherry-pick <hash1>^..<hash2> # Cherry-pick without committing git cherry-pick --no-commit <hash> ``` ## Rewriting History ### Interactive Rebase ```bash # Rebase last 3 commits git rebase -i HEAD~3 # In editor, choose action: # pick = use commit # reword = change commit message # edit = stop to amend commit # squash = merge with previous commit # fixup = like squash, but discard message # drop = remove commit # Example: # pick abc1234 feat: add feature A # squash def5678 fix: typo in feature A # reword ghi9012 docs: update README ``` ### Amending Commits ```bash # Amend last commit git commit --amend # Amend without changing message git commit --amend --no-edit # Add files to last commit git add forgotten-file.ts git commit --amend --no-edit ``` ### Resetting ```bash # Soft reset (keep changes staged) git reset --soft HEAD~1 # Mixed reset (keep changes unstaged) git reset HEAD~1 # Hard reset (discard all changes) git reset --hard HEAD~1 # Reset to specific commit git reset --hard <commit-hash> # Undo reset (if needed) git reflog git reset --hard HEAD@{1} ``` ## Tags ### Creating Tags ```bash # Lightweight tag git tag v1.0.0 # Annotated tag (recommended) git tag -a v1.0.0 -m "Release version 1.0.0" # Tag specific commit git tag -a v1.0.0 <commit-hash> -m "Release v1.0.0" # List tags git tag git tag -l "v1.*" # Show tag info git show v1.0.0 ``` ### Pushing Tags ```bash # Push single tag git push origin v1.0.0 # Push all tags git push origin --tags # Push with commits git push --follow-tags ``` ### Deleting Tags ```bash # Delete local tag git tag -d v1.0.0 # Delete remote tag git push origin --delete v1.0.0 ``` ## Advanced Workflows ### Worktrees Work on multiple branches simultaneously: ```bash # Create worktree git worktree add ../my-feature feature/my-feature # List worktrees git worktree list # Remove worktree git worktree remove ../my-feature # Prune deleted worktrees git worktree prune ``` ### Bisect (Find Bug Introduction) ```bash # Start bisect git bisect start # Mark current commit as bad git bisect bad # Mark known good commit git bisect good <commit-hash> # Git will checkout commits for you to test # After testing each: git bisect good # if bug not present git bisect bad # if bug present # Once found: git bisect reset ``` ### Submodules ```bash # Add submodule git submodule add https://github.com/user/repo.git path/to/submodule # Clone repo with submodules git clone --recurse-submodules <repo-url> # Initialize submodules in existing clone git submodule init git submodule update # Update submodules git submodule update --remote # Remove submodule git submodule deinit path/to/submodule git rm path/to/submodule rm -rf .git/modules/path/to/submodule ``` ## Git Hooks ### Pre-commit Hook Create `.git/hooks/pre-commit`: ```bash #!/bin/bash # Run linter pnpm lint if [ $? -ne 0 ]; then echo "Linting failed. Commit aborted." exit 1 fi # Run tests pnpm test if [ $? -ne 0 ]; then echo "Tests failed. Commit aborted." exit 1 fi ``` ### Using simple-git-hooks ```bash pnpm add -D simple-git-hooks lint-staged ``` In `package.json`: ```json { "simple-git-hooks": { "pre-commit": "pnpm lint-staged" }, "lint-staged": { "*.ts": [ "oxlint --fix", "oxfmt" ], "*.{json,md}": [ "oxfmt" ] } } ``` Install hooks: ```bash pnpm exec simple-git-hooks ``` ## Troubleshooting ### Undo Last Push (Dangerous!) ```bash # Force push previous commit git reset --hard HEAD~1 git push --force origin main # Only do this if no one else has pulled! ``` ### Recover Deleted Branch ```bash # Find branch's last commit git reflog # Recreate branch git checkout -b recovered-branch <commit-hash> ``` ### Fix Detached HEAD ```bash # Create new branch from detached HEAD git checkout -b temp-branch # Or go back to main git checkout main ``` ### Clean Untracked Files ```bash # Show what would be deleted git clean -n # Delete untracked files git clean -f # Delete untracked files and directories git clean -fd # Include ignored files git clean -fdx ``` ## Git Configuration ### User Settings ```bash # Set name and email git config --global user.name "Your Name" git config --global user.email "you@example.com" # Set default editor git config --global core.editor "code --wait" # Set default branch name git config --global init.defaultBranch main ``` ### Aliases ```bash # Create aliases git config --global alias.st status git config --global alias.co checkout git config --global alias.br branch git config --global alias.ci commit git config --global alias.unstage 'reset HEAD --' git config --global alias.last 'log -1 HEAD' git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" # Use aliases git st git co -b new-branch git lg ``` ### .gitignore ```gitignore # Dependencies node_modules/ .pnp .pnp.js # Build output dist/ build/ *.tsbuildinfo # Environment .env .env.local .env.*.local # IDE .vscode/ .idea/ *.swp *.swo # OS .DS_Store Thumbs.db # Logs *.log logs/ # Test coverage coverage/ # Temporary files *.tmp temp/ ``` ## Best Practices 1. **Commit Often**: Small, focused commits are easier to review and revert 2. **Write Clear Messages**: Follow conventional commits 3. **Pull Before Push**: Always sync with remote before pushing 4. **Use Branches**: Never commit directly to main 5. **Review Before Committing**: Use `git diff` to check changes 6. **Clean History**: Rebase feature branches to keep linear history 7. **Tag Releases**: Use semantic versioning for tags 8. **Protect Main**: Use branch protection rules on GitHub 9. **Document Workflows**: Keep team workflow documented 10. **Use Hooks**: Automate checks with pre-commit hooks ## Quick Reference | Command | Description | |---------|-------------| | `git status` | Show working tree status | | `git diff` | Show changes | | `git add <file>` | Stage file | | `git commit -m "msg"` | Commit staged changes | | `git push` | Push to remote | | `git pull` | Fetch and merge | | `git checkout <branch>` | Switch branch | | `git checkout -b <branch>` | Create and switch branch | | `git merge <branch>` | Merge branch | | `git rebase <branch>` | Rebase current branch | | `git log` | Show commit history | | `git reflog` | Show reference log | | `git stash` | Stash changes | | `git tag <name>` | Create tag | ## Resources - Conventional Commits: https://www.conventionalcommits.org/ - Changesets: https://github.com/changesets/changesets - Git Documentation: https://git-scm.com/doc - Atlassian Git Tutorials: https://www.atlassian.com/git/tutorials