Skip to content
Back to skills

Git Cli Agentic

ASecurity

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.

  • 58 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added February 8, 2026
developmentbashexpressgitapi

Works with

  • claude code
  • cli
  • api

Security analysis

A100/100

Scanned September 25, 2026

npx -y skills add laurigates/claude-plugins --skill git-cli-agentic --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Git Cli Agentic?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Git Cli Agentic
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/laurigates-git-cli-agentic/badge)](https://www.skillsdirectory.com/skills/laurigates-git-cli-agentic)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: git-cli-agentic
description: 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.
user-invocable: false
allowed-tools: Bash(git status *), Bash(git diff *), Bash(git log *), Bash(git branch *), Bash(git remote *), Bash(git add *), Bash(git commit *), Bash(git push *), Bash(git restore *), Read
created: 2025-01-16
modified: 2026-09-24
reviewed: 2026-04-25
---

# 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` mode | Use `gh-cli-agentic` for `gh` JSON queries against the GitHub API |
| Needing `--porcelain=v2` status, `--numstat` diff counts, or custom `--format` log placeholders | Use `git-commit-workflow` for staging conventions and commit message structure |
| Reading branch tracking info or main-branch-development push patterns | Use `git-branch-pr-workflow` for the broader branch + PR design choices |
| Producing deterministic output for parsers and downstream tooling | Use `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:**
```bash
git status
git log --oneline -5
git diff --stat
```

The `-C` flag is only needed when targeting a different repository from your current directory:
```bash
# 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

```bash
# 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**:

| Code | Meaning |
|------|---------|
| M | Modified |
| A | Added |
| D | Deleted |
| R | Renamed |
| C | Copied |
| ? | Untracked |
| ! | Ignored |

### Quick Checks

```bash
# 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

```bash
# 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

```bash
# Unstaged changes
git diff --numstat

# Staged changes
git diff --cached --numstat

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

### Specific Comparisons

```bash
# 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:

| Pathspec | `src/proxy.ts` | `src/lib/a.ts` |
|----------|:---:|:---:|
| `'src/**/*.ts'` | no (needs a second `/`) | yes |
| `':(glob)src/**/*.ts'` | yes | yes |
| `'src/*.ts'` | yes | yes (`*` crosses `/`) |
| `':(glob)src/*.ts'` | yes | no |

```bash
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

```bash
# 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**:

| Placeholder | Meaning |
|-------------|---------|
| `%H` | Full commit hash |
| `%h` | Short hash |
| `%s` | Subject |
| `%b` | Body |
| `%an` | Author name |
| `%ae` | Author email |
| `%ad` | Author date |
| `%cn` | Committer name |

### Filtering

```bash
# 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

```bash
# 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

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

# Output: <behind>\t<ahead>
```

## Remote Operations

```bash
# 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

```bash
# 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

```bash
# 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

```bash
# 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

| Context | Command |
|---------|---------|
| Quick status | `git status --porcelain=v2 --branch` |
| Changed files | `git diff --name-status` |
| Staged changes | `git diff --cached --numstat` |
| Recent commits | `git log --format='%h %s' -n 5` |
| Branch tracking | `git branch -vv --format='%(refname:short) %(upstream:track)'` |
| Current branch | `git 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+):

```markdown
- 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:

```bash
# 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

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.