Skip to content
G-ChistPublic

About

Gamified Git TUI (supports quicksaves, quickloads, save loads, save deletes, etc.)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

GitEfFive

A terminal UI for managing git save states (commit history browsing, branch management, quicksave/load, commit rewriting, and more)

Built with Bubble Tea.

Installation

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 binary

Requires Go 1.26+.

Usage

Run GitEfFive from any git repository directory.

Layout

                 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.


Keybindings & Git Commands

Navigation

Key Action
↑ / k Move cursor up
↓ / j Move cursor down
← / → Focus previous/next panel
? Toggle help overlay

Quicksave (s)

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>

Save (f)

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>

Load (l)

Check out the selected commit on a new temporary branch.

git checkout -b "LOAD-<YYYY-MM-DD-HH-MM-SS>" <hash>

Quickload (r)

Stash the current working tree (undo all uncommitted changes).

git stash

Switch Branch (Enter on Branches panel)

Check out the selected branch.

git checkout <branch-name>

Rename (e)

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
      

Delete Commit (d)

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

Flatten All (D)

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

Quit (q / Ctrl+C)

Exit the application.


Build & Development

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

License

GPL v3.

About

Gamified Git TUI (supports quicksaves, quickloads, save loads, save deletes, etc.)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages