AgentSkillsCN

commit-and-merge

在功能分支上提交更改,并在测试通过后合并到本地主分支。所有操作均在本地完成——绝不执行推送或拉取。适用于用户希望提交并合并、完成功能分支、上线新功能、合并到主分支,或彻底关闭分支时使用。

SKILL.md
--- frontmatter
name: commit-and-merge
description: Commits changes on a feature branch and merges into local main after tests pass. All operations are local — never pushes or pulls. Use when the user wants to commit and merge, finish a feature branch, land a feature, merge to main, or complete a branch.
allowed-tools: Bash, AskUserQuestion

Commit and Merge

Purpose

Commit all changes on the current feature branch with a conventional commit message, run the test suite, and merge into the local main/master branch with --no-ff.

CRITICAL RULE

All operations are LOCAL ONLY. Never run git push, git pull, git fetch, or any command that contacts a remote repository.

Instructions

Step 1: Verify Current Branch

Run:

bash
git branch --show-current

Confirm the current branch is a feature branch (not main or master). If already on main/master, stop and inform the user:

"You're on the main branch. Switch to a feature branch first."

Extract the ticket key from the branch name. Feature branches follow the format feature/KEY-123-description. The ticket key is the uppercase prefix with number (e.g., PROJ-123).

If no ticket key can be parsed from the branch name, ask the user with AskUserQuestion:

"What's the Jira ticket key for this commit? (e.g., PROJ-123)"

Step 2: Review Changes

Run:

bash
git status --porcelain

If there are no changes (working tree clean, nothing staged), skip to Step 4 (there may be existing unpushed commits to merge).

Show the user a summary of what will be committed:

  • Number of new files
  • Number of modified files
  • Number of deleted files

Step 3: Commit Changes

Stage all changes:

bash
git add -A

Generate a short description (under 50 characters) summarizing the changes. Examine the diff to understand what was done:

bash
git diff --cached --stat

Commit with conventional commit format:

bash
git commit -m "feat(TICKET-KEY): <short description>"

Use the appropriate prefix based on the changes:

  • feat — new feature or functionality
  • fix — bug fix
  • refactor — code restructuring without behavior change
  • test — adding or updating tests only
  • docs — documentation only
  • chore — maintenance, config, dependencies

Report: Committed: feat(KEY-123): <description>

Step 4: Run Test Suite

Discover the project's test command by reading CLAUDE.md, package.json, Makefile, or similar project configuration files.

Run the full test suite.

If tests fail:

  • Report which tests failed
  • Stop — do not proceed with merge
  • Tell the user: "Tests failed. Fix the failures before merging."

If tests pass:

  • Report: All tests passing
  • Proceed to next step

Step 5: Confirm Review Status

Before merging, ask the user with AskUserQuestion:

"Tests are passing. Has the code review been completed and approved?"

Options: "Yes, merge to main" and "No, stop here"

If the user says no, stop and report:

"Commit and tests complete. Branch is ready to merge after review."

Step 6: Detect Default Branch

Determine whether the repository uses main or master:

bash
git rev-parse --verify main 2>/dev/null && echo main || echo master

Step 7: Merge into Main

Store the current feature branch name, then switch to the default branch:

bash
git checkout <default-branch>

Do NOT run git pull — all operations are local only.

Merge with no fast-forward to preserve the feature branch history:

bash
git merge --no-ff <feature-branch> -m "Merge <feature-branch> into <default-branch>"

Step 8: Handle Result

If merge succeeds:

code
Merge complete!
Branch: <feature-branch> → <default-branch>
Commit: feat(KEY-123): <description>
Tests: All passing

If merge conflicts occur:

  1. Report the conflicting files:
    bash
    git diff --name-only --diff-filter=U
    
  2. Abort the merge to leave the repo clean:
    bash
    git merge --abort
    
  3. Switch back to the feature branch:
    bash
    git checkout <feature-branch>
    
  4. Tell the user:

    "Merge conflicts detected in: [file list]. The merge has been aborted and you're back on your feature branch. Resolve conflicts manually or rebase before retrying."

Do NOT attempt to auto-resolve conflicts.

Best Practices

  • All operations are local — never push, pull, or fetch from remote
  • Always run tests before merging — never skip this step
  • Use --no-ff to keep feature branch history visible in the git log
  • Extract the ticket key from the branch name to avoid asking the user
  • If merge conflicts occur, abort cleanly and report — let the user decide how to resolve
  • Never use destructive git operations (force push, reset --hard, etc.)