From git
Updates Git branch by fetching and merging upstream changes, with intelligent conflict resolution using context from commits and files. Use for syncing branches, pulling latest from main, or resolving PR conflicts.
npx claudepluginhub technicalpickles/pickled-claude-plugins --plugin gitThis skill uses the workspace's default tool permissions.
Update your current branch with changes from the upstream branch, intelligently resolving conflicts when they occur.
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
Update your current branch with changes from the upstream branch, intelligently resolving conflicts when they occur.
Announce: "Using git:update to sync your branch with upstream..."
Philosophy:
git rev-parse --abbrev-ref @{upstream} 2>/dev/null
If this succeeds, use the result (e.g., origin/main).
If no tracking branch:
gh pr view --json baseRefName -q '.baseRefName' 2>/dev/null
If this succeeds, use origin/{result}.
If both fail, use AskUserQuestion:
I couldn't detect an upstream branch for this branch.
Which branch should I merge from?
(A) main
(B) master
(C) Other - I'll specify
git fetch origin
git rev-list --count HEAD..{upstream}
If count is 0, report "Already up to date with {upstream}" and stop.
git merge {upstream} --no-edit
| Exit Code | Meaning | Action |
|---|---|---|
| 0 | Clean merge | Push and report success |
| 1 | Conflicts | Proceed to conflict resolution |
On clean merge:
git push
Report:
## Update Complete
Merged `{upstream}` into `{current-branch}`
{N} commits pulled in
Pushed to origin
git diff --name-only --diff-filter=U
Read the conflict:
cat {file} # Shows conflict markers
Understand "ours" (your branch):
git log --oneline -5 HEAD -- {file}
git show HEAD:{file} # Your version
Understand "theirs" (upstream):
git log --oneline -5 {upstream} -- {file}
git show {upstream}:{file} # Their version
Get commit messages for context:
# What your commits were doing
git log --format="%s%n%b" HEAD...$(git merge-base HEAD {upstream}) -- {file}
# What upstream commits were doing
git log --format="%s%n%b" {upstream}...$(git merge-base HEAD {upstream}) -- {file}
For each conflict, determine the type:
| Type | Description | Resolution Strategy |
|---|---|---|
| Independent | Changes to different parts of file | Keep both changes |
| Overlapping | Same area, different purposes | Blend changes thoughtfully |
| Contradictory | Mutually exclusive changes | Present options to user |
Analysis approach:
For independent changes:
For overlapping changes:
For contradictory changes:
After resolving, show summary:
## Conflict Resolution Summary
Merged `main` into `feature/my-branch`
### {filename}
**Your changes:** {1-2 sentence summary of what your commits did}
**Upstream changes:** {1-2 sentence summary of what upstream commits did}
**Resolution:** {1-2 sentence explanation of how resolved}
```diff
{Show key parts of the resolution}
[Repeat for each file]
Verification:
Does this resolution look correct? (A) Yes, commit and push (B) Let me review/adjust manually (C) Show me more context on a specific file
Use AskUserQuestion with these options.
## Workflow: Verification & Completion
### Step 1: Verify no conflict markers
```bash
grep -rn "^<<<<<<< \|^=======$\|^>>>>>>> " {resolved_files}
If any found, resolution is incomplete - fix before proceeding.
| File Type | Check |
|---|---|
.json | python -m json.tool {file} > /dev/null |
.yaml/.yml | python -c "import yaml; yaml.safe_load(open('{file}'))" |
.ts/.tsx | npx tsc --noEmit {file} (if tsconfig exists) |
.py | python -m py_compile {file} |
git add {resolved_files}
git commit -m "Merge {upstream} into {branch}
Resolved conflicts in:
$(for f in {resolved_files}; do echo "- $f"; done)"
git push
## Update Complete
Merged `{upstream}` into `{branch}`
Resolved {N} conflict(s):
- {file1}
- {file2}
Pushed to origin. PR should now be mergeable.
| Situation | Handling |
|---|---|
| Binary file conflicts | Flag for manual resolution: "Binary file {file} has conflicts - please resolve manually" |
| Submodule conflicts | Flag with guidance: "Submodule {name} has conflicts. Usually: accept upstream version or update to specific commit" |
| Someone else's branch | Check with gh pr view --json author -q '.author.login'. If not current user, warn: "This is @{author}'s branch. They should be aware of changes. Continue?" |
| Too complex to resolve | Present what was understood, mark specific hunks as needing manual attention |
| Merge already in progress | Detect with git status showing "You have unmerged paths". Offer to continue or abort. |
| Command | Purpose |
|---|---|
git rev-parse --abbrev-ref @{upstream} | Get tracking branch |
git merge --abort | Cancel in-progress merge |
git diff --name-only --diff-filter=U | List conflicted files |
git checkout --ours {file} | Take your version entirely |
git checkout --theirs {file} | Take upstream version entirely |
git show HEAD:{file} | Your version of file |
git show MERGE_HEAD:{file} | Upstream version of file |
git:commit - Commit practices (used after resolution)git:pull-request - Creating/updating PRsgit:triage - Overview of work state