--- source_keys: - context7-git-htmldocs --- # Per-action command mapping One command per action. Where two forms exist, the first is the default and the second the escape hatch. - **create** — `git switch -c `. Base comes from the config's `base_branch` (`main` under GitHub Flow, usually `develop` under Gitflow). - **switch** — `git switch ` moves to an existing local branch; it aborts rather than clobbering conflicting local changes. `git switch -` returns to the previous branch. - **delete (local)** — `git branch -d ` refuses when the branch holds unmerged commits, which is why it is the default. `git branch -D ` forces the deletion and discards that work — only after the destructive-operation gates pass and `confirm: true` is set. - **delete (remote)** — not this skill's. Deleting a remote branch is a push, and every remote-side gate lives in `git-remotes`; hand it there rather than running the push from here. Its `references/push.md` carries the command and the refspec form. - **rename** — `git branch -m `. - **list** — `git branch` (local), `-a` (local plus remote-tracking), `-r` (remote-tracking only), `--merged` / `--no-merged` (filter by merge status into the current branch). - **track** — `git branch --set-upstream-to=origin/` sets an upstream without pushing. `git branch -vv` shows the tracking state of every local branch. ## get-intent Git has no native field for free-text branch metadata, and this skill does not persist any. On `create`, the `intent` value is only returned in the structured result — the caller decides whether to store it. On `get-intent`, either parse the intent back out of the branch-name convention (`feature/`) or return `{ "intent": null }` when the caller never persisted the create-time value. Never fabricate an intent: a downstream commit message built on a guessed intent is worse than one built on none. ## Stashing work in progress A switch aborts rather than clobbering conflicting local changes (see Gotchas). Stash is the way past it: it shelves the working tree and index so the branch pointer can move. - **save** — `git stash push -m ""`. Add `-u` to include untracked files; verified on Git 2.39.5, a plain `push` leaves them in place, and a plain `push` with *only* untracked changes reports `No local changes to save` and stashes nothing. Bare `git stash` is `push` with no message. - **restore** — `git stash pop` applies the newest entry and deletes it. `git stash apply stash@{n}` applies without deleting, for replaying one shelf onto more than one branch. - **list** — `git stash list`; `git stash show -p stash@{n}` prints that entry's diff. - **drop** — `git stash drop stash@{n}` deletes one entry. `git stash clear` deletes all of them and nothing recovers them — confirm before running it. - **branch from a stash** — `git stash branch stash@{n}` creates a branch at the commit the stash was taken from and pops it there. Use it when the stash no longer applies to the current tip. **A conflicting `pop` keeps the entry.** Verified on 2.39.5: it exits 1, writes conflict markers, prints "The stash entry is kept in case you need it again", and `git stash list` still shows it. Resolve, `git add`, then `git stash drop` the entry by hand — otherwise it silently accumulates.