git-cli-agentic

v2026.09.24

Git commands with porcelain and machine-readable output for agent workflows. Use when scripting status/diff/log, porcelain=v2, --numstat counts, custom --format placeholders, or branch tracking info.

GitHub
安装命令
npx skhub add laurigates/git-cli-agentic
Markdown
SKILL.md

Git CLI Agentic Patterns

When to Use This Skill

Use this skill when...Use the alternative when...
Writing scriptable git status/diff/log calls in porcelain or --format modeUse gh-cli-agentic for gh JSON queries against the GitHub API
Needing --porcelain=v2 status, --numstat diff counts, or custom --format log placeholdersUse git-commit-workflow for staging conventions and commit message structure
Reading branch tracking info or main-branch-development push patternsUse git-branch-pr-workflow for the broader branch + PR design choices
Producing deterministic output for parsers and downstream toolingUse git-derive-docs to mine commit history for rules/PRDs/ADRs/PRPs

Optimized git commands for AI agent consumption using porcelain output and stable formats.

Core Principle

Use --porcelain for machine-readable output that remains stable across Git versions and user configurations.

Working Directory

Run git commands directly — your working directory is the repo:

git status
git log --oneline -5
git diff --stat

The -C flag is only needed when targeting a different repository from your current directory:

# Submodule: run command against parent repo
git -C "$(git rev-parse --show-toplevel)" remote get-url origin

# Script: iterate over multiple repos
for repo in repos/*; do
  git -C "$repo" status --porcelain
done

Status Operations

Porcelain Status

# Version 2 porcelain with branch info (recommended)
git status --porcelain=v2 --branch

# Version 1 porcelain (simpler)
git status --porcelain

# Short format (human-readable but stable)
git status --short --branch

Porcelain v2 Format:

# branch.oid <commit>
# branch.head <branch>
# branch.upstream <upstream>
# branch.ab +<ahead> -<behind>
1 <XY> <sub> <mH> <mI> <mW> <hH> <hI> <path>
2 <XY> <sub> <mH> <mI> <mW> <hH> <hI> <X><score> <path><tab><origPath>
? <path>
! <path>

Status Codes:

CodeMeaning
MModified
AAdded
DDeleted
RRenamed
CCopied
?Untracked
!Ignored

Quick Checks

# Check if clean (empty output = clean)
git status --porcelain

# Count changed files
git status --porcelain | wc -l

# Check for uncommitted changes
git diff --quiet || echo "has changes"

Diff Operations

Stat Output

# File change summary
git diff --stat

# Numeric stats (machine-readable)
git diff --numstat

# Name and status only
git diff --name-status

# Names only
git diff --name-only

Numstat Format: <added>\t<deleted>\t<filename>

Staged vs Unstaged

# Unstaged changes
git diff --numstat

# Staged changes
git diff --cached --numstat

# Both (working tree vs HEAD)
git diff HEAD --numstat

Specific Comparisons

# Against specific commit
git diff $COMMIT --numstat

# Between branches
git diff main..feature --numstat

# Between commits
git diff $COMMIT1..$COMMIT2 --name-status

Pathspecs: use :(glob) for **

A plain git pathspec is not a gitignore-style glob. Without magic, * matches across / and ** is just two of them, so a filter can silently miss files:

Pathspecsrc/proxy.tssrc/lib/a.ts
'src/**/*.ts'no (needs a second /)yes
':(glob)src/**/*.ts'yesyes
'src/*.ts'yesyes (* crosses /)
':(glob)src/*.ts'yesno
git diff --name-only origin/main...HEAD -- ':(glob)src/**/*.ts'

The miss produces no error, only a shorter file list. A changed-files step that feeds CI checks then skips top-level files without anyone noticing. Test a new pathspec against a repo that has both top-level and nested matches.

Log Operations

Custom Format

# Hash and subject only
git log --format='%H %s' -n 10

# Oneline (built-in)
git log --oneline -n 10

# With stats
git log --oneline --stat -n 5

# Machine-parseable with multiple fields
git log --format='%H|%an|%ae|%s' -n 10

Format Placeholders:

PlaceholderMeaning
%HFull commit hash
%hShort hash
%sSubject
%bBody
%anAuthor name
%aeAuthor email
%adAuthor date
%cnCommitter name

Filtering

# By author
git log --author="name" --oneline -n 10

# By date range
git log --since="2025-01-01" --oneline

# By path
git log --oneline -n 10 -- path/to/file

# Merge commits only
git log --merges --oneline -n 5

Branch Operations

Branch Info

# List with tracking info
git branch -vv

# Formatted output
git branch --format='%(refname:short) %(upstream:short) %(upstream:track)'

# Current branch only
git branch --show-current

# Remote branches
git branch -r --format='%(refname:short)'

Tracking Status

# Ahead/behind count
git rev-list --left-right --count origin/main...HEAD

# Output: <behind>\t<ahead>

Remote Operations

# List remotes with URLs
git remote -v

# Get specific remote URL
git remote get-url origin

# Show remote details
git remote show origin

Staging Operations

# Stage specific files
git add path/to/file

# Stage all modified tracked files
git add -u

# Stage everything
git add -A

# Unstage file
git restore --staged path/to/file

# Discard changes
git restore path/to/file

Commit Operations

# Simple commit
git commit -m "message"

# With body (heredoc)
# Inside <<'EOF' (quoted delimiter), backticks, $, and \ are already
# literal — never backslash-escape them, or the backslash survives into
# the commit message.
git commit -m "$(cat <<'EOF'
Subject line

Body paragraph with `code` and $vars written verbatim.

Co-Authored-By: Name <email>
EOF
)"

# Amend last commit (use carefully)
git commit --amend -m "new message"

Push Operations

# Push current branch
git push origin HEAD

# Push to different remote branch (main-branch development)
git push origin main:feature-branch

# Push commit range
git push origin start^..end:feature-branch

# Set upstream
git push -u origin HEAD

Agentic Optimizations

ContextCommand
Quick statusgit status --porcelain=v2 --branch
Changed filesgit diff --name-status
Staged changesgit diff --cached --numstat
Recent commitsgit log --format='%h %s' -n 5
Branch trackinggit branch -vv --format='%(refname:short) %(upstream:track)'
Current branchgit branch --show-current

Error Handling in Context

Use 2>/dev/null to suppress errors in context expressions (do NOT use || fallbacks - blocked by Claude Code 2.1.7+):

- Git status: !`git status --porcelain=v2 --branch`
- Current branch: !`git branch --show-current`
- Remote URL: !`git remote -v`

Combining with GH CLI

For GitHub-specific operations, combine with gh commands:

# Get repo owner/name
gh repo view --json nameWithOwner --jq '.nameWithOwner'

# Then use in git operations
git push origin main:$(gh pr view --json headRefName --jq '.headRefName')

Best Practices

  1. Use porcelain v2 for status when parsing programmatically
  2. Use --numstat for diff when counting changes
  3. Use custom --format for log when extracting specific fields
  4. Always add 2>/dev/null fallback in context expressions
  5. Prefer git switch/restore over checkout for clarity
发现
标签

此技能尚未发布标签。

版本
最新版本元数据

版本

v2026.09.24

发布时间

2026年9月24日

分类

未分类

许可证

MIT

源路径

git-plugin/skills/git-cli-agentic

默认分支

main

最新提交

1668324

Tree SHA

b2d4cc3