I was a Magit user for most of a decade and I deeply missed it when I first switched to jj. I still think something like it would be a huge boon for the community and I hope one comes to fruition eventually, but in an editor-agnostic form like matklad suggests here:
With that yearning in mind, jjui is the jj TUI I like best so far having tried them all. It's snappy, has useful and intuitive keybinds and presents them well, and good stability so far. Doesn't quite seem to like it if I resize the surrounding zellij/terminal pane while it's open though.
Lazyjj was a little laggy and crash-prone for me on all of the same repos, and jj-fzf is a tragic pile of bash so I can't recommend ever using that.
cube2222 · 2d ago
This looks like a very decent TUI! I'm pretty happy with the CLI (especially since in fish it has extensive auto-complete), but if one is not content with that, this seems very nice.
I've written about JJ[0] when I was starting to use it, and now, a couple months in, it's become an indispensable part of my workflow. Git really does feel clunky now (even though I never had major problems back when using it), whenever I see it used - with jj being compatible with it, fortunately I don't have to ever use it myself anymore.
Historically I never cared much about my git history (and always squashed PRs) - now I find myself occasionally using empty changes with good descriptions to just write out a sort of todo-list on my branch (kinda CDD, as in Change-Driven Development :) ), and it's overall much cleaner.
I've always used a ton of stashes with git for various experiments and in-progress work, now that's just normal local-only jj changes. Also solves the very unpleasant problem of rebasing stashes.
If you're reading this comment section thinking about whether it's worth trying jj out, I would strongly suggest you give it a go!
First time I ever hear about CDD but I’m already loving it
endtime · 2d ago
Looks like a nice project! Will try it out next week. In the meantime, I'll share my thoughts on jj in general, since I assume most readers here won't have tried jj.
I started using jj a few months ago. I had used Fig previously when I was at Google, but then spent over 2.5 years just using git, and using jj was like riding a bike. It's more or less exactly what I want it to be and I use it as much as I can.
That said, here are some of my pain points (despite all of which I do still prefer jj to git):
* No GitHub PR sync for stacks. Managing stacked diffs locally is great, but (a better version of) Sapling's PR syncing would be a huge value add. This is somewhat of a pain point for me directly, but even more so a weakness when I've tried to evangelize jj internally as a viable "stacked diff" solution (e.g. to be blessed by our eng tools team). Someone familiar and comfortable with Sapling (or just skeptical of jj) can easily point to this feature gap in a way that pretty much ends the conversation.
* I wish the native backend supported pushing/pulling changes. I want to be able to switch between working from my laptop and my workstation, and doing that through pushing to and pulling from GitHub is obviously lossy of jj history. Manually copying the .jj directory seems to work if I'm careful and do everything correctly (i.e. make sure both clones have equivalent working copy state when I copy .jj), but this feels brittle and it's easy to mess up.
* If you forget to start a new rev before you (or your LLM) touch the repo, it's a little bit of a pain to go back and split the changes into a new rev.
* Some of the more mature repos I've worked with have tooling/scripts/tests/etc. that seem to look for or rely on the presence of .git (perhaps indirectly). Perhaps I could have gotten around this with colocated repos (i.e. `git clone` and then `jj git init --colocate`), but in at least one case I just gave up on using jj for a given repo and just made a separate git clone. I'm not sure this is really jj's fault so much as a practical compatibility gap with git (again, possibly entirely solved by using `--colocate`).
nasso_dev · 2d ago
You might be interested in tangled.sh, a Git forge that recently added support for stacked PRs with jj[1] (or anything that supports the Change-Id header i suppose)!
Nice - I have no choice but to use GitHub at work, but I'm always glad to see competitors.
icy · 2d ago
thanks for the mention! I was just composing a reply haha.
bjackman · 2d ago
> No GitHub PR sync for stacks
FWIW, I think the fact that you need client support for this is a bizarre shortcoming of GitHub.
If GitHub just let you review individual commits like Gerrit does, the concept of "PR stacking" would be unnecessary (as it is with Gerrit).
The model of "a PR is just a blob of changes" is a weird baby's toy version of a code review tool IMO!
HALtheWise · 1d ago
I highly recommend revup, it allows managing and uploading stacked (or arbitrary trees of) PRs to Github, including adding a comment that shows approximate revision-to-revision diffs if you want it to. I don't actually think that per-commit reviewing obviates the desire for stacked PRs, for example I often have some PRs in my stack that are not yet ready for review or merging.
GitHub does let you review individual commits, at least you can leave comments on them.
All we need is GitHub to support a `Depends on: #123` annotation which would hide commits already in #123 and not let you merge until #123 is merged.
bjackman · 1d ago
You can review them but you can't look at the diff between them after they've been amended in response, so it's not actually a usable workflow.
IIUC the typical model is that people just upload new commits like "respond to review comments" and then eventually squash the whole PR into one commit when it's ready.
So basically you are just giving up on the idea that the commit history is part of the artifact you're working on.
SkiFire13 · 2d ago
> All we need is GitHub to support a `Depends on: #123` annotation which would hide commits already in #123 and not let you merge until #123 is merged.
You can get an approximation by having the PR target the branch used by #123.
atq2119 · 2d ago
This doesn't work across forks, though, and therefore doesn't compose with GitHub's model where you push your changes to your private fork and then open a PR from there.
There's also no native UI support for it in GitHub -- I'd expect to have a navigation element for stacked PRs like in Gerrit.
dietr1ch · 2d ago
This means multiple stacked branches that you need to maintain on your own, doesn't it? That's the annoying part IMO, even when a short script would do or the rebases take a few characters in some efficient git UI.
mkingston · 2d ago
You can review a PR commit by commit. But it's not obvious how in the UI. Navigate to the commits tab on the PR page and you can navigate through the commits in the PR and review them one by one. Although it's possible this isn't what you mean.
baq · 2d ago
Github doesn’t understand that all commits can change for review purposes. This is what makes it a ‘toy’ (though I prefer stronger wording here.)
rfoo · 2d ago
Right, the problem is when I amended one of my patches there's no way for the reviewer to look at a diff between current and previous versions.
w0m · 1d ago
ADO handles this by showing a dropdown of 'comment left on update X, currently update Y' with a toggle to show the difference.
I ~hate how ADO handles individual commits (comment left on a single commit is hidden), but I do like the update tracking on a PR as it allows cleaning up the commit tree seamlessly without losing history or comment traceability (less you remove/move files).
> If you forget to start a new rev before you (or your LLM) touch the repo, it's a little bit of a pain to go back and split the changes into a new rev.
This is my biggest pain point at the moment, yes. I think it could be partially solved by better documentation already. I contributed a bit in the past but haven't had the time to look at this bit yet.
endtime · 1d ago
Thanks for the pointers to the progress in 0.29.0, and for your contributions. :)
cobyte8 · 1d ago
> using jj was like riding a bike
This has been my experience as well! I haven't had success conveying that to my peers at work (or outside), but your comment resonates with me deeply.
> If you forget to start a new rev before you (or your LLM) touch the repo, it's a little bit of a pain to go back and split the changes into a new rev.
This is one area where I broke my Fig habits and just switched to a the [Squash workflow](https://steveklabnik.github.io/jujutsu-tutorial/real-world-w...): I basically forbid myself from use `jj edit` and have been pretty successful in getting that to stick in my brain. Instead, I use `jj new` to switch contexts (and then `jj commit`, `jj squash`, or `jj absorb` depending on what I'm trying to achieve).
> Some of the more mature repos I've worked with have tooling/scripts/tests/etc. that seem to look for or rely on the presence of .git (perhaps indirectly).
Yeah, I've noticed this too. I find that the most common root cause is usually something that wants to run a lint tool only against the files that you've changed so it does something to the effect of `git diff --name-only $(git merge-base HEAD origin/main)`. I've also noticed that some precommit hooks have been working better since I enabled the `git.subprocess` option (which is on by default as of recently, I believe).
endtime · 1d ago
I have more or less been using the squash workflow, but nevertheless, remembering to do `jj new` before doing anything else is a challenge. Might just get used to it with more time.
sksrbWgbfK · 2d ago
`--colocate` is indeed working fine for me. The backend is then stored in a real `.git` directory instead of being hidden deep inside the `.jj` directory as a bare git repository. Python scripts that use pygit or tools like Conan can safely use that `.git` directory while you enjoy your jj workflow.
There might be some issues with jj workspaces though if you have the habit of using git worktrees as the colocated repo is not there anymore.
pyr0hu · 2d ago
> No GitHub PR sync for stacks. Managing stacked diffs locally is great, but (a better version of) Sapling's PR syncing would be a huge value add. This is somewhat of a pain point for me directly, but even more so a weakness when I've tried to evangelize jj internally as a viable "stacked diff" solution (e.g. to be blessed by our eng tools team). Someone familiar and comfortable with Sapling (or just skeptical of jj) can easily point to this feature gap in a way that pretty much ends the conversation.
Can you explain this point in detail? I've been using jj and doing stacked PRs on GitLab using `jj git push --all`. I haven't used Sapling so I'm not familiar with it's way of doing stacked PR and I'm really just curious what do you miss from it.
endtime · 1d ago
Sapling has a way to manage multiple PRs, setting the target branch of each to its parent and adding information about the stack of PRs to each PR description.
gcr · 2h ago
What does this look like in practice?
It seems jj supports this workflow roughly as well as Sapling. If I have five PRs open with five feature bookmarks, changing an ancestor and pushing will update all PRs simultaneously. Github's PR view notices that the heads were updated and changes which commits are included in the review set.
Sapling shares the limitations of Github's review UI: reviews still include all changes (I think). The only nice bit is Sapling automatically submitting the PRs for you and adding the descriptive info?
As a nifty workaround, it looks like sapling recommends an external tool called reviewstack.dev to properly review its stacked PRs which show incorrectly by default on GitHub. So is there much difference?
sam_goody · 2d ago
No really related, but I'm surprised that jj has no good GUI.
With so much VC money chasing so many established niches (eg bun -> node), and so much potential growth for jj - especially considering it has so much dev interest, and has the advantage of not requiring lock-in [a jj repo can be converted to a regular git repo].
dmit · 2d ago
There's https://github.com/keanemind/jjk for VSCode users. There are also tickets to add jj support in Helix and Zed, so that's promising.
ilyagr · 2d ago
See https://github.com/jj-vcs/jj/wiki/GUI-and-TUI for a standalone GUI and two VS Code plugins. None of the GUIs there are fully-featured, so sometimes you have to imagine what it could become, but each one is usable. The two VS Code plugins can be used at the same time and complement each other somewhat.
Macha · 2d ago
jj as effectively used is a git UI. There's an experimental self-hosted backend that nobody uses (and is disabled in release builds), and there's a piper backend in Google, which is enough that people call it a VCS of its own rather than a git UI, but there's nothing stopping some other tool building the same primitives on top of git directly without jj as an intermediate layer. As I understand it, to some extent, that is GitButler.
well it's probably a good thing jj isn't vc funded.
KerrAvon · 2d ago
yeah, it would have to be jammed to the gills with AI, sensibly or not, to be vc-funded
dcre · 2d ago
Beautiful work. I tried other jj TUIs and found them clunky and counterintuitive. This one feels like they took the output of jj log and simply made it interactive.
That said, I switched to jj after using GitUp https://gitup.co/ for many years, and I was pretty surprised not to really miss it when using the jj CLI. The things I liked most about GitUp are all covered by the jj CLI pretty well:
- Undo
- Interactive staging (well, in jj the analogue is interactive split with jj split -i)
- Feeling like you’re manipulating the DAG directly, picking this up and plopping it down over here (jj rebase)
Notably, jj already builds in a TUI for the spots where interactivity is most beneficial.
skeptrune · 2d ago
Hardcore embodies building tools that make you happy. I'm personally fine with git, but it's inspiring to see so many people willing to experiment and build an ecosystem around a new VCS.
anticodon · 2d ago
My only and biggest pain point with Git is that it requires a lot of manual merging even in a small project. You have several branches that are several weeks/months old and they touch the same set of files. Eventually, when they'll be approved for merging, you'll have to manually resolve lots of conflicts in all of them, and do that repeatedly. rerere is supposed to at least save you from repeating repeating same merges in every branch you rebase, but in my experience it never helps.
Unfortunately, as far as I understand, jj won't help with issue of unnecessary manual merges either.
cube2222 · 2d ago
Merges / conflict resolution in jj generally work much better than in git.
When rebasing a big branch in git with conflicts, you usually end up having to manually resolve conflicts in multiple commits in a row - in jj you just have to resolve the conflict in the first conflicted change, and it usually adapts subsequent changes automatically.
Overall, rebasing branches with conflicts used to be a chore for me with git, and is now mostly a nothing-burger. Of course, I don't know the exact details of your scenario, so I'm not sure if it'd help, but I'd say it's worth trying, esp. if it's a common pain-point for you.
cowsandmilk · 2d ago
Is this the case even with rerere in git?
mtndew4brkfst · 2d ago
My anecdotal experience is that I indirectly need/benefit from rerere much less often because I'm not usually resolving the same specific conflict more than once. I fix it the one time and then jj is rebasing a whole lineage for me, starting from the early commits, not from the single-branch leaves. That way I don't get "I rebased one branch and fixed this one already, but now I have to do it again for a second branch that shared the same conflicted commit as the first."
By contrast, git rebase --update-refs does not handle sibling branches but detaches them instead, and git replay hasn't had much TLC for UX yet. Plus, the last time I tried replay it was still obliterating commit signatures.
This doesn't seem related to git or jj. If you have a conflict, you have a conflict. It's a social issue, not a software one. No software can resolve all code conflicts without people making final decisions. You can help the situation by automatically pinging people to refresh their old branches though.
account-5 · 2d ago
I've still not found anything as easy and complete, feature-wise, as fossil. What is jj trying to solve over git, assuming it's more a replacement for git.
andrewaylett · 2d ago
It's not so much a git replacement, as a whole new porcelain on top of the same plumbing.
JJ uses the git binary and maintains a git repository. In co-located mode, the jj working copy is a git working copy. If you use regular git tooling it might be a bit uncertain why you're in detached head mode, but all read-only tooling will work without any problems and if you write to the repo jj will do its best to absorb your manual changes cleanly.
aseipp · 2d ago
To be clear, Jujutsu is not "porcelain" in the (somewhat archaic) Git sense of "high level tools built on low level tools". We do not share any code with the git project. Jujutsu uses Git as a storage layer, i.e. the direct on disk representation. The algorithms and user interface are all completely written from scratch, on top of this.
You could also write e.g. a Mercurial backend to Jujutsu and it would operate similarly, but using revlog storage vs Git's content addressed store.
> JJ uses the git binary
That's a relatively recent phenomenon. The git binary is used only to fetch and push objects. Previously we used libgit2. Why do this? Because replicating all of git and OpenSSH's feature support for every little random auth flow/crypto algorithm/hardware token/whatever is a battle that can't be won. It's ultimately smarter to just have an uglier interface between the two parts (invoking a command line vs using an API) to make the end-user experience significantly better.
When working with Git objects, jj uses the Gitoxide rust library to natively manage the Git store and upstream Git is not used at all.
andrewaylett · 4h ago
Ah, I'd misunderstood how much the git binary was used for. I think I might go with could be a porcelain, if you don't mind? It's far too late for me to edit my comment now.
I'm a smidge late to the "early adopters" party, but I've been using Jujitsu intensively for a couple of weeks now and do not intend to stop :).
dmit · 2d ago
A small note here: even though the public version of jj only supports the Git backend right now (I believe there's also support for whatever Google's using internally?), it's designed to be backend-agnostic. So potentially, in the future it could grow its own native backend that could solve some of Git's pain points -- support for huge repositories, native large file storage, etc.
steveklabnik · 2d ago
Yes, Google has a backend that some people there are using.
nialv7 · 2d ago
all DVCSs are ultimately the same thing, they are all just providing a human interface to the same data structure. i am not saying this dismissively - human interfacing is an extremely difficult problem where a lot of breakthroughs can be made (and some of these breakthroughs will involve interesting algorithms, see pijul).
so to answer your question, jj allows you to do the same set of things you can do with git, but with (arguably) much better UI/UX.
silvanocerza · 2d ago
Ah, this is nice!
I've been testing out Jujutsu this weekend and this will come in handy. I still need to wrap my head around the different overflow and this might make it easier.
https://matklad.github.io/2024/12/13/majjit-lsp.html
With that yearning in mind, jjui is the jj TUI I like best so far having tried them all. It's snappy, has useful and intuitive keybinds and presents them well, and good stability so far. Doesn't quite seem to like it if I resize the surrounding zellij/terminal pane while it's open though.
Lazyjj was a little laggy and crash-prone for me on all of the same repos, and jj-fzf is a tragic pile of bash so I can't recommend ever using that.
I've written about JJ[0] when I was starting to use it, and now, a couple months in, it's become an indispensable part of my workflow. Git really does feel clunky now (even though I never had major problems back when using it), whenever I see it used - with jj being compatible with it, fortunately I don't have to ever use it myself anymore.
Historically I never cared much about my git history (and always squashed PRs) - now I find myself occasionally using empty changes with good descriptions to just write out a sort of todo-list on my branch (kinda CDD, as in Change-Driven Development :) ), and it's overall much cleaner.
I've always used a ton of stashes with git for various experiments and in-progress work, now that's just normal local-only jj changes. Also solves the very unpleasant problem of rebasing stashes.
If you're reading this comment section thinking about whether it's worth trying jj out, I would strongly suggest you give it a go!
[0]: https://kubamartin.com/posts/introduction-to-the-jujutsu-vcs...
I started using jj a few months ago. I had used Fig previously when I was at Google, but then spent over 2.5 years just using git, and using jj was like riding a bike. It's more or less exactly what I want it to be and I use it as much as I can.
That said, here are some of my pain points (despite all of which I do still prefer jj to git):
* No GitHub PR sync for stacks. Managing stacked diffs locally is great, but (a better version of) Sapling's PR syncing would be a huge value add. This is somewhat of a pain point for me directly, but even more so a weakness when I've tried to evangelize jj internally as a viable "stacked diff" solution (e.g. to be blessed by our eng tools team). Someone familiar and comfortable with Sapling (or just skeptical of jj) can easily point to this feature gap in a way that pretty much ends the conversation.
* I wish the native backend supported pushing/pulling changes. I want to be able to switch between working from my laptop and my workstation, and doing that through pushing to and pulling from GitHub is obviously lossy of jj history. Manually copying the .jj directory seems to work if I'm careful and do everything correctly (i.e. make sure both clones have equivalent working copy state when I copy .jj), but this feels brittle and it's easy to mess up.
* If you forget to start a new rev before you (or your LLM) touch the repo, it's a little bit of a pain to go back and split the changes into a new rev.
* Some of the more mature repos I've worked with have tooling/scripts/tests/etc. that seem to look for or rely on the presence of .git (perhaps indirectly). Perhaps I could have gotten around this with colocated repos (i.e. `git clone` and then `jj git init --colocate`), but in at least one case I just gave up on using jj for a given repo and just made a separate git clone. I'm not sure this is really jj's fault so much as a practical compatibility gap with git (again, possibly entirely solved by using `--colocate`).
[1]: https://bsky.app/profile/tangled.sh/post/3lptwcb47kc2u
FWIW, I think the fact that you need client support for this is a bizarre shortcoming of GitHub.
If GitHub just let you review individual commits like Gerrit does, the concept of "PR stacking" would be unnecessary (as it is with Gerrit).
The model of "a PR is just a blob of changes" is a weird baby's toy version of a code review tool IMO!
https://github.com/Skydio/revup
All we need is GitHub to support a `Depends on: #123` annotation which would hide commits already in #123 and not let you merge until #123 is merged.
IIUC the typical model is that people just upload new commits like "respond to review comments" and then eventually squash the whole PR into one commit when it's ready.
So basically you are just giving up on the idea that the commit history is part of the artifact you're working on.
You can get an approximation by having the PR target the branch used by #123.
There's also no native UI support for it in GitHub -- I'd expect to have a navigation element for stacked PRs like in Gerrit.
I ~hate how ADO handles individual commits (comment left on a single commit is hidden), but I do like the update tracking on a PR as it allows cleaning up the commit tree seamlessly without losing history or comment traceability (less you remove/move files).
It admittedly doesn't have a lot of polish, but I do use it regularly and I'd be happy to help anybody who is interested in using it.
Still, you're right that it makes sense to build tools to work around GitHub since there's always gonna be cases where you can't avoid using it.
0.29.0 is working towards support here. It's only the first step as far as I understand (not following too closely): https://github.com/jj-vcs/jj/releases/tag/v0.29.0 git.write-change-id-header
> If you forget to start a new rev before you (or your LLM) touch the repo, it's a little bit of a pain to go back and split the changes into a new rev.
This is my biggest pain point at the moment, yes. I think it could be partially solved by better documentation already. I contributed a bit in the past but haven't had the time to look at this bit yet.
This has been my experience as well! I haven't had success conveying that to my peers at work (or outside), but your comment resonates with me deeply.
> If you forget to start a new rev before you (or your LLM) touch the repo, it's a little bit of a pain to go back and split the changes into a new rev.
This is one area where I broke my Fig habits and just switched to a the [Squash workflow](https://steveklabnik.github.io/jujutsu-tutorial/real-world-w...): I basically forbid myself from use `jj edit` and have been pretty successful in getting that to stick in my brain. Instead, I use `jj new` to switch contexts (and then `jj commit`, `jj squash`, or `jj absorb` depending on what I'm trying to achieve).
> Some of the more mature repos I've worked with have tooling/scripts/tests/etc. that seem to look for or rely on the presence of .git (perhaps indirectly).
Yeah, I've noticed this too. I find that the most common root cause is usually something that wants to run a lint tool only against the files that you've changed so it does something to the effect of `git diff --name-only $(git merge-base HEAD origin/main)`. I've also noticed that some precommit hooks have been working better since I enabled the `git.subprocess` option (which is on by default as of recently, I believe).
There might be some issues with jj workspaces though if you have the habit of using git worktrees as the colocated repo is not there anymore.
Can you explain this point in detail? I've been using jj and doing stacked PRs on GitLab using `jj git push --all`. I haven't used Sapling so I'm not familiar with it's way of doing stacked PR and I'm really just curious what do you miss from it.
It seems jj supports this workflow roughly as well as Sapling. If I have five PRs open with five feature bookmarks, changing an ancestor and pushing will update all PRs simultaneously. Github's PR view notices that the heads were updated and changes which commits are included in the review set.
Sapling shares the limitations of Github's review UI: reviews still include all changes (I think). The only nice bit is Sapling automatically submitting the PRs for you and adding the descriptive info?
As a nifty workaround, it looks like sapling recommends an external tool called reviewstack.dev to properly review its stacked PRs which show incorrectly by default on GitHub. So is there much difference?
With so much VC money chasing so many established niches (eg bun -> node), and so much potential growth for jj - especially considering it has so much dev interest, and has the advantage of not requiring lock-in [a jj repo can be converted to a regular git repo].
That said, I switched to jj after using GitUp https://gitup.co/ for many years, and I was pretty surprised not to really miss it when using the jj CLI. The things I liked most about GitUp are all covered by the jj CLI pretty well:
- Undo
- Interactive staging (well, in jj the analogue is interactive split with jj split -i)
- Feeling like you’re manipulating the DAG directly, picking this up and plopping it down over here (jj rebase)
Notably, jj already builds in a TUI for the spots where interactivity is most beneficial.
Unfortunately, as far as I understand, jj won't help with issue of unnecessary manual merges either.
When rebasing a big branch in git with conflicts, you usually end up having to manually resolve conflicts in multiple commits in a row - in jj you just have to resolve the conflict in the first conflicted change, and it usually adapts subsequent changes automatically.
Overall, rebasing branches with conflicts used to be a chore for me with git, and is now mostly a nothing-burger. Of course, I don't know the exact details of your scenario, so I'm not sure if it'd help, but I'd say it's worth trying, esp. if it's a common pain-point for you.
By contrast, git rebase --update-refs does not handle sibling branches but detaches them instead, and git replay hasn't had much TLC for UX yet. Plus, the last time I tried replay it was still obliterating commit signatures.
https://git.github.io/htmldocs/git-replay.html
JJ uses the git binary and maintains a git repository. In co-located mode, the jj working copy is a git working copy. If you use regular git tooling it might be a bit uncertain why you're in detached head mode, but all read-only tooling will work without any problems and if you write to the repo jj will do its best to absorb your manual changes cleanly.
You could also write e.g. a Mercurial backend to Jujutsu and it would operate similarly, but using revlog storage vs Git's content addressed store.
> JJ uses the git binary
That's a relatively recent phenomenon. The git binary is used only to fetch and push objects. Previously we used libgit2. Why do this? Because replicating all of git and OpenSSH's feature support for every little random auth flow/crypto algorithm/hardware token/whatever is a battle that can't be won. It's ultimately smarter to just have an uglier interface between the two parts (invoking a command line vs using an API) to make the end-user experience significantly better.
When working with Git objects, jj uses the Gitoxide rust library to natively manage the Git store and upstream Git is not used at all.
I'm a smidge late to the "early adopters" party, but I've been using Jujitsu intensively for a couple of weeks now and do not intend to stop :).
so to answer your question, jj allows you to do the same set of things you can do with git, but with (arguably) much better UI/UX.
I've been testing out Jujutsu this weekend and this will come in handy. I still need to wrap my head around the different overflow and this might make it easier.