My most used jj commands

I started using jj-vcs . Getting used to it took me about 3 weeks of using it exclusively. When I was just starting I found this blog from Danver Braganza about their most commonly used jj commands which helped me a lot in figuring out which commands to actually focus on. Now that I have been using it for a while and feel pretty comfortable, I thought I would make a list of the commands I use most frequently since jj has been evolving pretty fast and I converged on a slightly different workflow. I did not do a systematic analysis like Danver and instead just jotted down the commands that came to my mind. The following is a list of those commands and how I use them in my workflow. This is not a tutorial.

jj new
This is the main command for creating new commits. When you are done working on a commit, you add a child commit using new. Coming from git it might be surprising but this is also the command you use to create what would be called a "branch" in git. You just say jj new BRANCH_POINT and you have just started another line of change from that BRANCH_POINT. Even more surprisingly, you will be using this command when you want to check out some old commit by creating a new empty commit on top of that commit and browsing the files there. Having to create empty commits just to read felt strange initially but jj automatically garbage collectes empty commits so you don't need to worry about filling up your history with empty commits. new is also used to create merge commits jj new PARENT_A PARENT_B ... and it can also be used to insert commits between two commits jj new -A PRED -B SUCC.
jj st[atus]
The output of this command is essentially like git status. The only difference being that jj does not have a staging area like git.
jj log
As one would expect, this shows some commits but it's different if you are used to git diff. The output is closer to what you would see with git log --all --oneline --graph. I personally found the default output a little too verbose so I set templates.log = "builtin_log_oneline" in my config. Once you are familiar with revsets, you can use it to do everything you could do with git log.
jj desc[ribe]
This is the command you use to set the commit title and message. There's a jj commit command that can be used as well which does describe followed by new.
jj edit
This lets you change any revision. You can use this to go to a revision and browse the changes but I prefer using jj new for that purpose since you don't have to worry about accidentally changing the revision.
jj show and jj diff
These are essentially the same as what the corresponding git commands do.
jj undo
Everytime a command goes wrong, this is what I use to get back to a sane state. A more advanced version of what this command does is through the operation log .
jj rebase [-s|-b|-r] REV [-o|-A|-B] REV
Rebasing with jj feels simpler than with git. It makes it possible to rebase a number of "branches" at once, reorder commits, insert commits in the middle of other commits and so on. Conflicts are handled as first class citizens in jj so any conflicts picked up during the rebase don't require immediate resolution. The commandline interface is quite intuitive as well. You specify what to rebase and where to place it. When you want to rebase a branch, you can refer to it using its base (-s|--source) or tip (-b|--branch). If you want to move a single commit, you refer to it using -r|--revision. The commits can be placed onto a commit using -o|--onto or inserted after/before a commit using -A|--insert-after and -B|--insert-before. Note that --insert-after is different from --onto.
jj git push --named NAME=REV
This is the command I use to push a branch to github. This creates a bookmark NAME which points at REV and pushes the branch. These steps can be done separately but since jj does not need you to name branches by default, you don't need to create a bookmark unless you wish to push. Other variations of this command can autogenerate a name but I prefer naming my branches myself.
jj git push -b BOOKMARK
This command pushes a bookmark. I use this when I update a branch with new commits and want to push them to the remote.
jj bookmark advance
In git, branches advance as you add more commits to them. In jj, bookmarks are static, they don't move unless you explicitly move them. The advance command looks at the ancestors until it finds a bookmark and changes that bookmark to point to the current revision. You can also specify a revision to move the bookmark to if you don't want it to be the current revision.