- TypeScript 64.9%
- Shell 35.1%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
Release / build (git-livemerge-macos-arm64, bun-darwin-arm64) (push) Successful in 2m44s
Release / build (git-livemerge-macos-x64, bun-darwin-x64) (push) Successful in 2m47s
Release / build (git-livemerge-linux-x64, bun-linux-x64) (push) Successful in 2m58s
Release / build (git-livemerge-windows-x64.exe, bun-windows-x64) (push) Successful in 1m26s
Release / release (push) Successful in 5m7s
|
||
| .gitea/workflows | ||
| src | ||
| .gitignore | ||
| bun.lock | ||
| git-livemerge.sh | ||
| install.sh | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
git-livemerge
Merges origin/live_stable into every other origin/live_* branch. Same job as
the original git-livemerge.sh, as an interactive TUI — but every branch is
merged in its own git worktree, so merges run in parallel and a conflict
parks one branch instead of blocking the rest.
Install
curl -fsSL https://git.e-confirm.de/settings-master/git-livemerge/raw/branch/main/install.sh | sh
Detects OS/arch, grabs the matching binary from the latest release, and
overwrites /usr/local/bin/git-livemerge (chmod +x included). Needs sudo if
that folder isn't writable by you.
Windows: under Git Bash/MSYS the same command installs git-livemerge.exe into
/usr/bin. Native (no bash) install: download git-livemerge-windows-x64.exe
from the releases page
and drop it, renamed git-livemerge.exe, into a folder on your PATH.
Use
git-livemerge # picker
git-livemerge tts # picker, filter pre-filled (matches live_tts)
git-livemerge all # every live_* branch, no picker
git-livemerge all -j 8 # 8 at a time (default 4)
git-livemerge --clean # drop the cached worktrees for this repo
Picker — type to filter (tts finds live_tts, tts also matches
text_to_speech), click or space to toggle, ctrl-a selects everything shown,
enter starts. With nothing ticked, enter takes the highlighted branch.
Run — one row per branch with live status, a progress bar, and a console tail.
↑↓ picks the branch whose log you're watching, a interleaves all branches,
l opens the full console (PgUp/PgDn/wheel to scroll).
Conflicts — a conflicted branch is parked: its worktree is kept, its merge
stays in progress, and the other branches carry on merging. Press enter on the
red row whenever you want to deal with it:
| key | action |
|---|---|
m |
git mergetool in that worktree (TUI hands over the terminal, other branches keep going) |
c |
shell in that worktree — fix by hand, exit to come back |
v |
preview the conflict hunks of the selected file |
g |
stage the ✔ files (no markers left, e.g. resolved by git rerere) |
f |
re-check status after editing files elsewhere |
r |
resolved — commit & push · p commit only |
a |
abort this merge · s leave it parked and go back |
Files are split into ✔ (no conflict markers left, just needs staging) and ✖ (needs you). Clean merges commit and push unattended.
Worktrees & submodules
Worktrees live in $TMPDIR/git-livemerge-<repo>-<hash>/<branch> and are kept
between runs as a cache — creating them is the expensive part. When a branch
settles its worktree is only detached (git checkout --detach), which frees the
branch for your own checkouts but keeps the tree on disk, so the next run just
does a checkout -f instead of a fresh one. A parked branch keeps its worktree
attached with the merge still in progress; the path is shown on the summary
screen. Re-running on a parked branch discards that half-done merge and starts
it again (git rerere, if you have it on, replays what you already resolved).
Submodules are never checked out in these worktrees (submodule.recurse=false
on every command there) and the initial fetch skips them too — the merge only
moves gitlinks, so cloning submodule contents per branch is pure cost. Your own
working copy is untouched by this.
git-livemerge --clean deletes the whole worktree cache for the repo.
The branch checked out in your own working copy is detached for the duration if it's in the merge list, and restored at the end.
Build
bun install
bun run build # -> ./git-livemerge (standalone, no runtime needed)
bun run src/filter.test.ts # picker matcher check