Skip to content
Back to skills

Git Operations

ASecurity

Use when pushing, pulling, or merging changes. Handles retries, conflicts, and error recovery.

  • 20 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added February 7, 2026
toolsbashgit

Security analysis

A100/100

Scanned February 12, 2026

npx -y skills add changoo89/claude-pilot --skill git-operations --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Git Operations?

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

Security grade badge for Git Operations
[![Security: A β€” Skills Directory](https://www.skillsdirectory.com/api/skills/changoo89-git-operations/badge)](https://www.skillsdirectory.com/skills/changoo89-git-operations)

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-operations
description: Use when pushing, pulling, or merging changes. Handles retries, conflicts, and error recovery.
---

# SKILL: Git Operations

> **Purpose**: Safe push/pull/merge operations with retry logic and error handling
> **Target**: All git operations

---

## Quick Start

### When to Use This Skill
- Pushing changes to remote
- Pulling latest changes
- Merging branches
- Resolving merge conflicts

### Quick Reference
```bash
# Push with retry (3 attempts, 2s delay)
git_push_with_retry() {
  local branch="${1:-$(git rev-parse --abbrev-ref HEAD)}"
  for attempt in {1..3}; do
    git push origin "$branch" 2>&1 && return 0
    echo "Retry $attempt/3..." && sleep 2
  done
  return 1
}

# Pull with fast-forward only
git pull --ff-only || echo "Manual merge required"
```

---

## Core Operations

### Push with Retry

**Purpose**: Handle transient network failures with exponential backoff (3 attempts, 2s/4s/8s delay)

```bash
git_push_with_retry() {
  local remote="${1:-origin}"
  local branch="${2:-$(git rev-parse --abbrev-ref HEAD)}"
  local max_attempts=3
  local wait_times=(2 4 8)  # Exponential backoff

  echo "πŸ”„ Pushing to $remote/$branch..."

  for attempt in $(seq 1 $max_attempts); do
    # Attempt push
    if git push "$remote" "$branch" 2>&1; then
      echo "βœ“ Push successful"
      return 0
    fi

    local exit_code=$?
    local error_output="$(git push "$remote" "$branch" 2>&1 || true)"

    # Classify error
    if echo "$error_output" | grep -qiE "non-fast-forward|rejected|protected"; then
      echo "❌ Push rejected (non-fast-forward or protected branch)"
      echo "   Run: git pull --rebase && git push"
      return 1
    elif echo "$error_output" | grep -qiE "authentication|permission|credentials"; then
      echo "❌ Authentication error"
      echo "   Check git credentials: git config --list | grep credential"
      return 1
    fi

    # Retry for network/transient errors
    if [ $attempt -lt $max_attempts ]; then
      local wait_time=${wait_times[$((attempt-1))]}
      echo "⚠️  Push failed (attempt $attempt/$max_attempts), retrying in ${wait_time}s..."
      sleep "$wait_time"
    else
      echo "❌ Push failed after $max_attempts attempts"
      return 1
    fi
  done

  return 1
}
```

**Error Classification**:
- **Non-retryable** (return 1): non-fast-forward, rejected, protected branch, authentication
- **Retryable** (continue loop): network errors, connection timeout, transient failures
- **No remote** (handled by caller): Remote doesn't exist

**Retry Strategy**:
- Max attempts: 3
- Wait times: 2s, 4s, 8s (exponential backoff)
- Exit on non-retryable errors immediately

### Pull with Safety Checks

**Purpose**: Avoid destructive merges, ensure clean working tree

```bash
git_pull_safe() {
  # Check for uncommitted changes
  git diff-index --quiet HEAD -- || { echo "Uncommitted changes" >&2; return 1; }

  # Fast-forward only
  git pull --ff-only || { echo "Manual merge required" >&2; return 1; }
}
```

### Merge with Verification

**Purpose**: Safe branch merging with conflict detection

```bash
git_merge_safe() {
  local source="$1"
  local target="${2:-$(git rev-parse --abbrev-ref HEAD)}"

  git checkout "$target" || return 1
  if git merge "$source" --no-ff --no-edit; then
    echo "βœ“ Merged $source into $target"
  else
    echo "⚠️  Conflicts in:" && git diff --name-only --diff-filter=U
    echo "Resolve, then: git add <files> && git commit"
    return 1
  fi
}
```

---

## Error Handling & Recovery

### Common Errors

| Error | Cause | Solution |
|-------|-------|----------|
| `Failed to connect` | Network issue | Retry with `git_push_with_retry` |
| `rejected (non-fast-forward)` | Remote has new commits | Pull first, then push |
| `conflict` | Branches diverged | Manual merge required |
| `uncommitted changes` | Dirty working tree | Commit or stash first |

### Conflict Resolution

```bash
# After merge conflict
git status  # List conflicted files
vim conflicted-file.ts  # Resolve markers
git add conflicted-file.ts
git commit

# Abort operations
git merge --abort  # Abort merge
git rebase --abort  # Abort rebase
git reset --hard HEAD  # Reset to safe state
```

### Error Recovery Pattern

```bash
git_operation_with_fallback() {
  eval "$1" && return 0
  case "$(git status 2>&1)" in
    *connection*) return 2 ;;  # Retryable
    *conflict*) return 3 ;;    # Needs intervention
    *) return 1 ;;             # Fatal
  esac
}
```

---

## Related Skills

- **using-git-worktrees**: Parallel development in isolated workspaces
- **git-master**: Comprehensive git workflow mastery

---

**Version**: claude-pilot 4.2.0

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.