A terminal UI for managing git save states (commit history browsing, branch management, quicksave/load, commit rewriting, and more)
Built with Bubble Tea.
git clone git@github.com:G-Chist/GitEfFive.git && cd GitEfFive
./install.sh # builds and copies to /usr/local/bin
# or
make build # just build the binaryRequires Go 1.26+.
Run GitEfFive from any git repository directory.
LOGO (ASCII art)
Status: Ready.
┌────Saves────┐ ┌───Players───┐ ┌──Branches───┐
│ ▸ 2026-06.. │ │ ▸ matvei 5█ │ │ ▸ main *│
│ 2026-06.. │ │ bob 2░ │ │ dev │
└─────────────┘ └─────────────┘ └─────────────┘
branch: main files: 2 modified lines: +5 -1
[s] quicksave [f] save [l] load [r] quickload
[e] rename [d] delete [D] flatten all
[enter] switch branch [?] help [q] quit
Three panels side by side:
- Saves show recent commit history (hash, date, message, visual size bar).
- Players shows contributors sorted by commit count (name, count, visual bar).
- Branches shows local branches,
*marks the current one.
Press ? at any time for an in-app help overlay.
| Key | Action |
|---|---|
↑ / k |
Move cursor up |
↓ / j |
Move cursor down |
← / → |
Focus previous/next panel |
? |
Toggle help overlay |
Stage all changes, commit, and push to the current branch.
git add .
git commit --allow-empty -m "qSAVE-<YYYY-MM-DD-HH-MM-SS>"
git push origin <current-branch>
Create a new branch from HEAD, stage all changes, commit, and push the new branch.
git checkout -b "SAVE-<YYYY-MM-DD-HH-MM-SS>"
git add .
git commit --allow-empty -m "SAVE-<YYYY-MM-DD-HH-MM-SS>"
git push origin <new-branch>
Check out the selected commit on a new temporary branch.
git checkout -b "LOAD-<YYYY-MM-DD-HH-MM-SS>" <hash>
Stash the current working tree (undo all uncommitted changes).
git stash
Check out the selected branch.
git checkout <branch-name>
Two contexts:
- On Branches panel renames a branch locally and on the remote:
git branch -m <old> <new> git push -u origin <new> git push origin --delete <old> - On Saves panel rewrites a commit message:
- If the commit is HEAD:
git commit --amend --allow-empty -m "<new-message>" git push origin <branch> --force - If it is a past commit (rebase via commit-tree):
tree=$(git rev-parse <hash>^{tree}) parent=$(git rev-parse --verify -q <hash>^) new=$(git commit-tree $tree ${parent:+-p $parent} -m "<new-msg>") git rebase --onto $new <hash> git push origin <branch> --force
- If the commit is HEAD:
Remove a commit from history. Works for any commit including root, HEAD, and commits on non-main branches.
# Determine current branch and save original tree
branch=$(git rev-parse --abbrev-ref HEAD)
orig_tree=$(git rev-parse HEAD^{tree})
# Create a temporary branch without the target commit
git checkout -b temp-delete <parent-or-next-commit>
# If remaining commits exist, replay them
git cherry-pick -X theirs <range-of-remaining-commits>
# Replace the original branch
git branch -D $branch
git branch -m temp-delete $branch
# If the working tree changed, restore the original tree content
if [ "$(git rev-parse HEAD^{tree})" != "$orig_tree" ]; then
git checkout $orig_tree -- .
git commit --amend --allow-empty --no-edit
fi
# Force push
git push origin $branch --force
Edge cases:
| Scenario | Behavior |
|---|---|
| Root commit with remaining children | Start temp branch from the next commit, cherry-pick the rest |
| Root commit with no remaining commits | git checkout --orphan temp-delete, commit files directly |
| HEAD commit | Skip cherry-pick (empty range), absorb content into parent via tree restore |
| Same-file conflicts | cherry-pick -X theirs auto-resolves |
| Commit adds files later commits modify | Cherry-pick modify/delete conflict auto-resolved with git add -A + cherry-pick --continue |
| Partially overlapping changes | Tree restore preserves changes from deleted commit |
| Fully overwritten changes | No tree restore needed — later commit already has the content |
Squash the entire branch into a single commit.
branch=$(git rev-parse --abbrev-ref HEAD)
git checkout --orphan temp-flatten
git add -A
git commit -m "Flattened all commits"
git branch -D $branch
git branch -m temp-flatten $branch
git push origin $branch --force
Exit the application.
| Command | Action |
|---|---|
make fmt |
Format all Go source files |
make check-fmt |
Verify formatting (CI) |
make lint |
Run go vet |
make build |
Compile to ./GitEfFive |
make clean |
Remove binary |
make install |
Build + sudo cp to /usr/local/bin |
make all |
check-fmt → lint → build |
go test ./... |
Run all tests |
GPL v3.