https://github.com/elithrar/zsh-git-to-jj
A zsh plugin for learning the Jujutsu (jj) VCS porcelain from your usual git workflow.
https://github.com/elithrar/zsh-git-to-jj
git jj jujutsu shell zle-widgets zsh
Last synced: about 13 hours ago
JSON representation
A zsh plugin for learning the Jujutsu (jj) VCS porcelain from your usual git workflow.
- Host: GitHub
- URL: https://github.com/elithrar/zsh-git-to-jj
- Owner: elithrar
- License: apache-2.0
- Created: 2026-01-01T18:23:01.000Z (6 months ago)
- Default Branch: main
- Last Pushed: 2026-01-01T20:41:34.000Z (6 months ago)
- Last Synced: 2026-06-24T02:30:01.531Z (15 days ago)
- Topics: git, jj, jujutsu, shell, zle-widgets, zsh
- Language: Shell
- Homepage: https://gist.github.com/elithrar/4a09ef750af5624b729a6f1d87a0431c
- Size: 12.7 KB
- Stars: 17
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-zsh-plugins - git-to-jj - Helps you progressively learn [Jujutsu](https://github.com/jj-vcs/jj) (aka `jj`) porcelain as you use `git` commands. (Plugins / ZSH on Windows)
- fucking-awesome-zsh-plugins - git-to-jj - Helps you progressively learn <b><code> 24394⭐</code></b> <b><code> 871🍴</code></b> [Jujutsu](https://github.com/jj-vcs/jj)) (aka `jj`) porcelain as you use `git` commands. (Plugins / ZSH on Windows)
README
# zsh-git-to-jj
> 🗣️ this is a useful plugin to help you memorize + better understand how Jujutsu works, but it's not a replacement for [learning the mental model](https://docs.jj-vcs.dev/latest/tutorial/) or [deeper strategies](https://reasonablypolymorphic.com/blog/jj-strategy/).
A `zsh` plugin for progressively learning [Jujutsu](https://github.com/jj-vcs/jj) (aka `jj`) porcelain as you use `git` commands.
The plugin has two modes:
1. `fyi` mode (default): shows you the `jj` equivalent, but still runs the `git` command as-is.
2. `rewrite` mode: rewrites your git command to the `jj` equivalent, so that you're interacting with `jj` directly + your shell history is jj.
```sh
# fyi mode
$ git commit -m "add feature"
jj equivalent: jj commit -m "add feature"
[main abc1234] add feature
1 file changed, 10 insertions(+)
# rewrite mode (after pressing enter, command is rewritten)
$ git commit -m "add feature"
$ jj commit -m "add feature" # <- press enter again to execute
```
The plugin uses ZLE (Zsh Line Editor) to intercept commands on-the-fly, and is thus zsh-only.
## Install
### oh-my-zsh
Clone into the custom plugins directory:
```sh
git clone https://github.com/elithrar/zsh-git-to-jj.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/git-to-jj
```
Then add `git-to-jj` to your plugins array in `.zshrc`:
```sh
plugins=(... git-to-jj)
```
### vanilla zsh
Clone the repository and source the plugin in your `.zshrc`:
```sh
git clone https://github.com/elithrar/zsh-git-to-jj.git ~/.zsh/zsh-git-to-jj
echo 'source ~/.zsh/zsh-git-to-jj/git-to-jj.plugin.zsh' >> ~/.zshrc
```
### Antigen
```sh
antigen bundle elithrar/zsh-git-to-jj
```
### zplug
```sh
zplug "elithrar/zsh-git-to-jj"
```
### zinit
```sh
zinit light elithrar/zsh-git-to-jj
```
## Configuration
### Mode
Set your preferred mode by adding to your `.zshrc` (before sourcing the plugin):
```sh
# Options: fyi (default), rewrite
export GIT_TO_JJ_MODE=fyi
```
You can also switch modes at runtime:
```sh
$ git-to-jj-mode rewrite
git-to-jj mode set to: rewrite
$ git-to-jj-mode
Current mode: rewrite
Available modes: fyi, rewrite
```
## Supported Commands
The plugin covers the most common git workflows. Here's a summary of the mappings:
| Git Command | JJ Equivalent |
|-------------|---------------|
| `git init` | `jj git init` |
| `git clone ` | `jj git clone ` |
| `git status` | `jj st` |
| `git diff` | `jj diff` |
| `git log` | `jj log` |
| `git show` | `jj show` |
| `git add ` | *(automatic in jj - no staging area)* |
| `git commit -m "msg"` | `jj commit -m "msg"` |
| `git commit --amend` | `jj squash` or `jj describe` |
| `git push` | `jj git push` |
| `git pull` | `jj git fetch` (+ `jj rebase -d main@origin`) |
| `git fetch` | `jj git fetch` |
| `git branch` | `jj bookmark list` |
| `git branch ` | `jj bookmark create ` |
| `git branch -d ` | `jj bookmark delete ` |
| `git checkout -b ` | `jj new -B ` |
| `git checkout ` | `jj new ` |
| `git switch -c ` | `jj new -B ` |
| `git merge ` | `jj new @ ` |
| `git rebase ` | `jj rebase -d ` |
| `git cherry-pick ` | `jj duplicate ` |
| `git revert ` | `jj backout -r ` |
| `git stash` | `jj new @-` |
| `git reset --hard` | `jj restore` or `jj abandon` |
| `git reset --soft HEAD~` | `jj squash --from @-` |
| `git restore ` | `jj restore ` |
| `git blame ` | `jj file annotate ` |
| `git ls-files` | `jj file list` |
| `git rm --cached ` | `jj file untrack ` |
| `git remote add ` | `jj git remote add ` |
For commands without a direct mapping, the plugin will display:
```
git-to-jj doesn't know this one!
```
## License
Apache-2.0 licensed. See the LICENSE file for details.