#git-remote #stash #git #sync #wip

bin+lib wip-git

Git stash, but shared across machines via hidden refs

1 unstable release

Uses new Rust 2024

new 0.1.0 Mar 2, 2026

#1 in #wip

MIT license

48KB
1K SLoC

wip-git

Git checkpoint, shared across machines.

One command to snapshot your working state to the remote. One command to load it anywhere else. No branches, no commits in history, no CI triggers, no noise.

Your working tree stays dirty by default — it's a checkpoint, not a stash. Want stash behavior? Use --stash to save and clean.

wip save auth-fix -m "halfway through OAuth"   # checkpoint to remote
# … switch machines …
wip load auth-fix                               # pull it back

Install

cargo install wip-git          # Rust toolchain
# or
npm i -g wip-git              # prebuilt binaries via npm

Quick Start

# save everything (staged + unstaged + untracked)
wip save my-feature -m "WIP login page"

# save and clean working tree (like git stash)
wip save my-feature --stash

# list your saved WIPs
wip list

# load on another machine (3-way merge via cherry-pick)
wip load my-feature

# show the diff without loading
wip show my-feature

# delete a WIP from the remote
wip drop my-feature

# clean entries older than 7 days
wip gc --expire 7d

How It Works

wip save stages everything, creates a temporary commit, pushes it to a hidden ref (refs/wip/<user>/<name>), then resets — your local branch is untouched and your working tree stays dirty. With --stash, the working tree is cleaned instead (hard reset + clean).

wip load fetches that ref and applies it via git cherry-pick --no-commit, giving you a proper 3-way merge. Conflicts show up as normal git conflict markers.

Hidden refs (refs/wip/*) are invisible to git branch, don't trigger CI, and don't create PR prompts.

Commands

Command Description
wip save [name] [-m msg] [--task ID] [--stash] Save working state to remote
wip load <name> [--pop] [--theirs|--ours] Apply changes via 3-way merge
wip show <name> Show metadata and diff
wip list [--all] [--task ID] List your WIP entries
wip drop <name> Delete a WIP from remote
wip gc [--expire 30d] [--dry-run] Clean old entries
wip completions <shell> Generate shell completions
wip mcp Start MCP server (stdio)

Naming

  • Explicit: wip save auth-fixrefs/wip/you/auth-fix-01
  • Auto-increment: saving the same name again → auth-fix-02, auth-fix-03, ...
  • No name: wip saverefs/wip/you/<branch>-01
  • Exact name with --force: wip save auth-fix --force overwrites without incrementing
  • Numeric index: wip load 0 loads the most recent entry

Configuration

Git-native config — no extra files:

[wip]
    user = ricardo          # override auto-detected username
    remote = origin         # default remote (flag: --remote)
    expire = 30d            # default gc expiry

Shell Completions

# bash
wip completions bash > ~/.bash_completion.d/wip

# zsh
wip completions zsh > ~/.zfunc/_wip

# fish
wip completions fish > ~/.config/fish/completions/wip.fish

Architecture

See ARCHITECTURE.md for design decisions, data model, and implementation details.

License

MIT

Dependencies

~11–26MB
~246K SLoC