An IntelliJ IDEA-style Changelist TUI for git. Group your uncommitted changes into named, persistent buckets, then commit, shelve, or push each one independently — something plain git and git TUIs like lazygit/tig don't offer.
cargo build --release
./target/release/gitcl # uses the git repo containing the cwd
./target/release/gitcl --repo /path/to/repo| Key | Action |
|---|---|
Tab / Shift+Tab |
Cycle pane focus (tree ↔ diff) |
o |
Open the selected file's diff (jump focus to the diff pane) |
j/k, ↓/↑ |
Move selection, or scroll the diff when it's focused |
h/l, ←/→ |
Scroll the focused pane horizontally (long paths/lines) |
Enter |
Fold/unfold the changelist under the cursor |
Space |
Stage/unstage the selected (or visual-range) files |
Shift+V |
Visual mode on a file row (batch select with j/k) |
Esc |
Exit visual mode |
v |
Toggle working-tree/staged diff |
n |
New changelist |
r |
Rename the selected changelist |
d |
Delete the selected changelist (files move to Default) |
a |
Set the selected changelist active (new changes default into it) |
m |
Move the selected (or visual-range) files to another changelist |
c |
Commit the selected changelist |
Shift+S |
Shelve the selected changelist |
Shift+U |
Unshelve — pick a shelf to apply (d inside deletes it) |
Shift+P |
Push the current branch |
Ctrl+R / F5 |
Manual refresh |
? |
Toggle help |
q / Ctrl+C |
Quit |
Shift+S on a changelist saves its changes as a patch and reverts the
files to HEAD — like IntelliJ's Shelve Changes, or a git stash that only
touches the files you picked. Shift+U lists your shelves; applying one
restores the changes as plain working-tree edits and puts the files in a
changelist named after the shelf. Shelves live in .git/gitcl-shelf/ as
ordinary git apply-able patch files (binary files included), so even
without gitcl you can inspect or apply them by hand. If a shelf no longer
applies cleanly because the code moved on, nothing is touched and the
shelf is kept.
Shift+P pushes the current branch to its configured upstream in the
background (a spinner shows progress; the UI stays responsive). The first
attempt never prompts — if the push actually needs input (HTTPS
credentials, an unknown SSH host key, a key passphrase), it fails fast
with a hint, and pressing Shift+P again reruns the push on the real
terminal where git and ssh can prompt you normally, then returns to the
TUI.
- Changelist assignments are stored in
.git/changelist.json— private to your local clone, never committed, survives restarts. - All git access shells out to the
gitCLI (status,diff,add,reset,commit,checkout,rm,apply,push) — nogit2/libgit2 dependency. - Committing a changelist uses
git commit --only -- <paths>, which commits exactly those paths' working-tree content on top of HEAD without touching the index for any other path — so staged/partially-staged changes in other changelists are left untouched. - Shelving follows the same isolation rule: only the shelved changelist's paths are ever passed to a git command, and the patch is written to disk before anything in the working tree is reverted, so a failure can't lose changes.
- No hunk-level (partial-file) changelist assignment — a changelist commits or shelves the whole current working-tree content of its files.
- A partially-staged file commits/shelves its working-tree content; the staged/unstaged split within a file is not preserved.
- No multi-VCS support or remote sync.
| Coin | Network | Address |
|---|---|---|
| BTC | Bitcoin (Taproot) | bc1pyzg434qw9cpljdjm2rt9fdjqqp4jq0hvums62u8q9hkp36xwnhhswdt2zz |
| ETH / USDT / USDC | Ethereum (ERC20) | 0x18e92ffcc9e322cb6b65c393932ab4ca36518980 (Mainnet, high gas fees) |
| ETH / USDT / USDC | Polygon (POL) | 0x18e92ffcc9e322cb6b65c393932ab4ca36518980 (Recommended for small donations, ultra-low fees) |
| USDT | TRON (TRC20) | TJ5vZ4rBhgzQzvWHgjZRyhVoaKvkz7hUzt (Supports Exchanges & TronLink) |
| SOL / USDT / USDC | Solana | GnXfjr5Kq4tpijwfeMbtnqicLFptXXP5rV79axB1M6F5 |