Skip to main content

git-environment

Create development environments with git worktrees, branches, commits, and push to remote. Auto-applies for git workflow tasks.

Source facts

Repository
openshift/hypershift
Last source activity
February 9, 2026 at 11:12
Detected SKILL.md language
English
Stars
546
Forks
578

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
Git Environment
description
Create development environments with git worktrees, branches, commits, and push to remote. Auto-applies for git workflow tasks.
# Git Development Environment Workflow Automates common git development workflows for HyperShift including worktree creation, branching, committing (with proper format), and pushing to remotes. ## Configuration Load environment variables from `dev/claude-env.sh`: ```bash source dev/claude-env.sh ``` ### Environment Variables | Variable | Default | Description | |----------|---------|-------------| | `GIT_FORK_REMOTE` | `enxebre` | Your fork remote name | | `GIT_UPSTREAM_REMOTE` | `origin` | Upstream remote (openshift/hypershift) | | `GIT_BASE_BRANCH` | `main` | Base branch for new features | ## Workflows ### Create New Development Environment **With worktree (parallel development):** ```bash # Fetch latest git fetch $GIT_UPSTREAM_REMOTE $GIT_BASE_BRANCH # Create worktree with new branch git worktree add -b <branch-name> <worktree-path> $GIT_UPSTREAM_REMOTE/$GIT_BASE_BRANCH # Example: git worktree add -b feat/privatelink-karpenter ../hs-privatelink $GIT_UPSTREAM_REMOTE/$GIT_BASE_BRANCH ``` **Without worktree (same repo):** ```bash # Fetch latest git fetch $GIT_UPSTREAM_REMOTE $GIT_BASE_BRANCH # Create and checkout new branch git checkout -b <branch-name> $GIT_UPSTREAM_REMOTE/$GIT_BASE_BRANCH # Example: git checkout -b fix/bug-123 $GIT_UPSTREAM_REMOTE/$GIT_BASE_BRANCH ``` ### Branch Naming Conventions Use conventional prefixes: - `feat/<description>` - New features - `fix/<description>` - Bug fixes - `docs/<description>` - Documentation - `refactor/<description>` - Code refactoring - `test/<description>` - Test additions - `chore/<description>` - Maintenance tasks ### Commit Changes **Always follow the git-commit-format skill for commits.** 1. **Stage changes:** ```bash git add <specific-files> ``` 2. **Check what's staged:** ```bash git status git diff --cached ``` 3. **Commit with proper format:** ```bash git commit -m "$(cat <<'EOF' <type>(<scope>): <description> [optional body] Signed-off-by: <name> <email> Commit-Message-Assisted-by: Claude (via Claude Code) EOF )" ``` 4. **Validate commit message:** ```bash make run-gitlint ``` ### Push to Remote **First push (set upstream):** ```bash git push -u $GIT_FORK_REMOTE <branch-name> ``` **Subsequent pushes:** ```bash git push ``` **Force push (after rebase):** ```bash # Always use --force-with-lease for safety git push --force-with-lease ``` ### Sync with Upstream ```bash # Fetch latest from upstream git fetch $GIT_UPSTREAM_REMOTE $GIT_BASE_BRANCH # Rebase current branch on base branch git rebase $GIT_UPSTREAM_REMOTE/$GIT_BASE_BRANCH # If conflicts, resolve them, then: git rebase --continue # Push updated branch (force required after rebase) git push --force-with-lease ``` ### Cleanup Worktree ```bash # Remove the worktree git worktree remove <worktree-path> # Optionally delete the branch git branch -D <branch-name> # Prune stale worktree references git worktree prune ``` ### List Worktrees ```bash git worktree list ``` ## Quick Reference Commands | Task | Command | |------|---------| | New worktree + branch | `git worktree add -b <branch> <path> $GIT_UPSTREAM_REMOTE/$GIT_BASE_BRANCH` | | New branch (no worktree) | `git checkout -b <branch> $GIT_UPSTREAM_REMOTE/$GIT_BASE_BRANCH` | | Stage all changes | `git add -A` | | Stage specific files | `git add <file1> <file2>` | | Check status | `git status` | | View staged diff | `git diff --cached` | | Commit | `git commit -m "<message>"` | | Validate commit | `make run-gitlint` | | Push (first time) | `git push -u $GIT_FORK_REMOTE <branch>` | | Push | `git push` | | Force push (safe) | `git push --force-with-lease` | | Sync with upstream | `git fetch $GIT_UPSTREAM_REMOTE $GIT_BASE_BRANCH && git rebase $GIT_UPSTREAM_REMOTE/$GIT_BASE_BRANCH` | | Remove worktree | `git worktree remove <path>` | | Delete branch | `git branch -D <branch>` | | List worktrees | `git worktree list` | ## Example Full Workflow ```bash # 0. Load environment source dev/claude-env.sh # 1. Create new feature environment git fetch $GIT_UPSTREAM_REMOTE $GIT_BASE_BRANCH git worktree add -b feat/aws-privatelink-subnets ../hs-privatelink $GIT_UPSTREAM_REMOTE/$GIT_BASE_BRANCH cd ../hs-privatelink # 2. Make changes... # ... edit files ... # 3. Stage and commit git add -A git commit -m "$(cat <<'EOF' feat(aws): add dynamic subnet discovery for privatelink Implement subnet discovery from Karpenter EC2NodeClass resources to ensure PrivateLink VPC Endpoints have ENIs in all required availability zones. Signed-off-by: Alberto Garcia <agarcia@redhat.com> Commit-Message-Assisted-by: Claude (via Claude Code) EOF )" # 4. Validate make run-gitlint # 5. Push to fork git push -u $GIT_FORK_REMOTE feat/aws-privatelink-subnets # 6. Create PR via gh cli gh pr create --title "feat(aws): add dynamic subnet discovery for privatelink" --body "..." # 7. After PR merged, cleanup cd ../hypershift git worktree remove ../hs-privatelink git branch -D feat/aws-privatelink-subnets ``` ## Notes - Always use `--force-with-lease` instead of `--force` for safety - Worktrees allow parallel development on multiple features - Each worktree shares the same git repository but has its own working directory - Run `git remote -v` to verify remote configuration - Configure your fork remote in `dev/claude-env.sh` by setting `GIT_FORK_REMOTE`
View on GitHub