| name | force-push-downstream |
| description | Force-push a branch and all its downstream branches to origin. Auto-detects the downstream tree and skips branches already up-to-date. Triggers on: force push downstream, push chain, push all branches. |
| argument-hint | [starting-branch] |
| allowed-tools | Bash, Read, Grep, Glob |
Force Push Downstream
Force-push a branch and all its downstream branches to their respective remotes.
Skips branches whose local and remote tips already match.
Arguments
starting-branch (optional) -- The branch to start from. Defaults to the
current branch if not specified.
Examples:
/force-push-downstream -- push current branch + all downstream
/force-push-downstream feature-auth -- push from that branch down
Current State
- Branch: !
git branch --show-current
- Status: !
git status --short
Steps
1. Determine starting branch
If an argument was provided, use it as the starting branch. Otherwise use the
current branch.
git branch --show-current
2. Detect downstream chain
Detect all downstream branches by examining local branch tracking relationships,
using the same method as rebase-downstream:
git for-each-ref --format='%(refname:short) %(upstream:short)' refs/heads/
From this output, build a parent-child tree:
- A branch
B is a child of branch A if B's upstream tracking ref is A
(or origin/A).
- Starting from the starting branch, walk the tree depth-first to find all
descendants.
If a branch tracks origin/<same-name> (i.e., it tracks itself on the
remote), it is NOT a child -- it is an independent branch.
3. Build push list
The push list is: the starting branch itself, followed by every downstream
branch in tree order (from the chain detection output).
4. Show plan and confirm
Display the branches that will be pushed:
Force push plan:
feature-auth
-> feature-auth-ui
-> feature-auth-tests
-> feature-auth-api
For each branch, check if it is already up-to-date with origin:
local_sha=$(git rev-parse <branch>)
remote_sha=$(git rev-parse origin/<branch> 2>/dev/null || echo "none")
If local_sha == remote_sha, mark as (up-to-date, will skip). If the remote
branch doesn't exist, mark as (new, will push). Otherwise mark as
(diverged, will force-push).
Ask the user to confirm before pushing.
5. Push each branch
For each branch in the push list:
-
Skip if up-to-date: If local SHA matches origin SHA, print skip message
and move on.
-
Force push:
git push --force-with-lease origin <branch>
Use --force-with-lease for safety -- it fails if someone else pushed to the
remote since our last fetch, preventing accidental overwrites of others'
work.
-
If the remote branch doesn't exist (first push), use:
git push -u origin <branch>
-
Report result: Print success/failure for each branch.
6. Report summary
After all pushes complete, show a summary:
Force push results:
[ok] feature-auth (pushed)
[--] feature-auth-ui (skipped, up-to-date)
[ok] feature-auth-tests (pushed)
[ok] feature-auth-api (pushed, new)
[!!] feature-auth-docs (failed: ...)
Important
- Always use
--force-with-lease instead of --force for safety
- Do NOT push without user confirmation
- Skip branches that are already up-to-date (local == remote SHA)
- If any push fails, report it but continue with remaining branches
- Return to the original branch at the end