11 KiB
name: git description: Expert Git workflow assistant. Use this skill whenever the user mentions anything related to Git: writing commit messages, branching, pull requests, merging, rebasing, resolving conflicts, .gitignore files, changelogs, tagging, stashing, cherry-picking, or undoing changes. Also trigger when the user says "commit", "push", "branch", "PR", "merge", "rebase", "diff", or asks "how do I undo" — even if they don't say "Git" explicitly.
Git Workflow Skill
Provide expert, context-aware Git guidance. Prefer concise, ready-to-run commands over lengthy explanations. Always tailor advice to the user's apparent workflow (solo dev, team, open-source fork, CI/CD pipeline, etc.).
1. Commit Messages
Use the Conventional Commits format by default unless the user has their own convention:
<type>[optional scope]: <short description>
[optional body – what and why, not how]
[optional footer(s): BREAKING CHANGE, Closes #123, Co-authored-by: …]
Types
| Type | When to use |
|---|---|
feat |
New feature (bumps MINOR in SemVer) |
fix |
Bug fix (bumps PATCH) |
docs |
Documentation only |
style |
Formatting, whitespace (no logic change) |
refactor |
Code change that is neither fix nor feat |
perf |
Performance improvement |
test |
Adding or correcting tests |
build |
Build system or dependency changes |
ci |
CI/CD configuration |
chore |
Maintenance tasks, no production code change |
revert |
Reverts a previous commit |
Breaking changes: append ! after the type (feat!:) and/or add BREAKING CHANGE: <description> in the footer.
Workflow for generating a commit message
- Look at the staged diff (
git diff --cached) or the user's description. - Pick the correct
typeand optionalscope(module, file area, or feature). - Write the description in the imperative mood, lowercase, no trailing period (≤72 chars).
- Always write a body — even for small changes. The body must be understandable without reading the diff. See domain-specific rules below.
- Add footers for issue references (
Closes #42), breaking changes, or co-authors.
Domain-specific body rules
These rules define the minimum context a body must contain depending on what was changed.
Skill changes (files under .github/skills/):
- Name the skill (e.g. "git skill", "claude-api skill").
- Name the section or rule that was changed.
- Explain why it was changed (what problem it solves).
Agent or prompt config changes (files under .github/agents/, .github/prompts/):
- Name the agent or prompt file.
- Describe what the file does / what instruction was added or changed.
- State the motivation.
Migration steps (files under Migration/, Sources/, Tests/):
- State the step number and title (e.g. "Step 3 – Netzwerkschicht").
- List which files or modules were created or changed.
- Call out significant decisions explicitly:
- Libraries or frameworks chosen (and why, if relevant)
- Architectural patterns introduced (e.g. MVVM, repository pattern, protocol-oriented design)
- APIs, protocols or data models defined
- Deviations from the original migration plan
General fallback rule: the body answers "what was done and why" for a reader who has no access to the diff.
Example – skill change:
chore(git): always write a commit body with domain-specific context
git skill, section "Workflow for generating a commit message":
Added mandatory body rules per change category (skills, agents,
migration steps) so commit history is readable without the diff.
Previously the body was optional and often omitted.
Example – migration step:
feat(migration): implement Step 3 – Netzwerkschicht
Sources/HVACore/Networking/:
- APIClient.swift: generic async/await HTTP client using URLSession
- Endpoint.swift: protocol defining path, method, and body encoding
- AuthInterceptor.swift: injects Bearer token from KeychainService
Decision: chose native URLSession over Alamofire to avoid third-party
dependency; conforms to the architecture defined in Step 2.
Example – feature with issue reference:
feat(auth): add OAuth2 login via GitHub
Users can now sign in with their GitHub account instead of
creating a separate password. Token is stored in an httpOnly cookie.
Closes #88
Example – breaking API change:
feat(api)!: rename /users endpoint to /accounts
BREAKING CHANGE: All clients must update their base URL from /users to /accounts.
2. Branch Naming
| Pattern | Purpose |
|---|---|
main / master |
Production-ready code |
develop |
Integration branch (Gitflow) |
feature/<ticket-or-slug> |
New feature work |
fix/<ticket-or-slug> |
Bug fix |
hotfix/<slug> |
Urgent production patch |
release/<version> |
Release preparation |
chore/<slug> |
Maintenance / tooling |
Keep branch names lowercase, hyphen-separated, ideally scoped to a ticket ID: feature/PROJ-42-user-profile.
Commands:
git switch -c feature/PROJ-42-user-profile # create + switch (modern)
git push -u origin feature/PROJ-42-user-profile
3. Pull Request / Merge Request Descriptions
A good PR description contains:
- What – one-sentence summary of the change.
- Why – motivation, linked issue.
- How – relevant implementation decisions (optional for small PRs).
- Testing – what was tested, test commands.
- Screenshots / recordings (for UI changes).
- Checklist –
[ ] Tests pass,[ ] Docs updated,[ ] No secrets committed.
4. Common Operations – Quick Reference
Undo / Fix
| Goal | Command |
|---|---|
| Unstage a file | git restore --staged <file> |
| Discard local changes in file | git restore <file> |
| Undo last commit, keep changes staged | git reset --soft HEAD~1 |
| Undo last commit, keep changes unstaged | git reset HEAD~1 |
| Undo last commit, discard changes | git reset --hard HEAD~1 ⚠️ |
| Revert a pushed commit safely | git revert <sha> |
| Fix last commit message | git commit --amend -m "new message" |
| Add forgotten file to last commit | git add <file>; git commit --amend --no-edit |
⚠️
--hardandgit push --forceare destructive. Warn the user before suggesting them, especially on shared branches.
Stash
git stash push -m "WIP: my description" # save
git stash list # view
git stash pop # restore latest
git stash apply stash@{2} # restore specific
git stash drop stash@{0} # delete
Rebase
# Update feature branch on top of main
git switch feature/my-branch
git fetch origin
git rebase origin/main
# Interactive rebase to clean up last 5 commits
git rebase -i HEAD~5
Interactive rebase actions: pick, reword, edit, squash (s), fixup (f), drop (d).
Abort a rebase at any time: git rebase --abort.
Cherry-pick
git cherry-pick <sha> # apply one commit
git cherry-pick <sha1>..<sha2> # apply a range
git cherry-pick --no-commit <sha> # stage without committing
Tags / Releases
git tag -a v1.2.3 -m "Release v1.2.3"
git push origin v1.2.3
git push origin --tags # push all tags
5. Merge Conflict Resolution
- Run
git statusto see conflicted files. - Open each file — find
<<<<<<< HEAD … ======= … >>>>>>> branchmarkers. - Edit to keep the correct code, remove all markers.
git add <resolved-file>for each file.git commit(merge) orgit rebase --continue(rebase).
Use a visual tool when helpful:
git mergetool # uses configured diff tool
git config --global merge.tool vscode
6. .gitignore
When asked to create or update a .gitignore:
- Identify the language/framework/OS from context.
- Use the patterns from gitignore.io as a baseline.
- Add project-specific entries (secrets files, local config, build artifacts).
Useful commands:
git check-ignore -v <file> # why is a file ignored?
git rm --cached <file> # stop tracking a file already committed
7. Changelog Generation
When asked to write a CHANGELOG, derive entries from git log:
git log v1.0.0..HEAD --oneline --no-merges
Format using Keep a Changelog:
## [Unreleased]
### Added
- …
### Changed
- …
### Fixed
- …
### Removed
- …
## [1.2.0] – 2026-04-22
### Added
- feat(auth): add OAuth2 login via GitHub
Group Conventional Commits by type: feat → Added, fix → Fixed, refactor/perf → Changed, revert + removals → Removed.
8. Safety Rules
- Never suggest
git push --forceonmain/master. Use--force-with-leaseon personal branches. - Warn before any
--hardreset or history-rewriting command. - Never include secrets, tokens, or passwords in example commands.
- When the user is on a team, prefer
git revertover history rewriting for shared commits.
9. After Every Commit
After executing a git commit, always display the following summary as plain text in the response (no code block, no separate box):
Commit: <short-sha>
Branch: <branch>
Message:
<commit message body, if present>
Example output:
Commit: 2e4cc9de
Branch: master
Message:
chore(git): enrich commit messages with mandatory domain-specific context
git skill, section 'Workflow for generating a commit message':
- Step 4 changed from optional to mandatory body
- Added new section 'Domain-specific body rules'
Motivation: commit history should be readable by a user without access to the diff or full repository context.