<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yuka Ooka</title>
    <description>The latest articles on DEV Community by Yuka Ooka (@oukayuka).</description>
    <link>https://dev.to/oukayuka</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4027979%2F6006d3cd-50d1-4957-bd34-a43f812fc97c.png</url>
      <title>DEV Community: Yuka Ooka</title>
      <link>https://dev.to/oukayuka</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/oukayuka"/>
    <language>en</language>
    <item>
      <title>Does Jujutsu Work with GitHub? Why the Name? 7 Questions Answered</title>
      <dc:creator>Yuka Ooka</dc:creator>
      <pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/oukayuka/does-jujutsu-work-with-github-why-the-name-7-questions-answered-2io9</link>
      <guid>https://dev.to/oukayuka/does-jujutsu-work-with-github-why-the-name-7-questions-answered-2io9</guid>
      <description>&lt;h2&gt;
  
  
  Q1. Can I Use Jujutsu with My Existing Git Repositories?
&lt;/h2&gt;

&lt;p&gt;Yes. Jujutsu is highly compatible with Git, and running &lt;code&gt;jj git init&lt;/code&gt; inside an existing Git repository is all it takes to start using Jujutsu there. You have nothing to lose by trying it, and you don’t have to give up Git.&lt;/p&gt;

&lt;p&gt;Jujutsu’s storage layer is pluggable, and Git is the default backend&lt;sup&gt;1&lt;/sup&gt;. The Git backend stores commits as ordinary Git objects, so the history you create with Jujutsu can also be accessed through Git tools.&lt;/p&gt;

&lt;p&gt;A repository where Jujutsu and Git live side by side is called &lt;strong&gt;colocated&lt;/strong&gt;. You used to have to pass the &lt;code&gt;--colocate&lt;/code&gt; option to &lt;code&gt;jj git init&lt;/code&gt;, or to &lt;code&gt;jj git clone&lt;/code&gt; when copying a remote repository, to get one. Since &lt;a href="https://docs.jj-vcs.dev/latest/changelog/#0340-2025-10-01" rel="noopener noreferrer"&gt;v0.34.0&lt;/a&gt;, released in October 2025, colocated is the default. You’ll still see &lt;code&gt;--colocate&lt;/code&gt; in older articles, but you can safely skip it now.&lt;/p&gt;

&lt;p&gt;In a colocated repository, a &lt;code&gt;.jj/&lt;/code&gt; directory sits next to &lt;code&gt;.git/&lt;/code&gt; at the root. The &lt;code&gt;.gitignore&lt;/code&gt; inside &lt;code&gt;.jj/&lt;/code&gt; contains &lt;code&gt;/*&lt;/code&gt;, so adding Jujutsu doesn’t touch your root &lt;code&gt;.gitignore&lt;/code&gt;. As mentioned above, your Git commit history keeps getting updated while you use Jujutsu, and you can push it to GitHub or any other remote as usual. Signed commits are supported too, so it works in repositories that require them. In other words, if you want to, you can be the only person on a Git team who uses Jujutsu.&lt;/p&gt;

&lt;p&gt;Git commands also keep working in a colocated repository. And if you decide Jujutsu isn’t for you, you can switch back to Git by deleting the &lt;code&gt;.jj/&lt;/code&gt; directory. Jujutsu leaves your existing Git setup as it is, which makes it about as cheap to try as a tool can be.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q2. What Can Git Do That Jujutsu Can’t?
&lt;/h2&gt;

&lt;p&gt;For all its Git compatibility, Jujutsu still doesn’t support some Git features, even in v0.46.0, the latest release as of October 2026. Three of them are the most likely to cause trouble in real projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Submodules&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LFS (Large File Storage)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git hooks or a direct equivalent&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most serious of these is probably the lack of &lt;strong&gt;submodule&lt;/strong&gt; support. Git submodules let you embed another independent Git repository as a subdirectory, usually to share code between projects.&lt;/p&gt;

&lt;p&gt;Lack of support doesn’t mean your submodule contents get lost. The problem is that they don’t follow you when you move through history. With &lt;code&gt;jj edit&lt;/code&gt;, you can jump to any point in history like a time machine and view or edit files there, but submodule directories stay as they were. You have to run &lt;code&gt;git submodule update --recursive&lt;/code&gt; by hand every time.&lt;/p&gt;

&lt;p&gt;Jujutsu also ignores changes you make inside a submodule, so recording them in history means running &lt;code&gt;git add&lt;/code&gt; and &lt;code&gt;git commit&lt;/code&gt; yourself. You can still work in a repository that has submodules, but you need to understand the limitations and handle the unsupported operations manually.&lt;/p&gt;

&lt;p&gt;On the development side, submodules don’t fit well with Jujutsu’s data model, and supporting them would require major design changes, which is a big reason support has lagged. It’s on the roadmap, but much of the design documentation is still unfinished, and there’s no implementation timeline in sight&lt;sup&gt;2&lt;/sup&gt;. These days, teams that need to share code often choose a monorepo or private packages on something like &lt;a href="https://github.com/features/packages" rel="noopener noreferrer"&gt;GitHub Packages&lt;/a&gt; instead of submodules. If you get to make that call, it’s worth considering those options for new projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://git-lfs.com/" rel="noopener noreferrer"&gt;Git LFS&lt;/a&gt;&lt;/strong&gt; is a Git extension for video, audio, large binaries, and other big files. It stores the large data outside the repository and keeps only pointers to it in Git. On GitHub, Git LFS is currently the only way to manage files over 100 MB in a repository&lt;sup&gt;3&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;It’s widely used in fields like game development, and it isn’t supported either. Work is underway, with several PRs already submitted&lt;sup&gt;4&lt;/sup&gt;, but some design questions remain unresolved, including ones that affect other features. There’s still no clear timeline for a release.&lt;/p&gt;

&lt;p&gt;Finally, &lt;strong&gt;Git hooks&lt;/strong&gt;. Hooks run your own scripts in response to specific Git actions, and far more teams rely on them than on the other two features. Typical uses are running formatters and linters before a commit, or tests and security audits before a push. &lt;a href="https://typicode.github.io/husky/" rel="noopener noreferrer"&gt;Husky&lt;/a&gt; with &lt;a href="https://github.com/lint-staged/lint-staged" rel="noopener noreferrer"&gt;lint-staged&lt;/a&gt;, and &lt;a href="https://lefthook.dev/" rel="noopener noreferrer"&gt;Lefthook&lt;/a&gt;, are the popular tools here.&lt;/p&gt;

&lt;p&gt;Jujutsu commands never trigger Git hooks. &lt;code&gt;jj git push&lt;/code&gt;, for example, calls &lt;code&gt;git push&lt;/code&gt; internally, but passes &lt;code&gt;--no-verify&lt;/code&gt; to deliberately skip hooks&lt;sup&gt;5&lt;/sup&gt;. Officially, there’s no way to trigger Git hooks at a time of your choosing, and no Jujutsu-native hook mechanism either.&lt;/p&gt;

&lt;p&gt;The reason is that hooks don’t match Jujutsu’s core design and data model. A couple of factors stand out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jujutsu automatically commits your file changes as you work, so there’s no explicit commit step that hooks can run before.&lt;/li&gt;
&lt;li&gt;Jujutsu rewrites code without going through your working directory, for example when you squash or when editing an old commit automatically rebases its descendants. Passing tests at the first commit doesn’t guarantee anything later on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While they don’t cover everything Git hooks can do, Jujutsu does offer a few official tools that fit its model. With &lt;code&gt;jj fix&lt;/code&gt;, you register formatters in your config, and running it walks back through your mutable history and formats the files changed in each commit. &lt;code&gt;jj run&lt;/code&gt; executes an external command against a single commit or a range of commits. You can use it to run builds or tests across your history, and since it writes any file changes the command makes back into the target commits, it also works for autofixing linters or other code-fixing tools.&lt;/p&gt;

&lt;p&gt;So what if your team has an elaborate hook setup built around Git and you want to be the only one using Jujutsu? There are several approaches depending on the situation, and the topic could easily fill an article or two, so I’ll skip it here. If you’re curious, my book &lt;a href="https://juju-chu.com/" rel="noopener noreferrer"&gt;&lt;em&gt;Juju-chu! Starting Your Jujutsu×AI Workflow with &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;&lt;/a&gt; covers this in section 4-3, “Alternative Tactics for Git Hooks.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Q3. Does Jujutsu Work with GitHub?
&lt;/h2&gt;

&lt;p&gt;It does. Because Jujutsu uses Git as its backend, it works fine whether your remote lives on GitHub, GitLab, or Bitbucket. The catch is that Jujutsu shares work through a different concept called a &lt;strong&gt;&lt;a href="https://www.jj-vcs.dev/latest/bookmarks/" rel="noopener noreferrer"&gt;bookmark&lt;/a&gt;&lt;/strong&gt; instead of a branch, and getting comfortable with that can be the real hurdle.&lt;/p&gt;

&lt;p&gt;Jujutsu has nothing that corresponds to Git’s named branches. You normally work on anonymous branches, and when it’s time to share, you put a bookmark on whichever commit you want. When you push a bookmarked commit to a remote, Git sees it as a branch. The confusing part is that GitHub treats it as a branch even though it’s a different concept that behaves differently. Newcomers often find these points surprising:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A bookmark doesn’t move to your latest commit automatically. You move it yourself.&lt;/li&gt;
&lt;li&gt;A mechanism called tracking keeps a bookmark’s position, and its deletion, in sync between local and remote.&lt;/li&gt;
&lt;li&gt;Tracking is practically essential, so local and remote bookmark names must match.&lt;/li&gt;
&lt;li&gt;You can also create a bookmark on the fly at push time with the &lt;code&gt;-c/--change&lt;/code&gt; or &lt;code&gt;--named&lt;/code&gt; option, even if none exists yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why Jujutsu has bookmarks instead of branches, and what you gain by sharing work through them, is covered in detail in my previous post, &lt;a href="https://juju-chu.com/blog/rethinking-branch-with-jj" rel="noopener noreferrer"&gt;“Jujutsu Has No “Create a Branch” Step, and That Finally Made Git Branches Click”&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One way Jujutsu behaves differently from Git after you push: if you rewrite commits you’ve already pushed and push again, it becomes a force push without you doing anything special. Jujutsu always pushes in a way that’s close to &lt;code&gt;--force-with-lease&lt;/code&gt;, and accidental rewrites are guarded against locally by whether each commit is mutable or immutable. By default, though, pushed commits outside of trunk are still mutable, so you can rewrite them, and pushing the result ends up as a force push.&lt;/p&gt;

&lt;p&gt;This can clash with the policy of teams that develop on shared feature branches. In that case, change which commits count as immutable with a setting like this&lt;sup&gt;6&lt;/sup&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[revset-aliases]&lt;/span&gt;
&lt;span class="err"&gt;'immutable_heads()'&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="err"&gt;'builtin_immutable_heads()&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;remote_bookmarks("feature/*",&lt;/span&gt; &lt;span class="err"&gt;"origin")'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Beyond that, opening, approving, and merging PRs, and CI/CD with GitHub Actions and the like, work almost exactly the same with Jujutsu. About the only difference is that when you delete the remote branch on GitHub after merging a PR, the next &lt;code&gt;jj git fetch&lt;/code&gt; deletes the linked local bookmark too.&lt;/p&gt;
&lt;h2&gt;
  
  
  Q4. So What Does Jujutsu Actually Give You Over Git?
&lt;/h2&gt;

&lt;p&gt;Compared with Git, here’s what you get by switching to Jujutsu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No index (staging area).&lt;/strong&gt; There’s nothing like &lt;code&gt;git add&lt;/code&gt; to run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commits happen automatically.&lt;/strong&gt; Whenever you run a &lt;code&gt;jj&lt;/code&gt; command and files have changed since the latest commit, Jujutsu takes a new snapshot and updates the commit.&lt;/li&gt;
&lt;li&gt;Thanks to those two, &lt;strong&gt;the working copy (what Git calls the working tree) is treated as a commit&lt;/strong&gt; in its own right. You can move around history like a time machine without worrying about uncommitted changes or keeping the index consistent, as you would in Git.&lt;/li&gt;
&lt;li&gt;When you rewrite any commit, &lt;strong&gt;its descendants are rebased automatically&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;However many conflicts a rebase hits, it finishes normally without dropping you into an interactive mode, leaving the conflicts in place. Because &lt;strong&gt;conflicted states are recorded in history&lt;/strong&gt; , redoing a resolution or handing it to a tool is easy.&lt;/li&gt;
&lt;li&gt;Apart from anything that touches a remote, &lt;strong&gt;&lt;code&gt;jj undo&lt;/code&gt; can undo almost any operation&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Every &lt;code&gt;jj&lt;/code&gt; command that changes the repository, and every automatic snapshot, is &lt;strong&gt;recorded in the operation log&lt;/strong&gt;. Later, you can restore the repository to an earlier state or revert a specific operation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No need to create and name a branch&lt;/strong&gt; just to experiment. Start with &lt;code&gt;jj new&lt;/code&gt;, and if you don’t like where it’s going, throw it away with &lt;code&gt;jj abandon&lt;/code&gt; and try again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The commands are straightforward and easy to remember.&lt;/strong&gt; Squashing, for example, is &lt;code&gt;jj squash --from A --into B&lt;/code&gt;. Options that specify what to operate on and where to put it, like &lt;code&gt;-f/--from&lt;/code&gt;, &lt;code&gt;-t/--into&lt;/code&gt;, &lt;code&gt;-o/--onto&lt;/code&gt;, &lt;code&gt;-A/--insert-after&lt;/code&gt;, and &lt;code&gt;-B/--insert-before&lt;/code&gt;, work consistently across related commands.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Q5. Is the Learning Curve Steep?
&lt;/h2&gt;

&lt;p&gt;You don’t need many commands to get started. With just these, you should be able to handle the whole basic workflow:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you want to do&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Check the status&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj st&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;View the log&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj log&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;View the diff&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj diff&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update the commit message&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj desc -m '...'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start the next piece of work&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj new&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Undo the last operation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj undo&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set a bookmark&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj bookmark set &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fetch from the remote&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj git fetch&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Push to the remote&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj git push -b &amp;lt;bookmark&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even this much gets you the benefits of automatic commits and undo, and if those feel valuable, you’ve cleared the first hurdle. The trouble comes after that. The more Git experience people have, the more likely they are to use Jujutsu with their Git mental model intact, looking things up in a command mapping table&lt;sup&gt;7&lt;/sup&gt;. That way, you’re just translating Git operations one by one, missing much of what makes Jujutsu useful while adding the chore of translating commands.&lt;/p&gt;

&lt;p&gt;Jujutsu was designed to fix what makes Git hard to use. It stays compatible with Git but rethinks the mental model from the ground up. To get the most out of it, you have to follow Yoda’s advice: “You must unlearn what you have learned.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzwopz9jlf8gj8130bj1w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzwopz9jlf8gj8130bj1w.jpg" alt="A quote from Yoda" width="799" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s why the next stage is the hard part. The difficulty doesn’t come from Jujutsu being complicated. It comes from having to rethink version control habits you’ve built up over years with Git, and let go of concepts you’ve always taken for granted. Every now and then I see people who never realize this, keep running their Git workflow on top of Jujutsu, feel no benefit, and go back to Git.&lt;/p&gt;

&lt;p&gt;In my experience, focusing on these three things is the quickest way to develop a Jujutsu mental model:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Understand what a change is, Jujutsu’s usual unit of history&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Think of a change as a container with a name and an ID that never changes, and of commits (also called revisions) as successive versions of a document stored inside it. It’s not technically precise, but it’s an easy picture for beginners&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drop the idea that you commit only once your work is finished&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;In Jujutsu, every time you change code or the description (roughly, the commit message), it’s as if &lt;code&gt;git commit --amend --no-edit&lt;/code&gt; runs instantly and automatically. Changes are unfinished by default, and when you reach a stopping point, you simply move on to another change&lt;/li&gt;
&lt;li&gt;Don’t use &lt;code&gt;jj commit&lt;/code&gt;, which runs &lt;code&gt;jj desc&lt;/code&gt; and then &lt;code&gt;jj new&lt;/code&gt; in one step and exists to support Git-style workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get used to not having a “current branch” while you work&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Stick to one flow: work on an anonymous branch, and set a bookmark only when you want to share&lt;/li&gt;
&lt;li&gt;Build the habit of checking where you are in the graph that &lt;code&gt;jj log&lt;/code&gt; draws, instead of by branch name&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once you let go of your Git workflow and keep working the Jujutsu way, the logic behind its design starts to click. By then, Jujutsu will feel like second nature, and you won’t want to work without it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Q6. Jujutsu Isn’t 1.0 Yet. Is It Safe to Use at Work?
&lt;/h2&gt;

&lt;p&gt;The short answer: if the issues in Q2 don’t affect you, there’s almost nothing stopping you in practice. The CLI and configuration will keep changing, though, so whether you can live with that is the real question when deciding to adopt it.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/jj-vcs/jj/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt; in the official GitHub repository says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Jujutsu is an &lt;strong&gt;experimental version control system&lt;/strong&gt;. While Git compatibility is stable, and most developers use it daily for all their needs, there may still be work-in-progress features, suboptimal UX, and workflow gaps that make it unusable for your particular use.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It also says that workflows may change and that backward-incompatible changes to the on-disk format may come before 1.0, adding that the project will try to provide transparent upgrades when the format changes.&lt;/p&gt;

&lt;p&gt;That might sound a little worrying, but there haven’t been any big breaking changes recently. Most of them have been removals of deprecated settings and command options, or changes to system requirements. &lt;a href="https://www.jj-vcs.dev/latest/changelog/#0380-2026-02-04" rel="noopener noreferrer"&gt;v0.38.0&lt;/a&gt;, released in February 2026, moved where per-repository config files are stored, but that was for security reasons, a necessary step to protect users from malicious attacks.&lt;/p&gt;

&lt;p&gt;Martin von Zweigbergk, a former Google engineer, started Jujutsu as a side project in late 2019, and the first version on GitHub, v0.3.0, came out in March 2022. That’s four and a half years ago. Since v0.9.0 in September 2023, a new version has shipped almost every month. It may not be 1.0 yet, but it has a solid track record behind it.&lt;/p&gt;

&lt;p&gt;As of October 2026, the official GitHub repository has about 32,000 stars. The project has nine maintainers, and each release credits around 30 contributors. Engineers from several companies, Google among them, contribute on an ongoing basis, and the official docs list the companies that pay for Jujutsu contributions along with their contributing employees&lt;sup&gt;8&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;What about real-world adoption? I mentioned that the creator came from Google. According to him, about 900 people inside Google were already using Jujutsu as of September 2025&lt;sup&gt;9&lt;/sup&gt;. In July 2026, he became CTO of &lt;a href="https://www.ersc.io/" rel="noopener noreferrer"&gt;ERSC&lt;/a&gt;, a hosting platform company whose storage is designed around Jujutsu’s model and which plans to support a native protocol for Jujutsu clients in the future. The fact that companies are building businesses with Jujutsu at their core is one good sign of its reliability.&lt;/p&gt;

&lt;p&gt;On top of that, &lt;a href="https://docs.github.com/en/pull-requests/how-tos/stacked-pull-requests" rel="noopener noreferrer"&gt;GitHub stacked pull requests&lt;/a&gt;, which split a PR into a chain of small, dependent PRs, recently became generally available, and their documentation includes a page that walks through a workflow using Jujutsu&lt;sup&gt;10&lt;/sup&gt;. It’s fair to read this as a sign that GitHub sees Jujutsu as a compatible client with too many users to ignore, and one worth supporting.&lt;/p&gt;

&lt;p&gt;I don’t think Jujutsu is still pre-1.0 because of concerns about its quality or reliability. Rather, I suspect the developers want to keep the freedom to change its design while it continues to evolve. Many developers already use it every day, and companies continue to back its development. At the very least, being pre-1.0 is no reason on its own to avoid using it at work.&lt;/p&gt;
&lt;h2&gt;
  
  
  Q7. Why Is It Called “Jujutsu”?
&lt;/h2&gt;

&lt;p&gt;A lot of people assume the name comes from the anime &lt;em&gt;Jujutsu Kaisen&lt;/em&gt;. In Japan, it even gets teased on social media for sounding a bit edgy and over-the-top. But Jujutsu has nothing to do with &lt;em&gt;Jujutsu Kaisen&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;So where does the name come from? The official &lt;a href="https://github.com/jj-vcs/jj/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt; on GitHub suggests that the command name &lt;code&gt;jj&lt;/code&gt; came first:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The command-line tool is called jj for now because it’s easy to type and easy to replace (rare in English). The project is called “Jujutsu” because it matches “jj”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With your right index finger resting on J on the home row, it’s just two taps, so it really is easy to type. The README makes it sound as if Jujutsu was picked as a name that fits jj from the start, but the project actually had a different name at first. On crates.io, Rust’s official package registry, there’s a VCS called &lt;a href="https://crates.io/crates/jujube" rel="noopener noreferrer"&gt;Jujube&lt;/a&gt;. Its author is Martin von Zweigbergk, and it has two versions, 0.1.0 and 0.1.1, released in January 2021. Yes, this is Jujutsu’s predecessor. Here’s what its page says about the name:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The command-line tool is called jj for now because it’s easy to type and easy to replace (rare in English). The project is called “Jujube” (a fruit) because that’s the first word I could think of that matched “jj”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A jujube is a fruit, also known as a red date or Chinese date, and again it was chosen simply because it matched jj. Just four months later, the name changed. The &lt;a href="https://github.com/jj-vcs/jj/commit/d42e6c77b26bd6f47a59ad18158a79e6bddb30d1" rel="noopener noreferrer"&gt;commit message&lt;/a&gt; from that rename is still there:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;project: rename project from Jujube to Jujutsu “Jujutsu” is probably much more familiar and relatable to most people. Also, I’m still not sure how “jujube” is supposed to be pronounced :P&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The author apparently had no particular attachment to Jujube, and switched to Jujutsu because it was more familiar and relatable. When someone later asked where the name came from&lt;sup&gt;11&lt;/sup&gt;, he pointed to the &lt;a href="https://en.wikipedia.org/wiki/Jujutsu" rel="noopener noreferrer"&gt;Wikipedia article on jujutsu&lt;/a&gt;, so it refers to the Japanese martial art. In English, the traditional Japanese art is usually spelled “jujutsu,” while “jiu-jitsu” is the spelling most people know from Brazilian jiu-jitsu. Wikipedia does have a separate &lt;a href="https://en.wikipedia.org/wiki/Brazilian_jiu-jitsu" rel="noopener noreferrer"&gt;Brazilian jiu-jitsu article&lt;/a&gt;, but searching for “jiu-jitsu” or “jiujitsu” redirects you to the jujutsu article. Without that redirect, the project might be called Jiu-jitsu today.&lt;/p&gt;

&lt;p&gt;So is it settled that the name means the martial art? Not quite. The author says he never gave the name any special meaning. When someone proposed renaming Jujutsu to Jojo&lt;sup&gt;12&lt;/sup&gt;, he didn’t seem very attached to Jujutsu either, suggesting they could hold a vote. There was also a proposal to officially adopt a different meaning and pronunciation&lt;sup&gt;13&lt;/sup&gt;. In Japanese, “jujutsu” can stand for two different words: 柔術 (jūjutsu, the martial art) and 呪術 (jujutsu, sorcery or curses, the word in &lt;em&gt;Jujutsu Kaisen&lt;/em&gt;). The proposal was to make 呪術 the official one, and the author himself liked the idea at first. In the end, though, defining an official meaning or pronunciation was set aside.&lt;/p&gt;

&lt;p&gt;The official logo, in use since 2025, shows the same stance of not giving the name any particular meaning.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F62k02ofcc8dazebm77hn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F62k02ofcc8dazebm77hn.png" alt="The Jujutsu logo" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two blue birds sit back to back. They’re jays, members of the crow family. Put two of them together and you get “jay jay.” Not just the name, but the logo too is a pun on jj. If the martial art were the official meaning, the logo would surely show something related to it, but it doesn’t.&lt;/p&gt;

&lt;p&gt;In the end, it all started with jj, a short command name that’s easy to type. The project was named Jujutsu after the martial art, yet officially it means neither 柔術 nor 呪術. Jujutsu is just Jujutsu, and that’s probably the real answer to where the name comes from.&lt;/p&gt;
&lt;h2&gt;
  
  
  Still Have Questions?
&lt;/h2&gt;

&lt;p&gt;Those are seven questions Git users are likely to have when they’re thinking about giving Jujutsu a try. Some of these answers are reworked from the FAQ in Chapter 5, “The Jujutsu Problem-Solving Guide,” of my book, &lt;strong&gt;&lt;em&gt;Juju-chu! Starting Your Jujutsu×AI Workflow with &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://juju-chu.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Fog%2Fen%2Fdefault.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://juju-chu.com/" rel="noopener noreferrer" class="c-link"&gt;
            Juju-chu! — Starting Your Jujutsu × AI Workflow with jj new
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A hands-on book on adopting Jujutsu (jj) with Claude Code and Codex: automatic snapshots, undoable operations, and safe history rewriting.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Ficons%2Ffavicon.ico" width="48" height="48"&gt;
          juju-chu.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;The book covers many more of the questions Jujutsu newcomers tend to have, along with how to deal with the problems you’re likely to run into once you start. If you’re getting started with Jujutsu, it should save you a lot of time, so please check it out.&lt;/p&gt;

&lt;h2 id="footnote-label"&gt;Footnotes&lt;/h2&gt;

&lt;ol&gt;
&lt;li id="user-content-fn-jj-plug"&gt;
&lt;p&gt;Besides Git, Jujutsu can also use &lt;a href="https://en.wikipedia.org/wiki/Piper_(source_control_system)" rel="noopener noreferrer"&gt;Piper&lt;/a&gt;, the version control system used inside Google, as a backend, but that part isn’t public. A native Jujutsu backend seems to be on the wish list, but no concrete plan has been announced. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-submod-sup"&gt;
&lt;p&gt;&lt;a href="https://docs.jj-vcs.dev/latest/roadmap/#submodule-support" rel="noopener noreferrer"&gt;“Submodule support - Development roadmap - Jujutsu docs”&lt;/a&gt;
&lt;a href="https://github.com/jj-vcs/jj/issues/494" rel="noopener noreferrer"&gt;“Add support for Git submodules · Issue #494 · jj-vcs/jj”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-gh-lg-file"&gt;
&lt;p&gt;&lt;a href="https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-large-files-on-github" rel="noopener noreferrer"&gt;“About large files on GitHub - GitHub Docs”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-sup-lfs"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/issues/80" rel="noopener noreferrer"&gt;“Add support for Git LFS · Issue #80 · jj-vcs/jj”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-no-verify"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/blob/main/lib/src/git_subprocess.rs" rel="noopener noreferrer"&gt;“jj/lib/src/git_subprocess.rs at main · jj-vcs/jj”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-other-immutable"&gt;
&lt;p&gt;The official docs also show other settings, such as one that prevents you from rewriting commits created by other people.
&lt;a href="https://www.jj-vcs.dev/latest/config/#set-of-immutable-commits" rel="noopener noreferrer"&gt;“Set of immutable commits - Configuration - Jujutsu docs”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-git-cmd-table"&gt;
&lt;p&gt;The official docs provide one too. &lt;a href="https://docs.jj-vcs.dev/latest/git-command-table/" rel="noopener noreferrer"&gt;“Git command table - Jujutsu docs”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-contrib"&gt;
&lt;p&gt;&lt;a href="https://docs.jj-vcs.dev/latest/paid_contributors/" rel="noopener noreferrer"&gt;“Paying employers and their contributing employees - Jujutsu docs”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-jjcon-keynote"&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=VwmFyowbSR0" rel="noopener noreferrer"&gt;“JJ Con • Keynote - YouTube”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-other-tool"&gt;
&lt;p&gt;&lt;a href="https://docs.github.com/en/pull-requests/reference/use-other-tools-with-stacked-pull-requests" rel="noopener noreferrer"&gt;“Use other tools with stacked pull requests - GitHub Docs”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-disc3021"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/discussions/3021" rel="noopener noreferrer"&gt;“Question: What’s ‘jujutsu’ from? · jj-vcs/jj · Discussion #3021”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-disc2520"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/discussions/2520" rel="noopener noreferrer"&gt;“Proposal: Rename Jujutsu to Jojo · jj-vcs/jj · Discussion #2520”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-pr3042"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/pull/3042" rel="noopener noreferrer"&gt;“meta: cement “Jujutsu” (呪術) as the project name by thoughtpolice · Pull Request #3042 · jj-vcs/jj”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>jujutsu</category>
      <category>jj</category>
      <category>git</category>
      <category>github</category>
    </item>
    <item>
      <title>¿Jujutsu funciona con GitHub? ¿De dónde viene el nombre? 7 preguntas y respuestas</title>
      <dc:creator>Yuka Ooka</dc:creator>
      <pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/jujuchu-es/jujutsu-funciona-con-github-de-donde-viene-el-nombre-7-preguntas-y-respuestas-2a3p</link>
      <guid>https://dev.to/jujuchu-es/jujutsu-funciona-con-github-de-donde-viene-el-nombre-7-preguntas-y-respuestas-2a3p</guid>
      <description>&lt;h2&gt;
  
  
  Q1. ¿Puedo usar Jujutsu con mis repositorios de Git existentes?
&lt;/h2&gt;

&lt;p&gt;Sí. Jujutsu es altamente compatible con Git, y basta con ejecutar &lt;code&gt;jj git init&lt;/code&gt; dentro de un repositorio de Git existente para empezar a usarlo. No pierdes nada por probarlo y no tienes que dejar Git.&lt;/p&gt;

&lt;p&gt;La capa de almacenamiento de Jujutsu es modular, y Git es el backend por defecto&lt;sup&gt;1&lt;/sup&gt;. El backend de Git guarda los commits como objetos de Git normales, así que el historial que creas con Jujutsu también se puede consultar con las herramientas de Git.&lt;/p&gt;

&lt;p&gt;Un repositorio en el que Jujutsu y Git conviven se llama &lt;strong&gt;colocated&lt;/strong&gt;. Antes tenías que pasarle la opción &lt;code&gt;--colocate&lt;/code&gt; a &lt;code&gt;jj git init&lt;/code&gt;, o a &lt;code&gt;jj git clone&lt;/code&gt; al copiar un repositorio remoto, para configurarlo así. Desde la &lt;a href="https://docs.jj-vcs.dev/latest/changelog/#0340-2025-10-01" rel="noopener noreferrer"&gt;v0.34.0&lt;/a&gt;, publicada en octubre de 2025, colocated es la opción por defecto. Todavía vas a ver &lt;code&gt;--colocate&lt;/code&gt; en artículos viejos, pero hoy puedes omitirla sin problema.&lt;/p&gt;

&lt;p&gt;En un repositorio colocated, hay un directorio &lt;code&gt;.jj/&lt;/code&gt; junto a &lt;code&gt;.git/&lt;/code&gt; en la raíz. El &lt;code&gt;.gitignore&lt;/code&gt; que está dentro de &lt;code&gt;.jj/&lt;/code&gt; contiene &lt;code&gt;/*&lt;/code&gt;, así que agregar Jujutsu no toca el &lt;code&gt;.gitignore&lt;/code&gt; de la raíz. Como mencioné antes, el historial de commits de Git se sigue actualizando mientras usas Jujutsu, y puedes hacer push a GitHub o a cualquier otro remoto como siempre. También soporta commits firmados, así que funciona en repositorios que los exigen. En otras palabras, si quieres, puedes ser la única persona que usa Jujutsu en un equipo que trabaja con Git.&lt;/p&gt;

&lt;p&gt;Los comandos de Git también siguen funcionando en un repositorio colocated. Y si decides que Jujutsu no es para ti, puedes volver a Git borrando el directorio &lt;code&gt;.jj/&lt;/code&gt;. Jujutsu deja tu configuración de Git tal como está, lo que hace que probarlo no tenga prácticamente ningún costo ni riesgo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q2. ¿Qué cosas puede hacer Git que Jujutsu todavía no?
&lt;/h2&gt;

&lt;p&gt;Pese a toda su compatibilidad con Git, Jujutsu todavía no soporta algunas funciones de Git, ni siquiera en la v0.46.0, la versión más reciente a octubre de 2026. Estas tres son las que más problemas suelen causar en proyectos reales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Submódulos&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LFS (Large File Storage)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hooks de Git o un equivalente directo&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La más grave es probablemente la falta de soporte para &lt;strong&gt;submódulos&lt;/strong&gt;. Los submódulos de Git te permiten incrustar otro repositorio Git independiente como un subdirectorio, normalmente para compartir código entre proyectos.&lt;/p&gt;

&lt;p&gt;Que no tengan soporte no significa que vayas a perder el contenido de tus submódulos. El verdadero problema es que no se actualizan automáticamente cuando te mueves por el historial. Con &lt;code&gt;jj edit&lt;/code&gt; puedes saltar a cualquier punto del historial como en una máquina del tiempo y ver o editar los archivos ahí, pero los directorios de los submódulos se quedan como estaban. Tienes que ejecutar &lt;code&gt;git submodule update --recursive&lt;/code&gt; manualmente cada vez.&lt;/p&gt;

&lt;p&gt;Jujutsu también ignora los cambios que haces dentro de un submódulo, así que para registrarlos en el historial tienes que ejecutar &lt;code&gt;git add&lt;/code&gt; y &lt;code&gt;git commit&lt;/code&gt; tú mismo. Puedes trabajar en un repositorio con submódulos, pero tienes que entender las limitaciones y encargarte a mano de las operaciones que no están soportadas.&lt;/p&gt;

&lt;p&gt;Del lado del desarrollo, los submódulos no encajan bien con el modelo de datos de Jujutsu, y soportarlos requeriría grandes cambios de diseño, que es una de las principales razones por las que el soporte se ha retrasado. Está en la hoja de ruta, pero buena parte de la documentación de diseño sigue sin terminar y no hay un plazo de implementación a la vista&lt;sup&gt;2&lt;/sup&gt;. Hoy en día, los equipos que necesitan compartir código suelen elegir un monorepo o paquetes privados en algo como &lt;a href="https://github.com/features/packages" rel="noopener noreferrer"&gt;GitHub Packages&lt;/a&gt; en lugar de submódulos. Si te toca tomar esa decisión, vale la pena considerar esas opciones para los proyectos nuevos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://git-lfs.com/" rel="noopener noreferrer"&gt;Git LFS&lt;/a&gt;&lt;/strong&gt; es una extensión de Git para video, audio, binarios grandes y otros archivos pesados. Guarda los datos grandes fuera del repositorio y mantiene en Git solo punteros a ellos. En GitHub, Git LFS es actualmente la única forma de gestionar en un repositorio archivos de más de 100 MB&lt;sup&gt;3&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Se usa mucho en áreas como el desarrollo de videojuegos, y tampoco está soportado. Se está trabajando en ello, con varios PRs ya abiertos&lt;sup&gt;4&lt;/sup&gt;, pero quedan algunas cuestiones de diseño sin resolver, incluidas algunas que afectan a otras funciones. Todavía no hay un plazo claro para su lanzamiento.&lt;/p&gt;

&lt;p&gt;Por último, los &lt;strong&gt;hooks de Git&lt;/strong&gt;. Los hooks ejecutan tus propios scripts en respuesta a acciones específicas de Git, y muchos más equipos dependen de ellos que de las otras dos funciones. Los usos típicos son correr formateadores y linters antes de un commit, o tests y auditorías de seguridad antes de un push. &lt;a href="https://typicode.github.io/husky/" rel="noopener noreferrer"&gt;Husky&lt;/a&gt; con &lt;a href="https://github.com/lint-staged/lint-staged" rel="noopener noreferrer"&gt;lint-staged&lt;/a&gt;, y &lt;a href="https://lefthook.dev/" rel="noopener noreferrer"&gt;Lefthook&lt;/a&gt;, son las herramientas populares para esto.&lt;/p&gt;

&lt;p&gt;Los comandos de Jujutsu nunca disparan los hooks de Git. &lt;code&gt;jj git push&lt;/code&gt;, por ejemplo, llama a &lt;code&gt;git push&lt;/code&gt; internamente, pero le pasa &lt;code&gt;--no-verify&lt;/code&gt; para saltarse los hooks a propósito&lt;sup&gt;5&lt;/sup&gt;. Oficialmente, no hay forma de disparar los hooks de Git en el momento que elijas, ni tampoco un mecanismo de hooks propio de Jujutsu.&lt;/p&gt;

&lt;p&gt;La razón es que los hooks no encajan con el diseño central ni con el modelo de datos de Jujutsu. Destacan un par de factores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jujutsu hace commit de tus cambios en los archivos automáticamente mientras trabajas, así que no hay un paso explícito de commit antes del cual puedan correr los hooks.&lt;/li&gt;
&lt;li&gt;Jujutsu reescribe código sin pasar por tu directorio de trabajo, por ejemplo, al hacer squash o cuando la edición de un commit anterior provoca un rebase automático de sus descendientes. Que las pruebas pasen en el commit original no garantiza que sigan pasando después.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aunque no cubren todo lo que hacen los hooks de Git, Jujutsu sí ofrece algunas herramientas oficiales que encajan con su modelo. Con &lt;code&gt;jj fix&lt;/code&gt;, registras formateadores en tu configuración y, al ejecutarlo, recorre hacia atrás tu historial mutable y formatea los archivos que cambiaron en cada commit. &lt;code&gt;jj run&lt;/code&gt; ejecuta un comando externo sobre un solo commit o sobre un rango de commits. Puedes usarlo para correr builds o tests a lo largo de tu historial, y como incorpora a los commits correspondientes los cambios que el comando realiza en los archivos, también sirve para linters con corrección automática u otras herramientas que arreglan código.&lt;/p&gt;

&lt;p&gt;¿Y si tu equipo tiene una configuración de hooks bien armada, pensada para Git, y quieres ser la única persona que usa Jujutsu? Hay varios enfoques según la situación, y el tema daría fácilmente para uno o dos artículos, así que aquí lo voy a dejar de lado. Si te interesa, mi libro &lt;a href="https://juju-chu.com/es" rel="noopener noreferrer"&gt;&lt;em&gt;Juju-chu! —Comienza tu flujo de trabajo Jujutsu × IA con &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;&lt;/a&gt; lo trata en la sección 4-3, «Tácticas alternativas para los Git hooks».&lt;/p&gt;

&lt;h2&gt;
  
  
  Q3. ¿Jujutsu funciona con GitHub?
&lt;/h2&gt;

&lt;p&gt;Sí. Como Jujutsu usa Git como backend, funciona sin problemas tanto si tu remoto está en GitHub como en GitLab o Bitbucket. El detalle es que Jujutsu comparte el trabajo mediante un concepto distinto llamado &lt;strong&gt;&lt;a href="https://www.jj-vcs.dev/latest/bookmarks/" rel="noopener noreferrer"&gt;bookmark&lt;/a&gt;&lt;/strong&gt; en lugar de una rama, y acostumbrarse a eso puede ser el verdadero obstáculo.&lt;/p&gt;

&lt;p&gt;Jujutsu no tiene nada que corresponda a las ramas con nombre de Git. Normalmente trabajas en ramas anónimas y, cuando llega el momento de compartir, pones un bookmark en el commit que quieras. Cuando haces push de un commit con bookmark a un remoto, Git lo ve como una rama. Lo confuso es que GitHub lo trata como una rama aunque es un concepto distinto que se comporta de otra manera. A quienes recién empiezan suelen sorprenderles estos puntos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un bookmark no se mueve automáticamente a tu commit más reciente; tienes que moverlo tú mismo.&lt;/li&gt;
&lt;li&gt;Un mecanismo llamado tracking mantiene sincronizada la posición de un bookmark (y su eliminación) entre el entorno local y el remoto.&lt;/li&gt;
&lt;li&gt;El tracking es prácticamente imprescindible, así que los nombres de los bookmarks locales y remotos tienen que coincidir.&lt;/li&gt;
&lt;li&gt;También puedes crear un bookmark sobre la marcha al hacer push con la opción &lt;code&gt;-c/--change&lt;/code&gt; o &lt;code&gt;--named&lt;/code&gt;, aunque todavía no exista ninguno.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por qué Jujutsu tiene bookmarks en lugar de ramas, y qué ganas al compartir el trabajo con ellos, lo explico en detalle en mi artículo anterior, &lt;a href="https://juju-chu.com/es/blog/rethinking-branch-with-jj" rel="noopener noreferrer"&gt;«Jujutsu no tiene un paso para “crear una rama”, y así por fin entendí las ramas de Git»&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hay una diferencia de comportamiento con Git después de hacer push: si reescribes commits que ya subiste y vuelves a hacer push, se convierte automáticamente en un force push. Jujutsu siempre hace push de una forma parecida a &lt;code&gt;--force-with-lease&lt;/code&gt;, y a nivel local estás protegido contra reescrituras accidentales según si cada commit es mutable o inmutable. Sin embargo, por defecto, los commits que ya subiste fuera de trunk siguen siendo mutables, así que puedes reescribirlos, y al hacer push del resultado terminas haciendo un force push.&lt;/p&gt;

&lt;p&gt;Esto puede chocar con la política de los equipos que desarrollan en feature branches compartidas. En ese caso, cambia qué commits se consideran inmutables con una configuración como esta&lt;sup&gt;6&lt;/sup&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[revset-aliases]&lt;/span&gt;
&lt;span class="err"&gt;'immutable_heads()'&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="err"&gt;'builtin_immutable_heads()&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;remote_bookmarks("feature/*",&lt;/span&gt; &lt;span class="err"&gt;"origin")'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Fuera de eso, abrir, aprobar y hacer merge de PRs, y el CI/CD con GitHub Actions y similares, funcionan casi exactamente igual con Jujutsu. Prácticamente la única diferencia es que, cuando borras la rama remota en GitHub después de hacer merge de un PR, el siguiente &lt;code&gt;jj git fetch&lt;/code&gt; también borra el bookmark local vinculado.&lt;/p&gt;
&lt;h2&gt;
  
  
  Q4. En resumen, ¿qué ventajas ofrece Jujutsu frente a Git?
&lt;/h2&gt;

&lt;p&gt;Comparado con Git, esto es lo que ganas al cambiarte a Jujutsu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No hay índice (staging area).&lt;/strong&gt; No existe un paso como &lt;code&gt;git add&lt;/code&gt; que tengas que ejecutar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Los commits se hacen automáticamente.&lt;/strong&gt; Cada vez que ejecutas un comando &lt;code&gt;jj&lt;/code&gt; y hay archivos que cambiaron desde el último commit, Jujutsu toma una nueva instantánea y actualiza el commit.&lt;/li&gt;
&lt;li&gt;Gracias a esas dos cosas, &lt;strong&gt;la copia de trabajo (lo que Git llama working tree) se trata como un commit en sí misma&lt;/strong&gt;. Puedes moverte por el historial como en una máquina del tiempo sin preocuparte por cambios pendientes de commit ni por mantener el índice consistente, como en Git.&lt;/li&gt;
&lt;li&gt;Cuando reescribes cualquier commit, &lt;strong&gt;se hace rebase automático de sus descendientes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Por más conflictos que surjan en un rebase, este termina normalmente sin forzarte a un modo interactivo y deja los conflictos en su lugar. Como &lt;strong&gt;los estados con conflictos quedan registrados en el historial&lt;/strong&gt; , rehacer una resolución o dejársela a una herramienta es fácil.&lt;/li&gt;
&lt;li&gt;Excepto por las operaciones que afectan al remoto, &lt;strong&gt;&lt;code&gt;jj undo&lt;/code&gt; puede deshacer casi cualquier cambio&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cada comando &lt;code&gt;jj&lt;/code&gt; que modifica el repositorio, y cada instantánea automática, &lt;strong&gt;se anota en el registro de operaciones (operation log)&lt;/strong&gt;. Más adelante puedes restaurar el repositorio a un estado anterior o revertir una operación específica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No hace falta crear una rama ni ponerle nombre&lt;/strong&gt; solo para experimentar. Empieza con &lt;code&gt;jj new&lt;/code&gt; y, si no te gusta cómo va, descártalo con &lt;code&gt;jj abandon&lt;/code&gt; y vuelve a intentarlo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Los comandos son directos y fáciles de recordar.&lt;/strong&gt; Hacer squash, por ejemplo, es &lt;code&gt;jj squash --from A --into B&lt;/code&gt;. Las opciones que indican sobre qué operar y dónde ponerlo, como &lt;code&gt;-f/--from&lt;/code&gt;, &lt;code&gt;-t/--into&lt;/code&gt;, &lt;code&gt;-o/--onto&lt;/code&gt;, &lt;code&gt;-A/--insert-after&lt;/code&gt; y &lt;code&gt;-B/--insert-before&lt;/code&gt;, funcionan de forma consistente en los comandos relacionados.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Q5. ¿Es muy pronunciada la curva de aprendizaje?
&lt;/h2&gt;

&lt;p&gt;No necesitas muchos comandos para empezar. Con solo estos, deberías poder manejar todo el flujo de trabajo básico:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lo que quieres hacer&lt;/th&gt;
&lt;th&gt;Comando&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ver el estado&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj st&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ver el log&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj log&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ver el diff&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj diff&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Actualizar el mensaje del commit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj desc -m '...'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Empezar el siguiente trabajo&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj new&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deshacer la última operación&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj undo&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Poner un bookmark&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj bookmark set &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traer cambios del remoto&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj git fetch&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hacer push al remoto&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj git push -b &amp;lt;bookmark&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Con solo esto ya aprovechas los commits automáticos y el undo, y si eso te parece valioso, ya superaste el primer obstáculo. El problema viene después. Mientras más experiencia tenga alguien con Git, más probable es que use Jujutsu con su modelo mental de Git intacto, consultando una tabla de equivalencias de comandos&lt;sup&gt;7&lt;/sup&gt;. Así, solo estás traduciendo operaciones de Git una por una: te pierdes buena parte de lo que hace útil a Jujutsu y encima sumas la tarea de traducir comandos.&lt;/p&gt;

&lt;p&gt;Jujutsu se diseñó para resolver lo que hace difícil usar Git. Se mantiene compatible con Git, pero replantea el modelo mental desde cero. Para sacarle el máximo provecho, tienes que seguir el consejo de Yoda: «Debes desaprender lo que has aprendido».&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzwopz9jlf8gj8130bj1w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzwopz9jlf8gj8130bj1w.jpg" alt="Una cita de Yoda" width="799" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por eso la siguiente etapa es la difícil. La dificultad no viene de que Jujutsu sea complicado. Viene de tener que replantear hábitos de control de versiones que construiste durante años con Git, y soltar conceptos que siempre diste por sentados. De vez en cuando veo gente que nunca se da cuenta de esto, sigue usando su flujo de trabajo de Git sobre Jujutsu, no siente ningún beneficio y vuelve a Git.&lt;/p&gt;

&lt;p&gt;En mi experiencia, enfocarse en estas tres cosas es la forma más rápida de desarrollar un modelo mental de Jujutsu:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Entiende qué es un change, la unidad habitual del historial en Jujutsu&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Piensa en un change como un contenedor con un nombre y un ID que nunca cambia, y en los commits (también llamados revisiones) como versiones sucesivas de un documento guardadas dentro de él. No es técnicamente preciso, pero es una imagen fácil para quienes empiezan&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Olvídate de la idea de que solo haces commit cuando terminaste tu trabajo&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;En Jujutsu, cada vez que cambias el código o la descripción (más o menos, el mensaje del commit), es como si &lt;code&gt;git commit --amend --no-edit&lt;/code&gt; se ejecutara al instante y de forma automática. Los changes están sin terminar por defecto y, cuando llegas a un buen punto para parar, simplemente pasas a otro change&lt;/li&gt;
&lt;li&gt;No uses &lt;code&gt;jj commit&lt;/code&gt;, que ejecuta &lt;code&gt;jj desc&lt;/code&gt; y luego &lt;code&gt;jj new&lt;/code&gt; en un solo paso y existe para soportar flujos de trabajo al estilo de Git&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acostúmbrate a no tener una «rama actual» mientras trabajas&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Apégate a un solo flujo: trabaja en una rama anónima y pon un bookmark solo cuando quieras compartir&lt;/li&gt;
&lt;li&gt;Desarrolla el hábito de ubicarte en el grafo que dibuja &lt;code&gt;jj log&lt;/code&gt;, en lugar de guiarte por el nombre de una rama&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Una vez que sueltas tu flujo de trabajo de Git y sigues trabajando a la manera de Jujutsu, la lógica detrás de su diseño empieza a encajar. Para entonces, usar Jujutsu se sentirá completamente natural y no vas a querer trabajar sin él.&lt;/p&gt;
&lt;h2&gt;
  
  
  Q6. Jujutsu todavía no está en la 1.0. ¿Es seguro usarlo en el trabajo?
&lt;/h2&gt;

&lt;p&gt;La respuesta corta: si los problemas de la Q2 no te afectan, en la práctica casi no hay nada que te lo impida. Eso sí, la CLI y la configuración van a seguir cambiando, así que la verdadera pregunta al decidir adoptarlo es si puedes vivir con eso.&lt;/p&gt;

&lt;p&gt;El &lt;a href="https://github.com/jj-vcs/jj/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt; del repositorio oficial en GitHub dice:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Jujutsu is an &lt;strong&gt;experimental version control system&lt;/strong&gt;. While Git compatibility is stable, and most developers use it daily for all their needs, there may still be work-in-progress features, suboptimal UX, and workflow gaps that make it unusable for your particular use.&lt;br&gt;&lt;br&gt;
(Jujutsu es un &lt;strong&gt;sistema de control de versiones experimental&lt;/strong&gt;. Aunque la compatibilidad con Git es estable y la mayoría de los desarrolladores lo usan a diario para todo lo que necesitan, todavía puede haber funciones en desarrollo, una UX mejorable y huecos en los flujos de trabajo que lo vuelvan inutilizable para tu caso particular).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;También dice que los flujos de trabajo pueden cambiar y que podría haber cambios incompatibles en el formato de los datos en disco antes de la 1.0, y agrega que el proyecto intentará ofrecer actualizaciones transparentes cuando el formato cambie.&lt;/p&gt;

&lt;p&gt;Puede sonar un poco preocupante, pero últimamente no ha habido grandes cambios incompatibles. La mayoría han sido eliminaciones de configuraciones y opciones de comandos obsoletas, o cambios en los requisitos del sistema. La &lt;a href="https://www.jj-vcs.dev/latest/changelog/#0380-2026-02-04" rel="noopener noreferrer"&gt;v0.38.0&lt;/a&gt;, publicada en febrero de 2026, cambió dónde se guardan los archivos de configuración de cada repositorio, pero fue por razones de seguridad, un paso necesario para proteger a los usuarios de ataques maliciosos.&lt;/p&gt;

&lt;p&gt;Martin von Zweigbergk, ex ingeniero de Google, empezó Jujutsu como proyecto personal a fines de 2019, y la primera versión en GitHub, la v0.3.0, salió en marzo de 2022. Eso fue hace cuatro años y medio. Desde la v0.9.0, en septiembre de 2023, sale una nueva versión casi todos los meses. Puede que todavía no sea 1.0, pero tiene una trayectoria sólida.&lt;/p&gt;

&lt;p&gt;A octubre de 2026, el repositorio oficial en GitHub tiene unas 32 000 estrellas. El proyecto tiene nueve maintainers, y cada release da crédito a unos 30 colaboradores. Ingenieros de varias empresas, Google entre ellas, contribuyen de forma continua. La documentación oficial enumera las empresas que financian el desarrollo de Jujutsu y los empleados que participan en él&lt;sup&gt;8&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;¿Y la adopción en el mundo real? Mencioné que el creador venía de Google. Según él, unas 900 personas dentro de Google ya usaban Jujutsu en septiembre de 2025&lt;sup&gt;9&lt;/sup&gt;. En julio de 2026 pasó a ser CTO de &lt;a href="https://www.ersc.io/" rel="noopener noreferrer"&gt;ERSC&lt;/a&gt;, una empresa que ofrece una plataforma de hosting cuyo almacenamiento está diseñado en torno al modelo de Jujutsu y que planea soportar en el futuro un protocolo nativo para clientes de Jujutsu. Que haya empresas que basan su negocio en Jujutsu es una buena señal de su confiabilidad.&lt;/p&gt;

&lt;p&gt;Además, los &lt;a href="https://docs.github.com/es/pull-requests/how-tos/stacked-pull-requests" rel="noopener noreferrer"&gt;stacked pull requests de GitHub&lt;/a&gt;, que dividen un PR en una cadena de PRs pequeños y dependientes, pasaron hace poco a disponibilidad general, y su documentación incluye una página que explica un flujo de trabajo con Jujutsu&lt;sup&gt;10&lt;/sup&gt;. Es razonable leer esto como una señal de que GitHub ve a Jujutsu como un cliente compatible, con demasiados usuarios como para ignorarlo, y al que vale la pena dar soporte.&lt;/p&gt;

&lt;p&gt;No creo que la falta de una 1.0 se deba a dudas sobre su calidad o su confiabilidad. Más bien, sospecho que los desarrolladores quieren conservar la libertad de cambiar su diseño mientras sigue evolucionando. Muchos desarrolladores ya lo usan todos los días, y hay empresas que siguen respaldando su desarrollo. Como mínimo, no haber llegado a la 1.0 no es por sí solo un motivo para evitar usarlo en el trabajo.&lt;/p&gt;
&lt;h2&gt;
  
  
  Q7. ¿Por qué se llama «Jujutsu»?
&lt;/h2&gt;

&lt;p&gt;Mucha gente da por hecho que el nombre viene del anime &lt;em&gt;Jujutsu Kaisen&lt;/em&gt;. En Japón, hasta se burlan de él en redes sociales por sonar un poco sobrado, como nombre de anime que quiere quedar intenso. Pero Jujutsu no tiene nada que ver con &lt;em&gt;Jujutsu Kaisen&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Entonces, ¿de dónde viene el nombre? El &lt;a href="https://github.com/jj-vcs/jj/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt; oficial en GitHub sugiere que primero vino el nombre del comando, &lt;code&gt;jj&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The command-line tool is called jj for now because it’s easy to type and easy to replace (rare in English). The project is called “Jujutsu” because it matches “jj”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Con el índice derecho apoyado en la J de la fila guía, son solo dos toques, así que de verdad es fácil de escribir. El README da a entender que Jujutsu se eligió desde el principio como un nombre que encajaba con jj, pero en realidad el proyecto tuvo otro nombre al comienzo. En crates.io, el registro oficial de paquetes de Rust, hay un VCS llamado &lt;a href="https://crates.io/crates/jujube" rel="noopener noreferrer"&gt;Jujube&lt;/a&gt;. Su autor es Martin von Zweigbergk, y tiene dos versiones, 0.1.0 y 0.1.1, publicadas en enero de 2021. Así es: es el predecesor de Jujutsu. Esto es lo que dice su página sobre el nombre:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The command-line tool is called jj for now because it’s easy to type and easy to replace (rare in English). The project is called “Jujube” (a fruit) because that’s the first word I could think of that matched “jj”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En inglés, &lt;em&gt;jujube&lt;/em&gt; es una fruta poco conocida por acá: el dátil chino (azufaifa). Una vez más, el nombre se eligió simplemente porque coincidía con jj. Apenas cuatro meses después, el nombre cambió. El &lt;a href="https://github.com/jj-vcs/jj/commit/d42e6c77b26bd6f47a59ad18158a79e6bddb30d1" rel="noopener noreferrer"&gt;mensaje del commit&lt;/a&gt; de ese cambio de nombre sigue ahí:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;project: rename project from Jujube to Jujutsu “Jujutsu” is probably much more familiar and relatable to most people. Also, I’m still not sure how “jujube” is supposed to be pronounced :P&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Al parecer, el autor no le tenía un apego especial a Jujube, y se cambió a Jujutsu porque era un nombre más conocido y cercano para la mayoría. Cuando más tarde alguien le preguntó de dónde venía el nombre&lt;sup&gt;11&lt;/sup&gt;, señaló el &lt;a href="https://en.wikipedia.org/wiki/Jujutsu" rel="noopener noreferrer"&gt;artículo de Wikipedia sobre el jujutsu&lt;/a&gt;, así que se refiere al arte marcial japonés. En inglés, el arte tradicional japonés suele escribirse «jujutsu», mientras que «jiu-jitsu» es la grafía que la mayoría conoce por el jiu-jitsu brasileño. La Wikipedia en inglés tiene un &lt;a href="https://en.wikipedia.org/wiki/Brazilian_jiu-jitsu" rel="noopener noreferrer"&gt;artículo aparte sobre el jiu-jitsu brasileño&lt;/a&gt;, pero si buscas «jiu-jitsu» o «jiujitsu», te redirige al artículo sobre el jujutsu. Sin esa redirección, quizá hoy el proyecto se llamaría Jiu-jitsu.&lt;/p&gt;

&lt;p&gt;Entonces, ¿queda claro que el nombre se refiere al arte marcial? No del todo. El autor dice que nunca le dio al nombre ningún significado especial. Cuando alguien propuso renombrar Jujutsu a Jojo&lt;sup&gt;12&lt;/sup&gt;, tampoco pareció muy apegado a Jujutsu, y sugirió que podían hacer una votación. También hubo una propuesta para adoptar oficialmente otro significado y otra pronunciación&lt;sup&gt;13&lt;/sup&gt;. En japonés, «jujutsu» puede corresponder a dos palabras distintas: 柔術 (jūjutsu, el arte marcial) y 呪術 (jujutsu, hechicería, la palabra de &lt;em&gt;Jujutsu Kaisen&lt;/em&gt;; las maldiciones son otra palabra). La propuesta era hacer oficial 呪術, y al propio autor la idea le gustó al principio. Al final, sin embargo, se dejó de lado definir un significado o una pronunciación oficiales.&lt;/p&gt;

&lt;p&gt;El logo oficial, que se usa desde 2025, muestra la misma postura de no darle al nombre ningún significado en particular.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F62k02ofcc8dazebm77hn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F62k02ofcc8dazebm77hn.png" alt="El logo de Jujutsu" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El logo muestra dos pájaros azules de espaldas uno al otro. Son arrendajos, de la familia de los cuervos, llamados &lt;em&gt;jays&lt;/em&gt; en inglés. La palabra &lt;em&gt;jay&lt;/em&gt; se pronuncia igual que la letra J en inglés: dos arrendajos forman «jay jay», es decir, jj. No solo el nombre: el logo también es un juego de palabras con jj. Si el arte marcial fuera el significado oficial, el logo seguramente mostraría algo relacionado con él, pero no es así.&lt;/p&gt;

&lt;p&gt;Al final, todo empezó con jj, un nombre de comando corto y fácil de escribir. El proyecto se llamó Jujutsu por el arte marcial y, aun así, oficialmente no significa ni 柔術 ni 呪術. Jujutsu es simplemente Jujutsu, y probablemente esa sea la verdadera respuesta a la pregunta de dónde viene el nombre.&lt;/p&gt;
&lt;h2&gt;
  
  
  ¿Todavía te quedan preguntas?
&lt;/h2&gt;

&lt;p&gt;Estas fueron siete preguntas que suelen hacerse los usuarios de Git cuando consideran darle una oportunidad a Jujutsu. Algunas de estas respuestas están reelaboradas a partir de las preguntas frecuentes del capítulo 5, «Guía de resolución de problemas de Jujutsu», de mi libro &lt;strong&gt;&lt;em&gt;Juju-chu! —Comienza tu flujo de trabajo Jujutsu × IA con &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://juju-chu.com/es" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Fog%2Fes%2Fdefault.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://juju-chu.com/es" rel="noopener noreferrer" class="c-link"&gt;
            Juju-chu! —Comienza tu flujo de trabajo Jujutsu × IA con jj new
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Una guía práctica para adoptar Jujutsu (jj) junto a Claude Code y Codex: snapshots automáticos, operaciones que siempre se pueden deshacer y una reescritura del historial que es segura.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Ficons%2Ffavicon.ico" width="48" height="48"&gt;
          juju-chu.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;El libro responde muchas más de las preguntas que suelen tener quienes recién llegan a Jujutsu, y explica cómo resolver los problemas con los que probablemente te encuentres cuando empieces. Si estás arrancando con Jujutsu, debería ahorrarte mucho tiempo, así que échale un vistazo.&lt;/p&gt;

&lt;h2 id="footnote-label"&gt;Footnotes&lt;/h2&gt;

&lt;ol&gt;
&lt;li id="user-content-fn-jj-plug"&gt;
&lt;p&gt;Además de Git, Jujutsu también puede usar como backend &lt;a href="https://en.wikipedia.org/wiki/Piper_(source_control_system)" rel="noopener noreferrer"&gt;Piper&lt;/a&gt;, el sistema de control de versiones que se usa dentro de Google, pero esa parte no es pública. Un backend nativo de Jujutsu parece estar en la lista de deseos, pero no se ha anunciado ningún plan concreto. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-submod-sup"&gt;
&lt;p&gt;&lt;a href="https://docs.jj-vcs.dev/latest/roadmap/#submodule-support" rel="noopener noreferrer"&gt;“Submodule support - Development roadmap - Jujutsu docs”&lt;/a&gt;
&lt;a href="https://github.com/jj-vcs/jj/issues/494" rel="noopener noreferrer"&gt;“Add support for Git submodules · Issue #494 · jj-vcs/jj”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-gh-lg-file"&gt;
&lt;p&gt;&lt;a href="https://docs.github.com/es/repositories/working-with-files/managing-large-files/about-large-files-on-github" rel="noopener noreferrer"&gt;“Acerca de los archivos grandes en GitHub - Documentación de GitHub”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-sup-lfs"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/issues/80" rel="noopener noreferrer"&gt;“Add support for Git LFS · Issue #80 · jj-vcs/jj”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-no-verify"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/blob/main/lib/src/git_subprocess.rs" rel="noopener noreferrer"&gt;“jj/lib/src/git_subprocess.rs at main · jj-vcs/jj”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-other-immutable"&gt;
&lt;p&gt;La documentación oficial también muestra otras configuraciones, como una que impide reescribir commits creados por otras personas.
&lt;a href="https://www.jj-vcs.dev/latest/config/#set-of-immutable-commits" rel="noopener noreferrer"&gt;“Set of immutable commits - Configuration - Jujutsu docs”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-git-cmd-table"&gt;
&lt;p&gt;La documentación oficial también tiene una. &lt;a href="https://docs.jj-vcs.dev/latest/git-command-table/" rel="noopener noreferrer"&gt;“Git command table - Jujutsu docs”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-contrib"&gt;
&lt;p&gt;&lt;a href="https://docs.jj-vcs.dev/latest/paid_contributors/" rel="noopener noreferrer"&gt;“Paying employers and their contributing employees - Jujutsu docs”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-jjcon-keynote"&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=VwmFyowbSR0" rel="noopener noreferrer"&gt;“JJ Con • Keynote - YouTube”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-other-tool"&gt;
&lt;p&gt;&lt;a href="https://docs.github.com/es/pull-requests/reference/use-other-tools-with-stacked-pull-requests" rel="noopener noreferrer"&gt;“Usa otras herramientas con pull requests apiladas - Documentación de GitHub”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-disc3021"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/discussions/3021" rel="noopener noreferrer"&gt;“Question: What’s ‘jujutsu’ from? · jj-vcs/jj · Discussion #3021”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-disc2520"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/discussions/2520" rel="noopener noreferrer"&gt;“Proposal: Rename Jujutsu to Jojo · jj-vcs/jj · Discussion #2520”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-pr3042"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/pull/3042" rel="noopener noreferrer"&gt;“meta: cement “Jujutsu” (呪術) as the project name by thoughtpolice · Pull Request #3042 · jj-vcs/jj”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>jujutsu</category>
      <category>git</category>
      <category>github</category>
      <category>spanish</category>
    </item>
    <item>
      <title>O Jujutsu funciona com o GitHub? De onde vem o nome? 7 perguntas e respostas</title>
      <dc:creator>Yuka Ooka</dc:creator>
      <pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/jujuchu-pt/o-jujutsu-funciona-com-o-github-de-onde-vem-o-nome-7-perguntas-e-respostas-21oo</link>
      <guid>https://dev.to/jujuchu-pt/o-jujutsu-funciona-com-o-github-de-onde-vem-o-nome-7-perguntas-e-respostas-21oo</guid>
      <description>&lt;h2&gt;
  
  
  Q1. Dá para usar o Jujutsu nos meus repositórios Git atuais?
&lt;/h2&gt;

&lt;p&gt;Dá, sim. O Jujutsu é altamente compatível com o Git, e basta rodar &lt;code&gt;jj git init&lt;/code&gt; dentro de um repositório Git existente para começar a usar o Jujutsu nele. Você não perde nada ao experimentar e não precisa abrir mão do Git.&lt;/p&gt;

&lt;p&gt;A camada de armazenamento do Jujutsu é plugável, e o Git é o backend padrão&lt;sup&gt;1&lt;/sup&gt;. O backend do Git guarda os commits como objetos Git comuns, então o histórico que você cria com o Jujutsu também pode ser acessado pelas ferramentas do Git.&lt;/p&gt;

&lt;p&gt;Um repositório em que o Jujutsu e o Git convivem lado a lado é chamado de &lt;strong&gt;colocated&lt;/strong&gt;. Antes, para ter um, você precisava passar a opção &lt;code&gt;--colocate&lt;/code&gt; para o &lt;code&gt;jj git init&lt;/code&gt;, ou para o &lt;code&gt;jj git clone&lt;/code&gt; ao copiar um repositório remoto. Desde a &lt;a href="https://docs.jj-vcs.dev/latest/changelog/#0340-2025-10-01" rel="noopener noreferrer"&gt;v0.34.0&lt;/a&gt;, lançada em outubro de 2025, colocated é o padrão. Você ainda vai ver &lt;code&gt;--colocate&lt;/code&gt; em artigos mais antigos, mas hoje pode ignorar essa opção sem medo.&lt;/p&gt;

&lt;p&gt;Num repositório colocated, um diretório &lt;code&gt;.jj/&lt;/code&gt; fica ao lado do &lt;code&gt;.git/&lt;/code&gt; na raiz. O &lt;code&gt;.gitignore&lt;/code&gt; dentro do &lt;code&gt;.jj/&lt;/code&gt; contém &lt;code&gt;/*&lt;/code&gt;, então adicionar o Jujutsu não mexe no &lt;code&gt;.gitignore&lt;/code&gt; da raiz. Como mencionei acima, o histórico de commits do Git continua sendo atualizado enquanto você usa o Jujutsu, e você pode fazer push para o GitHub ou qualquer outro remoto normalmente. Commits assinados também são suportados, então ele funciona em repositórios que os exigem. Ou seja, se quiser, você pode ser a única pessoa de um time de Git que usa o Jujutsu.&lt;/p&gt;

&lt;p&gt;Os comandos do Git também continuam funcionando num repositório colocated. E, se você decidir que o Jujutsu não é para você, dá para voltar ao Git apagando o diretório &lt;code&gt;.jj/&lt;/code&gt;. O Jujutsu deixa a sua configuração do Git do jeito que está, então testá-lo não traz praticamente nenhum custo nem risco.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q2. O que o Git faz que o Jujutsu não faz?
&lt;/h2&gt;

&lt;p&gt;Apesar de toda a compatibilidade com o Git, o Jujutsu ainda não suporta alguns recursos do Git, nem mesmo na v0.46.0, a versão mais recente em outubro de 2026. Três deles são os que têm mais chance de causar problemas em projetos reais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Submódulos&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LFS (Large File Storage)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hooks do Git ou um equivalente direto&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O mais sério deles provavelmente é a falta de suporte a &lt;strong&gt;submódulos&lt;/strong&gt;. Os submódulos do Git permitem embutir outro repositório Git independente como um subdiretório, normalmente para compartilhar código entre projetos.&lt;/p&gt;

&lt;p&gt;Não ter suporte não significa que o conteúdo dos seus submódulos se perde. O verdadeiro problema é que o conteúdo deles não se atualiza automaticamente quando você se move pelo histórico. Com &lt;code&gt;jj edit&lt;/code&gt;, dá para pular para qualquer ponto do histórico como numa máquina do tempo e ver ou editar os arquivos ali, mas os diretórios dos submódulos ficam como estavam. Você precisa rodar &lt;code&gt;git submodule update --recursive&lt;/code&gt; na mão toda vez.&lt;/p&gt;

&lt;p&gt;O Jujutsu também ignora as alterações que você faz dentro de um submódulo, então, para registrá-las no histórico, você precisa rodar &lt;code&gt;git add&lt;/code&gt; e &lt;code&gt;git commit&lt;/code&gt; por conta própria. Ainda dá para trabalhar num repositório com submódulos, mas você precisa entender as limitações e cuidar na mão das operações que não são suportadas.&lt;/p&gt;

&lt;p&gt;Do lado do desenvolvimento, os submódulos não combinam bem com o modelo de dados do Jujutsu, e suportá-los exigiria grandes mudanças de design, o que é um dos principais motivos do atraso. Isso está no roadmap, mas boa parte da documentação de design ainda não está pronta, e não há previsão de implementação&lt;sup&gt;2&lt;/sup&gt;. Hoje em dia, times que precisam compartilhar código costumam escolher um monorepo ou pacotes privados em algo como o &lt;a href="https://github.com/features/packages" rel="noopener noreferrer"&gt;GitHub Packages&lt;/a&gt; em vez de submódulos. Se a decisão for sua, vale a pena considerar essas opções em projetos novos.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;&lt;a href="https://git-lfs.com/" rel="noopener noreferrer"&gt;Git LFS&lt;/a&gt;&lt;/strong&gt; é uma extensão do Git para vídeo, áudio, binários grandes e outros arquivos pesados. Ele guarda os dados grandes fora do repositório e mantém no Git só ponteiros para eles. No GitHub, o Git LFS é hoje a única forma de gerenciar num repositório arquivos com mais de 100 MB&lt;sup&gt;3&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Ele é muito usado em áreas como desenvolvimento de jogos, e também não é suportado. O trabalho está em andamento, com vários PRs já abertos&lt;sup&gt;4&lt;/sup&gt;, mas ainda há questões de design em aberto, incluindo algumas que afetam outros recursos. Ainda não há uma previsão clara de lançamento.&lt;/p&gt;

&lt;p&gt;Por fim, os &lt;strong&gt;hooks do Git&lt;/strong&gt;. Os hooks executam scripts próprios em resposta a ações específicas do Git, e muito mais times dependem deles do que dos outros dois recursos. Os usos típicos são rodar formatadores e linters antes de um commit, ou testes e auditorias de segurança antes de um push. &lt;a href="https://typicode.github.io/husky/" rel="noopener noreferrer"&gt;Husky&lt;/a&gt; com &lt;a href="https://github.com/lint-staged/lint-staged" rel="noopener noreferrer"&gt;lint-staged&lt;/a&gt;, e &lt;a href="https://lefthook.dev/" rel="noopener noreferrer"&gt;Lefthook&lt;/a&gt;, são as ferramentas populares para isso.&lt;/p&gt;

&lt;p&gt;Os comandos do Jujutsu nunca disparam hooks do Git. O &lt;code&gt;jj git push&lt;/code&gt;, por exemplo, chama o &lt;code&gt;git push&lt;/code&gt; internamente, mas passa &lt;code&gt;--no-verify&lt;/code&gt; para pular os hooks de propósito&lt;sup&gt;5&lt;/sup&gt;. Oficialmente, não há como disparar os hooks do Git no momento que você quiser, nem um mecanismo de hooks próprio do Jujutsu.&lt;/p&gt;

&lt;p&gt;O motivo é que os hooks não combinam com o design central e o modelo de dados do Jujutsu. Dois fatores se destacam:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O Jujutsu faz commit das suas alterações automaticamente enquanto você trabalha, então não existe uma etapa explícita de commit antes da qual os hooks possam rodar.&lt;/li&gt;
&lt;li&gt;O Jujutsu reescreve código sem passar pelo seu diretório de trabalho, por exemplo, quando você faz squash ou quando a edição de um commit antigo provoca um rebase automático dos seus descendentes. Passar nos testes no commit original não garante que eles continuem passando lá na frente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Embora não cubram tudo o que os hooks do Git fazem, o Jujutsu oferece algumas ferramentas oficiais que se encaixam no modelo dele. Com o &lt;code&gt;jj fix&lt;/code&gt;, você registra formatadores na sua configuração e, ao rodá-lo, ele percorre o seu histórico mutável de trás para frente e formata os arquivos alterados em cada commit. O &lt;code&gt;jj run&lt;/code&gt; executa um comando externo sobre um único commit ou um intervalo de commits. Dá para usá-lo para rodar builds ou testes ao longo do histórico e, como ele incorpora aos commits correspondentes as alterações que o comando faz nos arquivos, também serve para linters com correção automática ou outras ferramentas que corrigem código.&lt;/p&gt;

&lt;p&gt;E se o seu time tiver uma configuração de hooks elaborada, montada em torno do Git, e você quiser ser a única pessoa usando o Jujutsu? Há várias abordagens dependendo da situação, e o assunto renderia fácil um ou dois artigos, então vou deixá-lo de fora aqui. Se tiver curiosidade, meu livro &lt;a href="https://juju-chu.com/pt" rel="noopener noreferrer"&gt;&lt;em&gt;Juju-chu! — Comece seu fluxo de trabalho Jujutsu × IA com &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;&lt;/a&gt; trata disso na seção “4-3. Táticas alternativas para os Git hooks”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q3. O Jujutsu funciona com o GitHub?
&lt;/h2&gt;

&lt;p&gt;Funciona. Como o Jujutsu usa o Git como backend, ele funciona sem problemas esteja o seu remoto no GitHub, no GitLab ou no Bitbucket. O porém é que o Jujutsu compartilha o trabalho por meio de um conceito diferente, chamado &lt;strong&gt;&lt;a href="https://www.jj-vcs.dev/latest/bookmarks/" rel="noopener noreferrer"&gt;bookmark&lt;/a&gt;&lt;/strong&gt;, em vez de um branch, e se acostumar com isso pode ser o verdadeiro obstáculo.&lt;/p&gt;

&lt;p&gt;O Jujutsu não tem nada que corresponda aos branches com nome do Git. Normalmente você trabalha em branches anônimos e, na hora de compartilhar, coloca um bookmark no commit que quiser. Quando você faz push de um commit com bookmark para um remoto, o Git o enxerga como um branch. O confuso é que o GitHub trata isso como um branch, embora seja um conceito diferente, com outro comportamento. Quem está começando costuma estranhar estes pontos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um bookmark não se move automaticamente para o seu commit mais recente; é você quem precisa movê-lo.&lt;/li&gt;
&lt;li&gt;Um mecanismo chamado tracking mantém sincronizada a posição de um bookmark (e também sua exclusão) entre o repositório local e o remoto.&lt;/li&gt;
&lt;li&gt;O tracking é praticamente indispensável, então os nomes dos bookmarks locais e remotos precisam ser iguais.&lt;/li&gt;
&lt;li&gt;Também dá para criar um bookmark na hora do push com a opção &lt;code&gt;-c/--change&lt;/code&gt; ou &lt;code&gt;--named&lt;/code&gt;, mesmo que ainda não exista nenhum.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por que o Jujutsu tem bookmarks em vez de branches, e o que você ganha ao compartilhar o trabalho com eles, eu explico em detalhes no meu post anterior, &lt;a href="https://juju-chu.com/pt/blog/rethinking-branch-with-jj" rel="noopener noreferrer"&gt;“O Jujutsu não tem o passo de ‘criar um branch’, e foi isso que finalmente me fez entender os branches do Git”&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Uma diferença de comportamento em relação ao Git depois do push: se você reescrever commits que já enviou e fizer push de novo, isso vira automaticamente um force push. O Jujutsu sempre faz push de um jeito parecido com &lt;code&gt;--force-with-lease&lt;/code&gt;, e no nível local você está protegido contra reescritas acidentais dependendo de o commit ser mutável ou imutável. Por padrão, porém, os commits já enviados fora do trunk continuam mutáveis, então você pode reescrevê-los, e fazer push do resultado acaba virando um force push.&lt;/p&gt;

&lt;p&gt;Isso pode bater de frente com a política de times que desenvolvem em feature branches compartilhados. Nesse caso, mude quais commits contam como imutáveis com uma configuração como esta&lt;sup&gt;6&lt;/sup&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[revset-aliases]&lt;/span&gt;
&lt;span class="err"&gt;'immutable_heads()'&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="err"&gt;'builtin_immutable_heads()&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;remote_bookmarks("feature/*",&lt;/span&gt; &lt;span class="err"&gt;"origin")'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Fora isso, abrir, aprovar e fazer merge de PRs, além de CI/CD com GitHub Actions e afins, funcionam quase exatamente do mesmo jeito com o Jujutsu. Praticamente a única diferença é que, quando você apaga o branch remoto no GitHub depois do merge de um PR, o próximo &lt;code&gt;jj git fetch&lt;/code&gt; apaga também o bookmark local vinculado.&lt;/p&gt;
&lt;h2&gt;
  
  
  Q4. No fim das contas, o que o Jujutsu oferece a mais que o Git?
&lt;/h2&gt;

&lt;p&gt;Comparado com o Git, é isto que você ganha ao mudar para o Jujutsu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Não existe índice (staging area).&lt;/strong&gt; Não há nenhuma etapa como &lt;code&gt;git add&lt;/code&gt; para rodar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Os commits acontecem automaticamente.&lt;/strong&gt; Sempre que você roda um comando &lt;code&gt;jj&lt;/code&gt; e há arquivos alterados desde o último commit, o Jujutsu tira um novo snapshot e atualiza o commit.&lt;/li&gt;
&lt;li&gt;Graças a essas duas coisas, &lt;strong&gt;a cópia de trabalho (o que o Git chama de working tree) é tratada como um commit em si&lt;/strong&gt;. Você pode andar pelo histórico como numa máquina do tempo sem se preocupar com alterações não commitadas nem em manter o índice consistente, como no Git.&lt;/li&gt;
&lt;li&gt;Quando você reescreve qualquer commit, &lt;strong&gt;os descendentes dele passam por rebase automaticamente&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Por mais conflitos que um rebase encontre, ele termina normalmente, sem jogar você num modo interativo, e deixa os conflitos no lugar. Como &lt;strong&gt;os estados com conflito ficam registrados no histórico&lt;/strong&gt; , refazer uma resolução ou entregá-la a uma ferramenta é fácil.&lt;/li&gt;
&lt;li&gt;Exceto pelas operações que afetam um repositório remoto, &lt;strong&gt;o &lt;code&gt;jj undo&lt;/code&gt; pode desfazer quase qualquer alteração&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Todo comando &lt;code&gt;jj&lt;/code&gt; que altera o repositório, e todo snapshot automático, &lt;strong&gt;vai para o registro de operações (operation log)&lt;/strong&gt;. Depois, você pode restaurar o repositório a um estado anterior ou reverter uma operação específica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Não é preciso criar um branch e dar nome a ele&lt;/strong&gt; só para experimentar. Comece com &lt;code&gt;jj new&lt;/code&gt; e, se não gostar do rumo, descarte com &lt;code&gt;jj abandon&lt;/code&gt; e tente de novo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Os comandos são diretos e fáceis de lembrar.&lt;/strong&gt; Fazer squash, por exemplo, é &lt;code&gt;jj squash --from A --into B&lt;/code&gt;. As opções que indicam sobre o que operar e para onde levar, como &lt;code&gt;-f/--from&lt;/code&gt;, &lt;code&gt;-t/--into&lt;/code&gt;, &lt;code&gt;-o/--onto&lt;/code&gt;, &lt;code&gt;-A/--insert-after&lt;/code&gt; e &lt;code&gt;-B/--insert-before&lt;/code&gt;, funcionam de forma consistente entre os comandos relacionados.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Q5. A curva de aprendizado é íngreme?
&lt;/h2&gt;

&lt;p&gt;Você não precisa de muitos comandos para começar. Só com estes, já deve dar conta de todo o fluxo de trabalho básico:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;O que você quer fazer&lt;/th&gt;
&lt;th&gt;Comando&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ver o status&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj st&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ver o log&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj log&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ver o diff&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj diff&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Atualizar a mensagem do commit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj desc -m '...'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Começar o próximo trabalho&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj new&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desfazer a última operação&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj undo&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Definir um bookmark&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj bookmark set &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buscar do remoto&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj git fetch&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fazer push para o remoto&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jj git push -b &amp;lt;bookmark&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Só com isso você já aproveita os commits automáticos e o undo e, se achar isso valioso, já superou o primeiro obstáculo. O problema vem depois. Quanto mais experiência a pessoa tem com o Git, maior a chance de ela usar o Jujutsu com o modelo mental do Git intacto, consultando uma tabela de equivalência de comandos&lt;sup&gt;7&lt;/sup&gt;. Desse jeito, você só está traduzindo operações do Git uma a uma, perde boa parte do que o Jujutsu tem de útil e ainda ganha o trabalho de traduzir comandos.&lt;/p&gt;

&lt;p&gt;O Jujutsu foi projetado para resolver o que torna o Git difícil de usar. Ele continua compatível com o Git, mas repensa o modelo mental do zero. Para tirar o máximo proveito dele, você precisa seguir o conselho do Yoda: “Você deve desaprender o que aprendeu.”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzwopz9jlf8gj8130bj1w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzwopz9jlf8gj8130bj1w.jpg" alt="Uma citação do Yoda" width="799" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É por isso que a etapa seguinte é a difícil. A dificuldade não vem de o Jujutsu ser complicado. Vem de ter que repensar hábitos de controle de versão que você construiu ao longo de anos com o Git, e largar conceitos que você sempre deu como certos. De vez em quando, vejo gente que nunca percebe isso, continua tocando o fluxo de trabalho do Git em cima do Jujutsu, não sente nenhum benefício e volta para o Git.&lt;/p&gt;

&lt;p&gt;Pela minha experiência, focar nestas três coisas é o caminho mais rápido para desenvolver um modelo mental do Jujutsu:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Entenda o que é um change, a unidade usual de histórico do Jujutsu&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Pense num change como um contêiner com um nome e um ID que nunca muda, e nos commits (também chamados de revisões) como versões sucessivas de um documento guardadas dentro dele. Não é tecnicamente preciso, mas é uma imagem fácil para quem está começando&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abandone a ideia de que você só faz commit quando o trabalho está pronto&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;No Jujutsu, toda vez que você muda o código ou a descrição (grosso modo, a mensagem do commit), é como se um &lt;code&gt;git commit --amend --no-edit&lt;/code&gt; rodasse na hora, automaticamente. Os changes estão inacabados por padrão e, quando você chega a um bom ponto de parada, simplesmente passa para outro change&lt;/li&gt;
&lt;li&gt;Não use o &lt;code&gt;jj commit&lt;/code&gt;, que roda &lt;code&gt;jj desc&lt;/code&gt; e depois &lt;code&gt;jj new&lt;/code&gt; de uma vez só e existe para dar suporte a fluxos de trabalho no estilo do Git&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acostume-se a não ter um “branch atual” enquanto trabalha&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Fique num único fluxo: trabalhe num branch anônimo e coloque um bookmark só quando quiser compartilhar&lt;/li&gt;
&lt;li&gt;Crie o hábito de ver onde você está no grafo que o &lt;code&gt;jj log&lt;/code&gt; desenha, em vez de se guiar pelo nome do branch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Depois que você larga o fluxo de trabalho do Git e continua trabalhando do jeito do Jujutsu, a lógica por trás do design dele começa a fazer sentido. A essa altura, usar o Jujutsu vai se tornar algo completamente natural, e você não vai mais querer trabalhar sem ele.&lt;/p&gt;
&lt;h2&gt;
  
  
  Q6. O Jujutsu ainda não chegou à 1.0. É seguro usar no trabalho?
&lt;/h2&gt;

&lt;p&gt;A resposta curta: se os problemas da Q2 não afetam você, na prática quase nada impede você de usar. A CLI e a configuração vão continuar mudando, porém, então a verdadeira questão na hora de decidir pela adoção é se você consegue conviver com isso.&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://github.com/jj-vcs/jj/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt; no repositório oficial do GitHub diz:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Jujutsu is an &lt;strong&gt;experimental version control system&lt;/strong&gt;. While Git compatibility is stable, and most developers use it daily for all their needs, there may still be work-in-progress features, suboptimal UX, and workflow gaps that make it unusable for your particular use.&lt;br&gt;&lt;br&gt;
(O Jujutsu é um &lt;strong&gt;sistema de controle de versão experimental&lt;/strong&gt;. Embora a compatibilidade com o Git seja estável e a maioria dos desenvolvedores o use diariamente para tudo de que precisa, ainda pode haver recursos em desenvolvimento, uma UX com espaço para melhorar e lacunas nos fluxos de trabalho que o tornem inviável para o seu caso específico.)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ele também diz que os fluxos de trabalho podem mudar e que pode haver mudanças incompatíveis no formato dos dados em disco antes da 1.0, acrescentando que o projeto vai tentar oferecer atualizações transparentes quando o formato mudar.&lt;/p&gt;

&lt;p&gt;Isso pode soar um pouco preocupante, mas não tem havido grandes mudanças incompatíveis ultimamente. A maioria foi remoção de configurações e opções de comando obsoletas, ou mudança nos requisitos de sistema. A &lt;a href="https://www.jj-vcs.dev/latest/changelog/#0380-2026-02-04" rel="noopener noreferrer"&gt;v0.38.0&lt;/a&gt;, lançada em fevereiro de 2026, mudou o lugar onde ficam os arquivos de configuração de cada repositório, mas foi por motivos de segurança, um passo necessário para proteger os usuários de ataques maliciosos.&lt;/p&gt;

&lt;p&gt;Martin von Zweigbergk, ex-engenheiro do Google, começou o Jujutsu como projeto paralelo no fim de 2019, e a primeira versão no GitHub, a v0.3.0, saiu em março de 2022. Isso foi há quatro anos e meio. Desde a v0.9.0, em setembro de 2023, sai uma versão nova quase todo mês. Pode não ser 1.0 ainda, mas tem um histórico sólido.&lt;/p&gt;

&lt;p&gt;Em outubro de 2026, o repositório oficial no GitHub tem cerca de 32 mil estrelas. O projeto tem nove maintainers, e cada release dá crédito a cerca de 30 contribuidores. Engenheiros de várias empresas, entre elas o Google, contribuem de forma contínua. A documentação oficial lista as empresas que financiam o desenvolvimento do Jujutsu e os funcionários que participam dele&lt;sup&gt;8&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;E a adoção no mundo real? Comentei que o criador veio do Google. Segundo ele, cerca de 900 pessoas dentro do Google já usavam o Jujutsu em setembro de 2025&lt;sup&gt;9&lt;/sup&gt;. Em julho de 2026, ele se tornou CTO da &lt;a href="https://www.ersc.io/" rel="noopener noreferrer"&gt;ERSC&lt;/a&gt;, uma empresa que oferece uma plataforma de hospedagem cujo armazenamento foi projetado em torno do modelo do Jujutsu e que planeja suportar no futuro um protocolo nativo para clientes do Jujutsu. O fato de haver empresas que baseiam seus negócios no Jujutsu é um bom sinal da confiabilidade dele.&lt;/p&gt;

&lt;p&gt;Além disso, os &lt;a href="https://docs.github.com/pt/pull-requests/how-tos/stacked-pull-requests" rel="noopener noreferrer"&gt;stacked pull requests do GitHub&lt;/a&gt;, que dividem um PR numa cadeia de PRs pequenos e dependentes, ficaram disponíveis para todos há pouco tempo, e a documentação deles inclui uma página que mostra um fluxo de trabalho com o Jujutsu&lt;sup&gt;10&lt;/sup&gt;. É justo ler isso como sinal de que o GitHub vê o Jujutsu como um cliente compatível, com usuários demais para ser ignorado, e ao qual vale a pena dar suporte.&lt;/p&gt;

&lt;p&gt;Não acho que a falta de uma 1.0 se deva a dúvidas sobre a qualidade ou a confiabilidade dele. Na verdade, suspeito que os desenvolvedores queiram manter a liberdade de mudar o design enquanto ele continua evoluindo. Muitos desenvolvedores já o usam todo dia, e há empresas que continuam apoiando o desenvolvimento. No mínimo, não ter chegado à 1.0 não é, por si só, motivo para evitar usá-lo no trabalho.&lt;/p&gt;
&lt;h2&gt;
  
  
  Q7. Por que o nome “Jujutsu”?
&lt;/h2&gt;

&lt;p&gt;Muita gente acha que o nome vem do anime &lt;em&gt;Jujutsu Kaisen&lt;/em&gt;. No Japão, ele é até zoado nas redes sociais por soar meio exagerado, com cara de nome de anime. Mas o Jujutsu não tem nada a ver com &lt;em&gt;Jujutsu Kaisen&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Então, de onde vem o nome? O &lt;a href="https://github.com/jj-vcs/jj/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt; oficial no GitHub sugere que o nome do comando, &lt;code&gt;jj&lt;/code&gt;, veio primeiro:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The command-line tool is called jj for now because it’s easy to type and easy to replace (rare in English). The project is called “Jujutsu” because it matches “jj”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com o indicador direito apoiado na tecla J, na fileira central do teclado, bastam dois toques, então é mesmo fácil de digitar. O README dá a entender que Jujutsu foi escolhido desde o início como um nome que combinava com jj, mas, na verdade, o projeto teve outro nome no começo. No crates.io, o registro oficial de pacotes do Rust, existe um VCS chamado &lt;a href="https://crates.io/crates/jujube" rel="noopener noreferrer"&gt;Jujube&lt;/a&gt;. O autor é Martin von Zweigbergk, e ele tem duas versões, 0.1.0 e 0.1.1, lançadas em janeiro de 2021. Isso mesmo: é o antecessor do Jujutsu. Veja o que a página dele diz sobre o nome:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The command-line tool is called jj for now because it’s easy to type and easy to replace (rare in English). The project is called “Jujube” (a fruit) because that’s the first word I could think of that matched “jj”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Em inglês, &lt;em&gt;jujube&lt;/em&gt; é o nome de uma fruta: a jujuba (também conhecida como tâmara-chinesa). Mais uma vez, o nome foi escolhido simplesmente porque combinava com jj. Apenas quatro meses depois, o nome mudou. A &lt;a href="https://github.com/jj-vcs/jj/commit/d42e6c77b26bd6f47a59ad18158a79e6bddb30d1" rel="noopener noreferrer"&gt;mensagem de commit&lt;/a&gt; dessa troca de nome continua lá:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;project: rename project from Jujube to Jujutsu “Jujutsu” is probably much more familiar and relatable to most people. Also, I’m still not sure how “jujube” is supposed to be pronounced :P&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pelo jeito, o autor não tinha nenhum apego especial a Jujube e trocou para Jujutsu por ser um nome mais conhecido e mais próximo da maioria das pessoas. Quando mais tarde alguém perguntou de onde vinha o nome&lt;sup&gt;11&lt;/sup&gt;, ele apontou o &lt;a href="https://en.wikipedia.org/wiki/Jujutsu" rel="noopener noreferrer"&gt;artigo da Wikipédia sobre o jujutsu&lt;/a&gt;, então o nome se refere à arte marcial japonesa. Em inglês, a arte tradicional japonesa costuma ser grafada “jujutsu”, enquanto “jiu-jitsu” é a grafia que a maioria conhece por causa do jiu-jitsu brasileiro. A Wikipédia em inglês tem um &lt;a href="https://en.wikipedia.org/wiki/Brazilian_jiu-jitsu" rel="noopener noreferrer"&gt;artigo separado sobre o jiu-jitsu brasileiro&lt;/a&gt;, mas quem busca “jiu-jitsu” ou “jiujitsu” é redirecionado para o artigo sobre o jujutsu. Sem esse redirecionamento, talvez o projeto hoje se chamasse Jiu-jitsu.&lt;/p&gt;

&lt;p&gt;Então está decidido que o nome se refere à arte marcial? Não exatamente. O autor diz que nunca deu nenhum significado especial ao nome. Quando alguém propôs renomear o Jujutsu para Jojo&lt;sup&gt;12&lt;/sup&gt;, ele também não pareceu muito apegado a Jujutsu e sugeriu que fizessem uma votação. Também houve uma proposta de adotar oficialmente outro significado e outra pronúncia&lt;sup&gt;13&lt;/sup&gt;. Em japonês, “jujutsu” pode corresponder a duas palavras diferentes: 柔術 (jūjutsu, a arte marcial) e 呪術 (jujutsu, feitiçaria, a palavra de &lt;em&gt;Jujutsu Kaisen&lt;/em&gt;; maldição é outra palavra). A proposta era tornar 呪術 o significado oficial, e o próprio autor gostou da ideia no começo. No fim, porém, a definição de um significado ou de uma pronúncia oficial ficou de lado.&lt;/p&gt;

&lt;p&gt;O logo oficial, em uso desde 2025, mostra a mesma postura de não dar ao nome nenhum significado em particular.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F62k02ofcc8dazebm77hn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F62k02ofcc8dazebm77hn.png" alt="O logo do Jujutsu" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dois pássaros azuis estão de costas um para o outro. São gaios (aves da família dos corvídeos chamadas &lt;em&gt;jays&lt;/em&gt; em inglês). A palavra &lt;em&gt;jay&lt;/em&gt; tem a mesma pronúncia da letra J em inglês: dois gaios formam “jay jay”, ou seja, jj. Não só o nome: o logo também é um trocadilho com jj. Se a arte marcial fosse o significado oficial, o logo com certeza mostraria algo ligado a ela, mas não é o caso.&lt;/p&gt;

&lt;p&gt;No fim das contas, tudo começou com jj, um nome de comando curto e fácil de digitar. O projeto foi batizado de Jujutsu por causa da arte marcial e, mesmo assim, oficialmente não significa nem 柔術 nem 呪術. Jujutsu é só Jujutsu, e essa provavelmente é a verdadeira resposta para a origem do nome.&lt;/p&gt;
&lt;h2&gt;
  
  
  Ainda tem dúvidas?
&lt;/h2&gt;

&lt;p&gt;São sete dúvidas comuns que quem usa Git costuma ter quando pensa em dar uma chance ao Jujutsu. Algumas destas respostas foram reelaboradas a partir das perguntas frequentes do capítulo 5, “Guia de solução de problemas do Jujutsu”, do meu livro &lt;strong&gt;&lt;em&gt;Juju-chu! — Comece seu fluxo de trabalho Jujutsu × IA com &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://juju-chu.com/pt" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Fog%2Fpt%2Fdefault.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://juju-chu.com/pt" rel="noopener noreferrer" class="c-link"&gt;
            Juju-chu! — Comece seu fluxo de trabalho Jujutsu × IA com jj new
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Um guia prático para adotar Jujutsu (jj) com Claude Code e Codex: snapshots automáticos, operações que podem ser desfeitas e reescrita segura do histórico.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Ficons%2Ffavicon.ico" width="48" height="48"&gt;
          juju-chu.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;O livro responde a muitas outras perguntas que costumam surgir para quem está chegando ao Jujutsu, além de mostrar como lidar com os problemas que você provavelmente vai encontrar quando começar. Se você está começando com o Jujutsu, ele deve economizar bastante tempo, então dê uma olhada.&lt;/p&gt;

&lt;h2 id="footnote-label"&gt;Footnotes&lt;/h2&gt;

&lt;ol&gt;
&lt;li id="user-content-fn-jj-plug"&gt;
&lt;p&gt;Além do Git, o Jujutsu também pode usar como backend o &lt;a href="https://en.wikipedia.org/wiki/Piper_(source_control_system)" rel="noopener noreferrer"&gt;Piper&lt;/a&gt;, o sistema de controle de versão usado dentro do Google, mas essa parte não é pública. Um backend nativo do Jujutsu parece estar na lista de desejos, mas nenhum plano concreto foi anunciado. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-submod-sup"&gt;
&lt;p&gt;&lt;a href="https://docs.jj-vcs.dev/latest/roadmap/#submodule-support" rel="noopener noreferrer"&gt;“Submodule support - Development roadmap - Jujutsu docs”&lt;/a&gt;
&lt;a href="https://github.com/jj-vcs/jj/issues/494" rel="noopener noreferrer"&gt;“Add support for Git submodules · Issue #494 · jj-vcs/jj”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-gh-lg-file"&gt;
&lt;p&gt;&lt;a href="https://docs.github.com/pt/repositories/working-with-files/managing-large-files/about-large-files-on-github" rel="noopener noreferrer"&gt;“Sobre arquivos grandes no GitHub - Documentos do GitHub”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-sup-lfs"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/issues/80" rel="noopener noreferrer"&gt;“Add support for Git LFS · Issue #80 · jj-vcs/jj”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-no-verify"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/blob/main/lib/src/git_subprocess.rs" rel="noopener noreferrer"&gt;“jj/lib/src/git_subprocess.rs at main · jj-vcs/jj”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-other-immutable"&gt;
&lt;p&gt;A documentação oficial também mostra outras configurações, como uma que impede reescrever commits criados por outras pessoas.
&lt;a href="https://www.jj-vcs.dev/latest/config/#set-of-immutable-commits" rel="noopener noreferrer"&gt;“Set of immutable commits - Configuration - Jujutsu docs”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-git-cmd-table"&gt;
&lt;p&gt;A documentação oficial também tem uma. &lt;a href="https://docs.jj-vcs.dev/latest/git-command-table/" rel="noopener noreferrer"&gt;“Git command table - Jujutsu docs”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-contrib"&gt;
&lt;p&gt;&lt;a href="https://docs.jj-vcs.dev/latest/paid_contributors/" rel="noopener noreferrer"&gt;“Paying employers and their contributing employees - Jujutsu docs”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-jjcon-keynote"&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=VwmFyowbSR0" rel="noopener noreferrer"&gt;“JJ Con • Keynote - YouTube”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-other-tool"&gt;
&lt;p&gt;&lt;a href="https://docs.github.com/pt/pull-requests/reference/use-other-tools-with-stacked-pull-requests" rel="noopener noreferrer"&gt;“Usar outras ferramentas com pull requests empilhados - Documentos do GitHub”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-disc3021"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/discussions/3021" rel="noopener noreferrer"&gt;“Question: What’s ‘jujutsu’ from? · jj-vcs/jj · Discussion #3021”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-disc2520"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/discussions/2520" rel="noopener noreferrer"&gt;“Proposal: Rename Jujutsu to Jojo · jj-vcs/jj · Discussion #2520”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-pr3042"&gt;
&lt;p&gt;&lt;a href="https://github.com/jj-vcs/jj/pull/3042" rel="noopener noreferrer"&gt;“meta: cement “Jujutsu” (呪術) as the project name by thoughtpolice · Pull Request #3042 · jj-vcs/jj”&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>jujutsu</category>
      <category>git</category>
      <category>braziliandevs</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>O Jujutsu não tem o passo de “criar um branch”, e foi isso que finalmente me fez entender os branches do Git</title>
      <dc:creator>Yuka Ooka</dc:creator>
      <pubDate>Tue, 13 Oct 2026 12:44:00 +0000</pubDate>
      <link>https://dev.to/jujuchu-pt/o-jujutsu-nao-tem-o-passo-de-criar-um-branch-e-foi-isso-que-finalmente-me-fez-entender-os-d7k</link>
      <guid>https://dev.to/jujuchu-pt/o-jujutsu-nao-tem-o-passo-de-criar-um-branch-e-foi-isso-que-finalmente-me-fez-entender-os-d7k</guid>
      <description>&lt;h2&gt;
  
  
  O Jujutsu não tem branches?
&lt;/h2&gt;

&lt;p&gt;Quando comecei a usar o &lt;strong&gt;&lt;a href="https://www.jj-vcs.dev/" rel="noopener noreferrer"&gt;Jujutsu&lt;/a&gt;&lt;/strong&gt; depois de anos seguindo os fluxos de trabalho do Git, a primeira coisa que me deixou perdida foi que &lt;strong&gt;não havia nenhum branch ao qual o meu trabalho atual pertencesse&lt;/strong&gt;. Todo mundo que começa no Git aprende o ritual: antes de fazer qualquer trabalho de verdade, crie um branch. Mesmo num projeto pessoal em que você pula essa etapa, pelo menos você está no branch main.&lt;/p&gt;

&lt;p&gt;Só que a &lt;a href="https://docs.jj-vcs.dev/latest/tutorial/" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt; e um &lt;a href="https://steveklabnik.github.io/jujutsu-tutorial/" rel="noopener noreferrer"&gt;tutorial bastante conhecido&lt;/a&gt; já começam direto no trabalho. Ninguém cria um branch nem troca de branch. Na verdade, por mais que eu procurasse, não encontrava no Jujutsu nada chamado “branch” que desse para manipular. No lugar disso existe uma coisa chamada &lt;strong&gt;bookmark&lt;/strong&gt; , que é mapeado para um branch quando você trabalha com o Git. E, mesmo assim, um bookmark não é a mesma coisa que um branch. Eu não estava entendendo nada.&lt;/p&gt;

&lt;p&gt;Mas, depois de fazer push do meu trabalho no Jujutsu e abrir PRs com ele algumas vezes seguindo os guias, me ocorreu uma coisa: talvez o Git e o Jujutsu simplesmente queiram dizer coisas diferentes com a palavra “branch”. Com isso em mente, reli &lt;a href="https://git-scm.com/book/pt-br/v2/Ramifica%c3%a7%c3%a3o-Branching-no-Git-Branches-em-Poucas-Palavras" rel="noopener noreferrer"&gt;o capítulo sobre branches&lt;/a&gt; do &lt;em&gt;Pro Git&lt;/em&gt;&lt;sup&gt;1&lt;/sup&gt; e a &lt;a href="https://docs.jj-vcs.dev/latest/bookmarks/" rel="noopener noreferrer"&gt;página sobre bookmarks&lt;/a&gt; da documentação do Jujutsu, e finalmente a ficha caiu. Um branch do Git não é um “galho” no sentido literal, e faz todo o sentido o Jujutsu chamar o equivalente dele de “bookmark”.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que “um branch do Git é um ponteiro” quer dizer de verdade
&lt;/h2&gt;

&lt;p&gt;Afinal, o que é exatamente um branch do Git? A seção 3.1 do livro &lt;em&gt;Pro Git&lt;/em&gt; descreve o branching assim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Branching (ramificação) significa que você diverge da linha principal de desenvolvimento e continua a fazer o trabalho sem mexer nessa linha principal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lendo um pouco mais adiante, você encontra isto:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Um branch no Git é simplesmente um ponteiro móvel e leve para um desses commits.&lt;br&gt;&lt;br&gt;
[…]&lt;br&gt;&lt;br&gt;
O que acontece quando você cria um novo branch? Bem, fazer isso cria um novo ponteiro para você mover por aí.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;“Um branch é um ponteiro.”&lt;/strong&gt; Se você usa Git há algum tempo, com certeza já ouviu essa frase. Confesso, meio sem graça, que ela nunca me disse muita coisa, e por anos usei branches no feeling. Hoje entendo o porquê. A explicação se apoia em várias premissas que ninguém menciona, e, para quem teve o Git como primeiro VCS, ela não diz muito. A documentação oficial do Git e os livros clássicos foram escritos por veteranos que conheciam bem outros sistemas de controle de versões, e é fácil eles não perceberem que quem começou pelo Git não compartilha essas premissas.&lt;/p&gt;

&lt;p&gt;Então, o que é preciso saber para que “um branch é um ponteiro” faça sentido? A primeira coisa é que, no Git, &lt;strong&gt;um branch não é a bifurcação do histórico em si&lt;/strong&gt;. Para separar as duas coisas, o &lt;em&gt;Pro Git&lt;/em&gt; usa expressões como “histórico divergente” (divergent history) para se referir à bifurcação propriamente dita&lt;sup&gt;2&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;A maioria dos VCSs distribuídos representa o histórico como um DAG&lt;sup&gt;3&lt;/sup&gt;, e não como uma árvore, então as bifurcações e os merges são expressos inteiramente dentro do grafo. O que muda de um VCS para outro é o mecanismo que ele oferece ao usuário para visualizar e manipular essas bifurcações, e a maioria chama esse mecanismo de “branch”. No &lt;a href="https://www.mercurial-scm.org/" rel="noopener noreferrer"&gt;Mercurial&lt;/a&gt;, que surgiu mais ou menos na mesma época que o Git, um branch é um metadado gravado de forma permanente em cada commit de uma linha do histórico. Já o Git usa um ponteiro para cada linha do histórico, e cada um aponta para um único commit.&lt;/p&gt;

&lt;p&gt;Ainda não ficou claro? Então vamos para a segunda premissa. O que diferencia o Git de outros VCSs é que, &lt;strong&gt;onde quer que você esteja, ele sempre te empurra automaticamente para a ponta do histórico&lt;/strong&gt;. Nos VCSs anteriores, criar branches e alternar entre eles eram operações pesadas, que atrasavam bastante projetos grandes como o kernel do Linux. Torná-las extremamente rápidas foi um dos objetivos centrais quando o Git foi projetado. A solução foi transformar o branch num ponteiro móvel para um único commit, guardado num arquivo de texto de apenas algumas dezenas de bytes.&lt;/p&gt;

&lt;p&gt;Para isso funcionar, o Git espera que você edite o código na linha de trabalho para a qual algum branch aponta, e o ponteiro do branch avança automaticamente a cada novo commit. Trocar de branch significa fazer o HEAD, o ponteiro que indica onde você está, coincidir com esse branch. Por isso, no Git, para onde quer que você vá, acaba sempre empurrado para a ponta do histórico.&lt;/p&gt;

&lt;p&gt;Como o Git era o único VCS distribuído que eu conhecia, achava que todos funcionavam assim. Descobrir que esse comportamento é específico do Git, e entender o mecanismo por trás dele, foi o que finalmente me fez entender o que significa dizer que um branch do Git é um ponteiro.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que acontece com uma bifurcação do histórico sem branch?
&lt;/h2&gt;

&lt;p&gt;Então, o Git pode ter uma bifurcação do histórico que não seja um branch? Criar uma é bem fácil: faça checkout de um commit antigo pelo hash.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git checkout 9effb1cc737824d9c14e1a8ecbb725e44ccae104
Note: switching to &lt;span class="s1"&gt;'9effb1cc737824d9c14e1a8ecbb725e44ccae104'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

You are &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s1"&gt;'detached HEAD'&lt;/span&gt; state. You can look around, make experimental
changes and commit them, and you can discard any commits you make &lt;span class="k"&gt;in &lt;/span&gt;this
state without impacting any branches by switching back to a branch.
⋮
HEAD is now at 9effb1c create b.txt

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'444'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; d.txt
&lt;span class="nv"&gt;$ &lt;/span&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'create d.txt'&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;detached HEAD 46b43c3] create d.txt
 1 file changed, 1 insertion&lt;span class="o"&gt;(&lt;/span&gt;+&lt;span class="o"&gt;)&lt;/span&gt;
 create mode 100644 d.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;O Git faz questão de avisar que agora você está em estado de &lt;strong&gt;detached HEAD&lt;/strong&gt; (HEAD desanexado). Normalmente o HEAD aponta para algum branch. Quando ele aponta diretamente para o hash de um commit específico, isso se chama detached HEAD. Empilhar commits nesse estado é considerado arriscado e é melhor evitar, porque esse histórico acaba assim:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Você não consegue encontrá-lo depois&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ele é tratado como lixo e acaba sendo apagado&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Você não consegue compartilhá-lo com ninguém&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No Git, os commits só passam a ser rastreáveis por pessoas quando pertencem a um branch ou a uma tag. Os commits feitos em detached HEAD perdem a referência assim que você troca de branch, e não aparecem nem no &lt;code&gt;git log --all&lt;/code&gt;. O reflog é a única forma de recuperá-los. Além disso, o sistema os trata como histórico desnecessário e eles ficam sujeitos à coleta de lixo, então, quando o prazo expira, somem de vez. Commits que você mesmo pode perder de vista com facilidade, e que podem sumir a qualquer momento, naturalmente são difíceis de compartilhar com outras pessoas.&lt;/p&gt;
&lt;h2&gt;
  
  
  Por que o Jujutsu tem bookmarks em vez de branches
&lt;/h2&gt;

&lt;p&gt;Como comentei no começo, o Jujutsu não tem nada chamado “branch” que dê para manipular. Mesmo assim, a palavra “branch” aparece o tempo todo na documentação dele, no sentido literal de bifurcação do histórico. O Jujutsu não tem o conceito de “branch atual” nem nenhum mecanismo próprio para identificar bifurcações do histórico, então “branch” é usado no seu sentido original e literal.&lt;/p&gt;

&lt;p&gt;Então, por que o Jujutsu não tem branches como os do Git e do Mercurial? No Git, fazer amend ou rebase de um commit gera um hash completamente novo. Hashes que mudam o tempo todo são difíceis de acompanhar, tanto para o sistema quanto para as pessoas, então um commit precisa pertencer a um branch: um rótulo nomeado e estável que diz em qual linha de trabalho ele está. No Jujutsu, por outro lado, a unidade básica do histórico, o change, tem um &lt;strong&gt;change ID imutável&lt;/strong&gt; , separado do commit ID, que muda sempre que o change é revisado. Não importa quantas vezes você reescreva o conteúdo ou faça rebase, dá para acompanhar um change pelo mesmo ID, então quase não há necessidade de rotular cada linha de trabalho.&lt;/p&gt;

&lt;p&gt;Além disso, as bifurcações do histórico sempre aparecem no log como um grafo em arte ASCII. Entre o grafo que você vê no log e as descrições dos changes que formam os nós dele, dá para ver de cara a qual linha de trabalho cada change pertence. E qualquer change que tenha descrição ou que modifique arquivos fica no histórico até você descartá-lo explicitamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v8q1eooxrzyvsdgic1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v8q1eooxrzyvsdgic1n.png" alt="Log do Jujutsu" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como os branches não têm nome, o normal no Jujutsu é trabalhar no equivalente ao detached HEAD do Git. O Jujutsu chama isso de &lt;strong&gt;branch anônimo&lt;/strong&gt; (anonymous branch). O detached HEAD é considerado perigoso, mas os branches anônimos do Jujutsu não têm os dois primeiros problemas que ele tem no Git: “1. Você não consegue encontrá-lo depois” e “2. Ele é tratado como lixo e acaba sendo apagado”. E o “3. Você não consegue compartilhá-lo com ninguém”? É para isso que o Jujutsu oferece os &lt;strong&gt;bookmarks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Um bookmark é um ponteiro nomeado associado a um change. Tanto os bookmarks quanto os branches do Git são ponteiros nomeados, mas, diferente de um branch do Git, um bookmark é apenas uma marcação para compartilhar com outras pessoas ou para você não esquecer de algo, sem relação direta com as bifurcações do histórico. É por isso que você pode colocar vários bookmarks na mesma linha de trabalho, e também por isso que, quando você cria novos changes sobre esse change, um bookmark não avança sozinho como um branch do Git.&lt;/p&gt;

&lt;p&gt;O Jujutsu não vê necessidade de dar nome às bifurcações do histórico, nem de apontar uma linha de trabalho divergente inteira só para compartilhar histórico com outras pessoas. É por isso que o Jujutsu tem bookmarks em vez de branches.&lt;/p&gt;
&lt;h2&gt;
  
  
  Branches anônimos + bookmarks: até onde a evolução dos VCSs chegou
&lt;/h2&gt;

&lt;p&gt;No Git, tanto criar bifurcações do histórico quanto fazer merge delas acontece, basicamente, no nível do branch. E como o Jujutsu, que não tem branches, lida com isso?&lt;/p&gt;

&lt;p&gt;No Jujutsu, o comando que cria um change novo, a unidade básica do histórico, é o &lt;code&gt;jj new&lt;/code&gt;. Como criar uma bifurcação do histórico? Passe para o &lt;code&gt;jj new&lt;/code&gt; o ID de um change que já tem um filho. Como fazer merge de um histórico que divergiu? Passe para o &lt;code&gt;jj new&lt;/code&gt; os IDs dos changes que você quer juntar. No Jujutsu, &lt;strong&gt;estender o histórico, bifurcá-lo e fazer merge funcionam no nível do change&lt;/strong&gt; , e, surpreendentemente, tudo é a mesma operação básica: criar um change novo.&lt;/p&gt;

&lt;p&gt;Você segue trabalhando assim até um ponto em que faz sentido parar. Hora de abrir um PR. É só agora que você precisa de fato dar um nome a essa linha de trabalho&lt;sup&gt;4&lt;/sup&gt;. Coloque um bookmark num change e faça push, e toda a sequência de changes, desde o ponto em que ela saiu da main até esse change, é registrada como um branch no repositório Git remoto, com cada change convertido num commit do Git.&lt;/p&gt;

&lt;p&gt;O que você ganha quando &lt;strong&gt;a unidade de compartilhamento não está presa a branches&lt;/strong&gt;? Primeiro, flexibilidade: você pode começar a trabalhar sem decidir um nome nem o que vai compartilhar, e resolver essas questões só quando chegar a hora de compartilhar. Segundo, fica fácil montar uma série de PRs dependentes, algo que ficou bem mais valioso nos últimos tempos. Os stacked pull requests do GitHub, que permitem dividir um PR em unidades pequenas com relações de pai e filho, finalmente ficaram disponíveis para todos em 6 de outubro de 2026&lt;sup&gt;5&lt;/sup&gt;, e os bookmarks do Jujutsu deixam muito fácil trabalhar com eles. Para montar stacked PRs com o Git, você cria o primeiro branch com &lt;code&gt;gh stack init&lt;/code&gt;, cria um branch filho com &lt;code&gt;gh stack add&lt;/code&gt; toda vez que termina uma parte do trabalho e, no fim, faz push e abre os PRs com &lt;code&gt;gh stack submit&lt;/code&gt;. É um processo bem trabalhoso e muito dependente de ferramentas específicas. Com o Jujutsu, você coloca bookmarks em ordem na sua linha de trabalho, faz push e roda algo como &lt;code&gt;gh stack link &amp;lt;bookmark1&amp;gt; &amp;lt;bookmark2&amp;gt; &amp;lt;bookmark3&amp;gt;&lt;/code&gt;. Só isso. É tão simples que chega a ser anticlimático.&lt;/p&gt;

&lt;p&gt;Sem branches, o Jujutsu repensou as operações que o Git tinha construído em torno deles, para que você possa trabalhar em unidades menores e mais flexíveis. Depois de conviver um tempo com um Jujutsu sem branches, finalmente entendi o que são os branches do Git, depois de anos usando-os com uma ideia nebulosa. E aí os conceitos do Jujutsu, tão diferentes dos do Git, começaram a me parecer surpreendentemente racionais. Essa sensação fica ainda mais forte quando você olha a história dos VCSs com certo distanciamento.&lt;/p&gt;

&lt;p&gt;Comentei antes que o Mercurial tem um tipo de branch diferente do Git. Mas, como os branches do Mercurial são dados permanentes e globais gravados em cada commit, eles não combinam bem com o desenvolvimento de funcionalidades ou correções de bugs que terminam em poucos dias. Por isso os bookmarks foram adicionados depois, para o trabalho mais leve: marcadores do tipo ponteiro que serviam para repassar o trabalho no push ou para marcar onde você estava trabalhando. Inspirados nos branches do Git, mas independentes dos branches do Mercurial e pensados para o compartilhamento. É daí que vêm os bookmarks do Jujutsu.&lt;/p&gt;

&lt;p&gt;O Jujutsu vai um passo além: considera os branches desnecessários para as bifurcações do histórico e simplesmente não os tem. Curiosamente, o &lt;a href="https://sapling-scm.com/" rel="noopener noreferrer"&gt;Sapling&lt;/a&gt;, que a Meta criou a partir de um fork do Mercurial e desenvolveu por conta própria, também não tem branches, mas tem bookmarks. Dá para dizer que “branches anônimos + bookmarks” é um dos pontos a que a evolução do controle de versões chegou, do Git ao Jujutsu, passando pelo Mercurial.&lt;/p&gt;

&lt;p&gt;Uma última observação: este post é baseado nas seções “2-4-2. A diferença entre branch e bookmark” e “2-4-3. Trabalhando em branches anônimos” do meu livro, &lt;em&gt;Juju-chu! — Comece seu fluxo de trabalho Jujutsu × IA com &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://juju-chu.com/pt" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Fog%2Fpt%2Fdefault.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://juju-chu.com/pt" rel="noopener noreferrer" class="c-link"&gt;
            Juju-chu! — Comece seu fluxo de trabalho Jujutsu × IA com jj new
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Um guia prático para adotar Jujutsu (jj) com Claude Code e Codex: snapshots automáticos, operações que podem ser desfeitas e reescrita segura do histórico.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Ficons%2Ffavicon.ico" width="48" height="48"&gt;
          juju-chu.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Os primeiros capítulos do livro se concentram na diferença entre os modelos mentais do Git e do Jujutsu. Além de branches versus bookmarks, eles explicam com cuidado os outros pontos em que quem está começando costuma tropeçar. Se este post te deu vontade de experimentar o Jujutsu, ou de dar mais uma chance a ele se da primeira vez não engrenou, dê uma olhada.&lt;/p&gt;

&lt;h2 id="footnote-label"&gt;Footnotes&lt;/h2&gt;

&lt;ol&gt;
&lt;li id="user-content-fn-pro-git"&gt;
&lt;p&gt;Livro de código aberto sobre Git, escrito por Scott Chacon e Ben Straub, que também é usado como documentação oficial do Git. Ele pode ser lido gratuitamente online. &lt;a href="https://git-scm.com/book/pt-br/v2" rel="noopener noreferrer"&gt;https://git-scm.com/book/pt-br/v2&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-divergent"&gt;
&lt;p&gt;&lt;a href="https://git-scm.com/book/pt-br/v2/Ramifica%c3%a7%c3%a3o-Branching-no-Git-Branches-em-Poucas-Palavras#divergent_history" rel="noopener noreferrer"&gt;https://git-scm.com/book/pt-br/v2/Ramifica%c3%a7%c3%a3o-Branching-no-Git-Branches-em-Poucas-Palavras#divergent_history&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-dag"&gt;
&lt;p&gt;Sigla em inglês de Directed Acyclic Graph (grafo acíclico dirigido): uma estrutura de grafo em que os nós, ligados por arestas com direção, nunca formam um ciclo. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-move-bookmark"&gt;
&lt;p&gt;Se você prefere dar um nome logo de início, claro que também dá. Crie um bookmark com &lt;code&gt;jj bookmark create&lt;/code&gt; ao começar o trabalho e, antes de fazer push, mova-o para o change desejado com &lt;code&gt;jj bookmark move&lt;/code&gt; ou &lt;code&gt;jj bookmark advance&lt;/code&gt;. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-spr-available"&gt;
&lt;p&gt;&lt;a href="https://github.blog/changelog/2026-10-06-stacked-pull-requests-generally-available/" rel="noopener noreferrer"&gt;Stacked pull requests generally available - GitHub Changelog&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>git</category>
      <category>jujutsu</category>
      <category>jj</category>
    </item>
    <item>
      <title>Jujutsu no tiene un paso para «crear una rama», y así por fin entendí las ramas de Git</title>
      <dc:creator>Yuka Ooka</dc:creator>
      <pubDate>Tue, 13 Oct 2026 12:43:00 +0000</pubDate>
      <link>https://dev.to/jujuchu-es/jujutsu-no-tiene-un-paso-para-y-asi-por-fin-entendi-las-ramas-de-git-186a</link>
      <guid>https://dev.to/jujuchu-es/jujutsu-no-tiene-un-paso-para-y-asi-por-fin-entendi-las-ramas-de-git-186a</guid>
      <description>&lt;h2&gt;
  
  
  ¿Jujutsu no tiene ramas?
&lt;/h2&gt;

&lt;p&gt;Cuando empecé a usar &lt;strong&gt;&lt;a href="https://www.jj-vcs.dev/" rel="noopener noreferrer"&gt;Jujutsu&lt;/a&gt;&lt;/strong&gt; después de años de trabajar con Git y acostumbrarme a sus flujos de trabajo, lo primero que me desconcertó fue que &lt;strong&gt;no había ninguna rama a la que perteneciera mi trabajo actual&lt;/strong&gt;. Si empiezas con Git, te enseñan la rutina: antes de ponerte a trabajar en serio, crea una rama. Incluso en un proyecto personal en el que te saltas ese paso, al menos estás en la rama main.&lt;/p&gt;

&lt;p&gt;Sin embargo, la &lt;a href="https://docs.jj-vcs.dev/latest/tutorial/" rel="noopener noreferrer"&gt;documentación oficial&lt;/a&gt; y el &lt;a href="https://steveklabnik.github.io/jujutsu-tutorial/" rel="noopener noreferrer"&gt;popular tutorial&lt;/a&gt; se lanzan directamente al trabajo. Nadie crea una rama ni se cambia a otra. De hecho, por más que busqué, no encontré en Jujutsu nada llamado «rama» (branch) que se pudiera manipular. En su lugar hay algo llamado &lt;strong&gt;bookmark&lt;/strong&gt; , que se mapea como una rama al trabajar con Git. Y aun así, un bookmark no es lo mismo que una rama. No entendía nada.&lt;/p&gt;

&lt;p&gt;Pero después de hacer push de mi trabajo en Jujutsu y abrir PRs con él unas cuantas veces siguiendo las guías, se me ocurrió algo: quizá Git y Jujutsu simplemente se refieren a cosas distintas con la palabra «rama». Con esa idea en mente, volví a leer &lt;a href="https://git-scm.com/book/es/v2/Ramificaciones-en-Git-%C2%BFQu%C3%A9-es-una-rama%3F" rel="noopener noreferrer"&gt;el capítulo sobre ramas&lt;/a&gt; de &lt;em&gt;Pro Git&lt;/em&gt;&lt;sup&gt;1&lt;/sup&gt; y la &lt;a href="https://docs.jj-vcs.dev/latest/bookmarks/" rel="noopener noreferrer"&gt;página sobre bookmarks&lt;/a&gt; de la documentación de Jujutsu, y por fin todo encajó. Una rama de Git no es una «rama» en sentido literal, y hay buenas razones para que Jujutsu llame «bookmark» a su equivalente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué significa realmente «una rama de Git es un puntero»
&lt;/h2&gt;

&lt;p&gt;Entonces, ¿qué es exactamente una rama de Git? La sección 3.1 de &lt;em&gt;Pro Git&lt;/em&gt; describe las ramificaciones así:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cuando hablamos de ramificaciones, significa que tú has tomado la rama principal de desarrollo (master) y a partir de ahí has continuado trabajando sin seguir la rama principal de desarrollo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Si sigues leyendo, encuentras esto:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Una rama Git es simplemente un apuntador móvil apuntando a una de esas confirmaciones.&lt;br&gt;&lt;br&gt;
[…]&lt;br&gt;&lt;br&gt;
¿Qué sucede cuando creas una nueva rama? Bueno…, simplemente se crea un nuevo apuntador para que lo puedas mover libremente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;«Una rama es un puntero»&lt;/strong&gt; (o apuntador, en inglés &lt;em&gt;pointer&lt;/em&gt;). Si llevas un tiempo usando Git, seguro que has oído esa frase. Me da algo de vergüenza admitirlo, pero nunca me dijo gran cosa, y durante años usé las ramas por pura intuición (al tanteo). Ahora entiendo por qué. La explicación se apoya en varias premisas que nadie menciona, y a quienes tuvieron Git como primer VCS no les dice mucho. La documentación oficial de Git y los libros clásicos los escribieron veteranos que conocían bien otros sistemas de control de versiones, y es fácil que pasen por alto que quienes empezaron con Git no comparten esas premisas.&lt;/p&gt;

&lt;p&gt;¿Qué hace falta saber, entonces, para que «una rama es un puntero» tenga sentido? Lo primero es que, en Git, &lt;strong&gt;una rama no es la bifurcación del historial en sí&lt;/strong&gt;. Para distinguir ambas cosas, &lt;em&gt;Pro Git&lt;/em&gt; usa expresiones como «el historial diverge» (divergent history) para referirse a la bifurcación misma&lt;sup&gt;2&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;La mayoría de los VCS distribuidos representan el historial como un DAG&lt;sup&gt;3&lt;/sup&gt; y no como un árbol, así que las bifurcaciones y las fusiones se expresan por completo dentro del grafo. En lo que se diferencian los VCS es en el mecanismo que le dan al usuario para ver y manipular esas bifurcaciones, y la mayoría llama «rama» a ese mecanismo. En &lt;a href="https://www.mercurial-scm.org/" rel="noopener noreferrer"&gt;Mercurial&lt;/a&gt;, que apareció más o menos al mismo tiempo que Git, una rama es un metadato que queda incrustado de forma permanente en cada commit de una línea del historial. Git, en cambio, usa un puntero por cada línea del historial, y cada uno apunta a un solo commit.&lt;/p&gt;

&lt;p&gt;¿Todavía no queda claro? Pasemos a la segunda premisa. Lo que distingue a Git de otros VCS es que, &lt;strong&gt;estés donde estés, siempre te lleva automáticamente a la punta del historial&lt;/strong&gt;. En los VCS anteriores, crear ramas y cambiar de una a otra eran operaciones pesadas que ralentizaban seriamente proyectos grandes como el kernel de Linux. Hacerlas rapidísimas fue uno de los objetivos clave al diseñar Git. La solución fue convertir la rama en un puntero móvil a un solo commit, guardado en un archivo de texto de apenas unas decenas de bytes.&lt;/p&gt;

&lt;p&gt;Para que eso funcione, Git espera que edites el código en la línea de trabajo a la que apunta alguna rama, y el puntero de la rama avanza automáticamente con cada nuevo commit. Cambiar de rama significa hacer que HEAD, el puntero que indica dónde estás, coincida con esa rama. Por eso en Git, vayas adonde vayas, siempre terminas en la punta más reciente del historial.&lt;/p&gt;

&lt;p&gt;Como Git era el único VCS distribuido que conocía, daba por hecho que así funcionaban todos. Descubrir que ese comportamiento es propio de Git, y entender el mecanismo que hay detrás, fue lo que por fin me permitió entender qué significa que una rama de Git sea un puntero.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué pasa con una bifurcación del historial sin rama?
&lt;/h2&gt;

&lt;p&gt;Entonces, ¿puede haber en Git una bifurcación del historial que no sea una rama? Crear una es muy fácil: haz checkout de un commit anterior usando su hash.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git checkout 9effb1cc737824d9c14e1a8ecbb725e44ccae104
Note: switching to &lt;span class="s1"&gt;'9effb1cc737824d9c14e1a8ecbb725e44ccae104'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

You are &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s1"&gt;'detached HEAD'&lt;/span&gt; state. You can look around, make experimental
changes and commit them, and you can discard any commits you make &lt;span class="k"&gt;in &lt;/span&gt;this
state without impacting any branches by switching back to a branch.
⋮
HEAD is now at 9effb1c create b.txt

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'444'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; d.txt
&lt;span class="nv"&gt;$ &lt;/span&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'create d.txt'&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;detached HEAD 46b43c3] create d.txt
 1 file changed, 1 insertion&lt;span class="o"&gt;(&lt;/span&gt;+&lt;span class="o"&gt;)&lt;/span&gt;
 create mode 100644 d.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Git se toma la molestia de advertirte que ahora estás en estado de &lt;strong&gt;detached HEAD&lt;/strong&gt; (HEAD desacoplado). Normalmente HEAD apunta a alguna rama. Cuando, en cambio, apunta directamente al hash de un commit concreto, se dice que HEAD está desacoplado. Acumular commits en este estado se considera arriesgado y conviene evitarlo, porque ese historial termina así:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;No lo puedes encontrar después&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Se trata como basura y termina borrándose&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No lo puedes compartir con nadie&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En Git, los commits solo se vuelven rastreables para las personas cuando pertenecen a una rama o a un tag. Los commits que haces con HEAD desacoplado pierden su referencia en cuanto cambias de rama, y ni siquiera aparecen en &lt;code&gt;git log --all&lt;/code&gt;. El reflog es la única forma de recuperarlos. Además, el sistema los considera historial innecesario y quedan expuestos a la recolección de basura, así que, una vez vencido el plazo, desaparecen para siempre. Si son commits que tú mismo puedes perder de vista con facilidad y que pueden desaparecer en cualquier momento, difícilmente se pueden compartir con otras personas.&lt;/p&gt;
&lt;h2&gt;
  
  
  Por qué Jujutsu tiene bookmarks en lugar de ramas
&lt;/h2&gt;

&lt;p&gt;Como dije al principio, Jujutsu no tiene nada llamado «rama» que se pueda manipular. Aun así, la palabra «branch» aparece por todas partes en su documentación, con su sentido literal de bifurcación del historial. Jujutsu no tiene el concepto de «rama actual» ni ningún mecanismo específico para identificar las bifurcaciones del historial, así que «branch» se usa en su sentido original y literal.&lt;/p&gt;

&lt;p&gt;Entonces, ¿por qué Jujutsu no tiene ramas como las de Git o Mercurial? En Git, hacer amend o rebase de un commit le da un hash completamente nuevo. Los hashes que cambian constantemente son difíciles de seguir, tanto para el sistema como para las personas, así que un commit necesita pertenecer a una rama: una etiqueta con nombre, estable, que indica en qué línea de trabajo está. En Jujutsu, en cambio, la unidad básica del historial, el change, tiene un &lt;strong&gt;change ID inmutable&lt;/strong&gt; , distinto de su commit ID, que cambia cada vez que se revisa el change. Sin importar cuántas veces reescribas su contenido o le hagas rebase, puedes seguir un change con el mismo ID, así que no hace mucha falta etiquetar cada línea de trabajo.&lt;/p&gt;

&lt;p&gt;Además, las bifurcaciones del historial siempre se muestran en el log como un grafo en arte ASCII. Entre el grafo que ves en el log y las descripciones de los changes que forman sus nodos, salta a la vista a qué línea de trabajo pertenece cada change. Y cualquier change que tenga descripción o que modifique archivos se queda en el historial hasta que lo descartes explícitamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v8q1eooxrzyvsdgic1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v8q1eooxrzyvsdgic1n.png" alt="Log de Jujutsu" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como las ramas no tienen nombre, en Jujutsu lo normal es trabajar en el equivalente al HEAD desacoplado de Git. Jujutsu lo llama &lt;strong&gt;rama anónima&lt;/strong&gt; (anonymous branch). El HEAD desacoplado se considera peligroso, pero las ramas anónimas de Jujutsu no tienen los dos primeros problemas que ese estado tiene en Git: «1. No lo puedes encontrar después» y «2. Se trata como basura y termina borrándose». ¿Y qué pasa con «3. No lo puedes compartir con nadie»? Para eso Jujutsu ofrece los &lt;strong&gt;bookmarks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Un bookmark es un puntero con nombre asociado a un change. Tanto los bookmarks como las ramas de Git son punteros con nombre, pero, a diferencia de una rama de Git, un bookmark es solo una marca para compartir con otras personas o para no olvidarte de algo, sin relación directa con las bifurcaciones del historial. Por eso puedes poner varios bookmarks en la misma línea de trabajo, y también por eso, cuando creas nuevos changes sobre ese change, un bookmark no avanza por sí solo como lo hace una rama de Git.&lt;/p&gt;

&lt;p&gt;Jujutsu no ve la necesidad de ponerles nombre a las bifurcaciones del historial, ni de señalar una línea de trabajo divergente completa solo para compartir historial con otras personas. Por eso Jujutsu tiene bookmarks en lugar de ramas.&lt;/p&gt;
&lt;h2&gt;
  
  
  Ramas anónimas + bookmarks: hacia dónde ha llegado la evolución de los VCS
&lt;/h2&gt;

&lt;p&gt;En Git, tanto crear bifurcaciones del historial como fusionarlas se hace, en principio, a nivel de rama. ¿Y cómo lo resuelve Jujutsu, que no tiene ramas?&lt;/p&gt;

&lt;p&gt;En Jujutsu, el comando que crea un change nuevo, la unidad básica del historial, es &lt;code&gt;jj new&lt;/code&gt;. ¿Cómo se crea una bifurcación del historial? Pasándole a &lt;code&gt;jj new&lt;/code&gt; el ID de un change que ya tiene un hijo. ¿Cómo se fusiona un historial que diverge? Pasándole a &lt;code&gt;jj new&lt;/code&gt; los IDs de los changes que quieres fusionar. En Jujutsu, &lt;strong&gt;extender el historial, bifurcarlo y fusionarlo se hace a nivel de change&lt;/strong&gt; , y, sorprendentemente, todo es la misma operación básica: crear un change nuevo.&lt;/p&gt;

&lt;p&gt;Sigues trabajando así hasta un punto en el que tiene sentido parar. Es hora de abrir un PR. Es justo en este punto donde necesitas ponerle nombre a esa línea de trabajo&lt;sup&gt;4&lt;/sup&gt;. Pones un bookmark en un change, haces push, y toda la serie de changes, desde donde se separó de main hasta ese change, queda registrada como una rama en el repositorio Git remoto, con cada change convertido en un commit de Git.&lt;/p&gt;

&lt;p&gt;¿Qué se gana cuando &lt;strong&gt;la unidad para compartir no está atada a las ramas&lt;/strong&gt;? En primer lugar, flexibilidad: puedes empezar a trabajar sin decidir un nombre ni qué vas a compartir, y resolver esas cuestiones solo cuando llegue el momento de compartir. En segundo lugar, facilita armar una serie de PRs dependientes, algo que últimamente se ha vuelto mucho más valioso. Los stacked pull requests de GitHub, que permiten dividir un PR en unidades pequeñas con relaciones padre-hijo, por fin pasaron a disponibilidad general el 6 de octubre de 2026&lt;sup&gt;5&lt;/sup&gt;, y con los bookmarks de Jujutsu es muy fácil trabajar con ellos. Para armar stacked PRs con Git, creas la primera rama con &lt;code&gt;gh stack init&lt;/code&gt;, creas una rama hija con &lt;code&gt;gh stack add&lt;/code&gt; cada vez que terminas una parte del trabajo y, al final, haces push y abres los PRs con &lt;code&gt;gh stack submit&lt;/code&gt;. Es un proceso bastante tedioso y dependiente de herramientas específicas. Con Jujutsu, pones bookmarks en orden sobre tu línea de trabajo, haces push y ejecutas algo como &lt;code&gt;gh stack link &amp;lt;bookmark1&amp;gt; &amp;lt;bookmark2&amp;gt; &amp;lt;bookmark3&amp;gt;&lt;/code&gt;. Eso es todo. Es casi anticlimático de lo fácil que resulta.&lt;/p&gt;

&lt;p&gt;Al no tener ramas, Jujutsu replanteó las operaciones que Git había construido en torno a ellas, de modo que puedes trabajar en unidades más pequeñas y flexibles. Después de convivir un tiempo con un Jujutsu sin ramas, por fin entendí qué son las ramas de Git, después de años de usarlas con una idea vaga. Y entonces los conceptos de Jujutsu, tan distintos de los de Git, empezaron a parecerme sorprendentemente lógicos. Esa sensación se vuelve aún más fuerte cuando tomas distancia y miras la historia de los VCS.&lt;/p&gt;

&lt;p&gt;Ya mencioné que Mercurial tiene un tipo de rama distinto del de Git. Pero como las ramas de Mercurial son datos permanentes y globales incrustados en cada commit, no encajan bien con el desarrollo de funcionalidades o las correcciones de bugs que se terminan en pocos días. Por eso más tarde se agregaron los bookmarks para el trabajo liviano: marcas de tipo puntero que servían para pasar el trabajo al hacer push o para señalar dónde estabas trabajando. Inspirados en las ramas de Git, pero independientes de las ramas de Mercurial y pensados para compartir. De ahí vienen los bookmarks de Jujutsu.&lt;/p&gt;

&lt;p&gt;Jujutsu va un paso más allá: considera que las ramas son innecesarias para las bifurcaciones del historial y directamente no las tiene. Curiosamente, &lt;a href="https://sapling-scm.com/" rel="noopener noreferrer"&gt;Sapling&lt;/a&gt;, que Meta creó a partir de un fork de Mercurial y desarrolló por su cuenta, tampoco tiene ramas, pero sí bookmarks. Se podría decir que «ramas anónimas + bookmarks» es uno de los destinos a los que ha llegado la evolución del control de versiones, de Git a Jujutsu pasando por Mercurial.&lt;/p&gt;

&lt;p&gt;Una última aclaración: este artículo se basa en las secciones «2-4-2. La diferencia entre branch y bookmark» y «2-4-3. Trabajar en branches anónimas» de mi libro, &lt;em&gt;Juju-chu! —Comienza tu flujo de trabajo Jujutsu × IA con &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://juju-chu.com/es" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Fog%2Fes%2Fdefault.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://juju-chu.com/es" rel="noopener noreferrer" class="c-link"&gt;
            Juju-chu! —Comienza tu flujo de trabajo Jujutsu × IA con jj new
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Una guía práctica para adoptar Jujutsu (jj) junto a Claude Code y Codex: snapshots automáticos, operaciones que siempre se pueden deshacer y una reescritura del historial que es segura.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Ficons%2Ffavicon.ico" width="48" height="48"&gt;
          juju-chu.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Los primeros capítulos del libro se centran en la diferencia entre los modelos mentales de Git y de Jujutsu. Además de las ramas frente a los bookmarks, explican con cuidado los otros puntos en los que suelen tropezar quienes empiezan. Si este artículo te dio ganas de probar Jujutsu, o de darle otra oportunidad después de que la primera vez no te convenciera, échale un vistazo.&lt;/p&gt;

&lt;h2 id="footnote-label"&gt;Footnotes&lt;/h2&gt;

&lt;ol&gt;
&lt;li id="user-content-fn-pro-git"&gt;
&lt;p&gt;Libro de código abierto sobre Git escrito por Scott Chacon y Ben Straub, que también se usa como documentación oficial de Git. Se puede leer gratis en línea. &lt;a href="https://git-scm.com/book/es/v2" rel="noopener noreferrer"&gt;https://git-scm.com/book/es/v2&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-divergent"&gt;
&lt;p&gt;&lt;a href="https://git-scm.com/book/es/v2/Ramificaciones-en-Git-%C2%BFQu%C3%A9-es-una-rama%3F#rdivergent_history" rel="noopener noreferrer"&gt;https://git-scm.com/book/es/v2/Ramificaciones-en-Git-%C2%BFQu%C3%A9-es-una-rama%3F#rdivergent_history&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-dag"&gt;
&lt;p&gt;Siglas en inglés de Directed Acyclic Graph (grafo acíclico dirigido): una estructura de grafo en la que los nodos, unidos por aristas con dirección, nunca forman un ciclo. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-move-bookmark"&gt;
&lt;p&gt;Si prefieres ponerle nombre desde el principio, por supuesto también puedes hacerlo. Crea un bookmark con &lt;code&gt;jj bookmark create&lt;/code&gt; al empezar a trabajar y, antes de hacer push, muévelo al change que corresponda con &lt;code&gt;jj bookmark move&lt;/code&gt; o &lt;code&gt;jj bookmark advance&lt;/code&gt;. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-spr-available"&gt;
&lt;p&gt;&lt;a href="https://github.blog/changelog/2026-10-06-stacked-pull-requests-generally-available/" rel="noopener noreferrer"&gt;Stacked pull requests generally available - GitHub Changelog&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>git</category>
      <category>jujutsu</category>
      <category>jj</category>
    </item>
    <item>
      <title>Jujutsu Has No “Create a Branch” Step, and That Finally Made Git Branches Click</title>
      <dc:creator>Yuka Ooka</dc:creator>
      <pubDate>Tue, 13 Oct 2026 12:40:00 +0000</pubDate>
      <link>https://dev.to/oukayuka/jujutsu-has-no-create-a-branch-step-and-that-finally-made-git-branches-click-1lb9</link>
      <guid>https://dev.to/oukayuka/jujutsu-has-no-create-a-branch-step-and-that-finally-made-git-branches-click-1lb9</guid>
      <description>&lt;h2&gt;
  
  
  Jujutsu Has No Branches?
&lt;/h2&gt;

&lt;p&gt;When I started using &lt;strong&gt;&lt;a href="https://www.jj-vcs.dev/" rel="noopener noreferrer"&gt;Jujutsu&lt;/a&gt;&lt;/strong&gt; with a brain trained by years of Git workflows, the first thing that threw me was that &lt;strong&gt;there was no branch for my current work to belong to&lt;/strong&gt;. Every Git beginner learns the drill: before you do any real work, create a branch. Even on a casual side project where you skip that step, you’re at least on the main branch.&lt;/p&gt;

&lt;p&gt;Yet the &lt;a href="https://docs.jj-vcs.dev/latest/tutorial/" rel="noopener noreferrer"&gt;official docs&lt;/a&gt; and the &lt;a href="https://steveklabnik.github.io/jujutsu-tutorial/" rel="noopener noreferrer"&gt;well-known tutorial&lt;/a&gt; just dive straight into the work. Nobody creates a branch or switches to one. In fact, no matter where I looked, I couldn’t find anything in Jujutsu called a “branch” that you could actually operate on. Instead there’s this thing called a &lt;strong&gt;bookmark&lt;/strong&gt; , which gets mapped to a branch when you work with Git. And yet a bookmark is apparently not the same thing as a branch. I had no idea what was going on.&lt;/p&gt;

&lt;p&gt;After I’d pushed my Jujutsu work and opened PRs from it a few times by following the guides, though, something occurred to me: maybe Git and Jujutsu simply mean different things by the word “branch.” With that in mind, I reread &lt;a href="https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell" rel="noopener noreferrer"&gt;the branching chapter&lt;/a&gt; of &lt;em&gt;Pro Git&lt;/em&gt;&lt;sup&gt;1&lt;/sup&gt; and the &lt;a href="https://docs.jj-vcs.dev/latest/bookmarks/" rel="noopener noreferrer"&gt;bookmarks page&lt;/a&gt; in the Jujutsu docs, and it finally clicked. A Git branch isn’t a “branch” in the literal sense, and there’s good reason Jujutsu calls its counterpart a “bookmark.”&lt;/p&gt;

&lt;h2&gt;
  
  
  What “A Git Branch Is a Pointer” Actually Means
&lt;/h2&gt;

&lt;p&gt;So what exactly is a Git branch? Section 3.1 of &lt;em&gt;Pro Git&lt;/em&gt;, cited above, describes branching this way:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Branching means you diverge from the main line of development and continue to do work without messing with that main line.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read a little further and you’ll find this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A branch in Git is simply a lightweight movable pointer to one of these commits.&lt;br&gt;&lt;br&gt;
[…]&lt;br&gt;&lt;br&gt;
What happens when you create a new branch? Well, doing so creates a new pointer for you to move around.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;“A branch is a pointer.”&lt;/strong&gt; If you’ve used Git for any length of time, you’ve heard that line. Embarrassingly, it never meant much to me, and for years I used branches by feel. I can see why now. The explanation rests on several unstated assumptions, and for people whose first VCS was Git, it doesn’t tell you much. Git’s official documentation and the classic books were written by veterans who knew other version control systems well, and it’s easy for them to overlook that people who started with Git don’t share those assumptions.&lt;/p&gt;

&lt;p&gt;So what do you need to know before “a branch is a pointer” makes sense? The first thing is that in Git, &lt;strong&gt;a branch is not the split in history itself&lt;/strong&gt;. To keep the two apart, &lt;em&gt;Pro Git&lt;/em&gt; uses phrases like “divergent history” for the split itself&lt;sup&gt;2&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Most distributed VCSs represent history as a DAG&lt;sup&gt;3&lt;/sup&gt; rather than a tree, so splits and merges are expressed entirely within the graph. Where VCSs differ is in the mechanism they give users to see and work with those splits, and most of them call that mechanism a “branch.” In &lt;a href="https://www.mercurial-scm.org/" rel="noopener noreferrer"&gt;Mercurial&lt;/a&gt;, which appeared around the same time as Git, a branch is metadata permanently embedded in every commit on a given line of history. Git, by contrast, uses one pointer per line of history, each pointing to a single commit.&lt;/p&gt;

&lt;p&gt;Still fuzzy? Then let’s move on to the second assumption. What sets Git apart from other VCSs is that &lt;strong&gt;wherever you are, you always get pushed to the tip of history automatically&lt;/strong&gt;. In earlier VCSs, creating and switching branches were heavy operations that seriously slowed down large projects like the Linux kernel. Making them blazingly fast was a key goal when Git was designed. The answer was to make a branch a movable pointer to a single commit, stored in a text file of just a few dozen bytes.&lt;/p&gt;

&lt;p&gt;To make that work, Git expects you to edit code on the line of work some branch points to, and the branch pointer automatically moves to each new commit. Switching branches means making HEAD, the pointer to where you currently are, line up with that branch. So in Git, wherever you go, you always end up pushed to the tip of history.&lt;/p&gt;

&lt;p&gt;Since Git was the only distributed VCS I knew, I assumed that’s simply how distributed VCSs work. Learning that this behavior is specific to Git, and understanding the machinery behind it, finally brought “a Git branch is a pointer” into focus.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens to a Split in History Without a Branch?
&lt;/h2&gt;

&lt;p&gt;So can Git have a split in history that isn’t a branch? It’s actually easy to make one: check out a past commit by its hash.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git checkout 9effb1cc737824d9c14e1a8ecbb725e44ccae104
Note: switching to &lt;span class="s1"&gt;'9effb1cc737824d9c14e1a8ecbb725e44ccae104'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

You are &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s1"&gt;'detached HEAD'&lt;/span&gt; state. You can look around, make experimental
changes and commit them, and you can discard any commits you make &lt;span class="k"&gt;in &lt;/span&gt;this
state without impacting any branches by switching back to a branch.
⋮
HEAD is now at 9effb1c create b.txt

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'444'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; d.txt
&lt;span class="nv"&gt;$ &lt;/span&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s1"&gt;'create d.txt'&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;detached HEAD 46b43c3] create d.txt
 1 file changed, 1 insertion&lt;span class="o"&gt;(&lt;/span&gt;+&lt;span class="o"&gt;)&lt;/span&gt;
 create mode 100644 d.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Git goes out of its way to tell you that you’re now in a &lt;strong&gt;detached HEAD&lt;/strong&gt; state. Normally HEAD points to some branch. When HEAD points directly to a specific commit hash instead, that’s called detached HEAD. Stacking commits in this state is considered risky and best avoided, because that history ends up like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;You can’t find it later&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It’s treated as garbage and eventually deleted&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You can’t share it with others&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In Git, commits only become traceable by humans once they belong to a branch or a tag. Commits you make in detached HEAD lose their reference the moment you switch branches, and they don’t show up even in &lt;code&gt;git log --all&lt;/code&gt;. The reflog is your only way to get them back. The system also treats them as unneeded history and makes them eligible for garbage collection, so once the expiry period passes, they’re gone for good. Commits that you can easily lose track of yourself, and that could vanish at any time, are naturally hard to share with anyone else.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Jujutsu Has Bookmarks Instead of Branches
&lt;/h2&gt;

&lt;p&gt;As I mentioned at the start, Jujutsu has nothing called a “branch” that you can operate on. Yet the word “branch” shows up all over the Jujutsu docs, in its literal sense of a split in history. Jujutsu has no concept of a “current branch,” and no dedicated mechanism for identifying splits in history, so “branch” is used in its plain, original meaning.&lt;/p&gt;

&lt;p&gt;So why doesn’t Jujutsu have branches like Git and Mercurial do? In Git, amending or rebasing a commit gives it an entirely new hash. Hashes that keep changing are hard for both the system and humans to follow, so a commit needs to belong to a branch: a stable named label that says which line of work it’s on. In Jujutsu, on the other hand, the basic unit of history, the change, carries an &lt;strong&gt;immutable change ID&lt;/strong&gt; separate from its commit ID, which changes whenever the change is revised. However many times you rewrite its contents or rebase it, you can track a change by the same ID, so there’s little need to label every line of work.&lt;/p&gt;

&lt;p&gt;Splits in history are also always visualized in the log as an ASCII-art graph. Between the tree graph you can see in the log and the descriptions of the changes that form its nodes, it’s obvious at a glance which line of work each change belongs to. And any change that has a description or modifies files stays in your history until you explicitly abandon it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v8q1eooxrzyvsdgic1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v8q1eooxrzyvsdgic1n.png" alt="Jujutsu log" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With no named branches, the normal way to work in Jujutsu is in the equivalent of Git’s detached HEAD. Jujutsu calls this an &lt;strong&gt;anonymous branch&lt;/strong&gt;. Detached HEAD is considered dangerous, but Jujutsu’s anonymous branches don’t have the first two problems it has in Git: “1. You can’t find it later” and “2. It’s treated as garbage and eventually deleted.” What about “3. You can’t share it with others”? That’s what Jujutsu provides &lt;strong&gt;bookmarks&lt;/strong&gt; for.&lt;/p&gt;

&lt;p&gt;A bookmark is a named pointer attached to a change. Both are named pointers, but unlike a Git branch, a bookmark is purely a marker for sharing with others or for reminding yourself, with no direct connection to splits in history. That’s why you can put multiple bookmarks on the same line of work, and also why, when you add new history on top, a bookmark doesn’t automatically move forward the way a Git branch does.&lt;/p&gt;

&lt;p&gt;Jujutsu sees no need to name splits in history, or to designate an entire diverging line of work just to share history with others. That’s why Jujutsu has bookmarks instead of branches.&lt;/p&gt;
&lt;h2&gt;
  
  
  Anonymous Branches + Bookmarks: Where VCS Evolution Landed
&lt;/h2&gt;

&lt;p&gt;In Git, both creating splits in history and merging them basically happen at the branch level. So how does Jujutsu, with no branches, handle them?&lt;/p&gt;

&lt;p&gt;In Jujutsu, the command that creates a new change, the basic unit of history, is &lt;code&gt;jj new&lt;/code&gt;. How do you create a split in history? Pass &lt;code&gt;jj new&lt;/code&gt; the ID of a change that already has a child. How do you merge diverging history? Pass &lt;code&gt;jj new&lt;/code&gt; the IDs of the changes you want to merge. In Jujutsu, &lt;strong&gt;extending history, branching, and merging all work at the level of the change&lt;/strong&gt; , and remarkably, they’re all the same basic operation: creating a new change.&lt;/p&gt;

&lt;p&gt;You keep working like this until you reach a stopping point. Time to open a PR. This is the first time you actually need to give that line of work a name&lt;sup&gt;4&lt;/sup&gt;. Set a bookmark on a change and push it, and the whole series of changes from where it split off from main up to that change gets registered in the remote Git repository as a branch, with each change mapped to a Git commit.&lt;/p&gt;

&lt;p&gt;So what do you gain when &lt;strong&gt;the unit of sharing isn’t tied to branches&lt;/strong&gt;? First, flexibility: you can start working without deciding on a name or on what to share, and settle those questions only when it’s time to share. Second, it makes a series of dependent PRs easy to build, which has recently become a lot more valuable. GitHub’s stacked pull requests, which let you split a PR into small units with parent-child relationships, finally became generally available on October 6, 2026&lt;sup&gt;5&lt;/sup&gt;, and Jujutsu bookmarks make them very easy to work with. To build stacked PRs with Git, you create the first branch with &lt;code&gt;gh stack init&lt;/code&gt;, create a child branch with &lt;code&gt;gh stack add&lt;/code&gt; each time you finish a chunk of work, and finally push and open the PRs with &lt;code&gt;gh stack submit&lt;/code&gt;. It’s a fairly involved process that leans heavily on dedicated tooling. With Jujutsu, you put bookmarks on your line of work in order, push, and run something like &lt;code&gt;gh stack link &amp;lt;bookmark1&amp;gt; &amp;lt;bookmark2&amp;gt; &amp;lt;bookmark3&amp;gt;&lt;/code&gt;. That’s it. It’s almost anticlimactic.&lt;/p&gt;

&lt;p&gt;Without branches, Jujutsu has rethought the operations Git built around branches, so you can work in smaller and more flexible units. After living with branchless Jujutsu for a while, I finally understood what Git branches are, after years of using them with only a fuzzy idea. And then Jujutsu’s concepts, so different from Git’s, started to look surprisingly rational. That feeling gets even stronger when you step back and look at the history of VCSs.&lt;/p&gt;

&lt;p&gt;I mentioned earlier that Mercurial has a different kind of branch from Git’s. But since Mercurial branches are permanent, global data embedded in every single commit, they’re a poor fit for feature work or bug fixes that wrap up in a few days. So bookmarks were added later for lightweight work: pointer-style markers you could use to hand off work on push, or to mark where you’re currently working. Modeled on Git branches, yet independent of branches and built for sharing. That’s where Jujutsu’s bookmarks come from.&lt;/p&gt;

&lt;p&gt;Jujutsu takes this one step further: it treats branches as unnecessary for splits in history and doesn’t have them as a feature at all. Interestingly, &lt;a href="https://sapling-scm.com/" rel="noopener noreferrer"&gt;Sapling&lt;/a&gt;, which Meta forked from Mercurial and developed on its own, also has bookmarks and no branches. You could say that “anonymous branches + bookmarks” represents one destination in the evolution of version control, from Git through Mercurial to Jujutsu.&lt;/p&gt;

&lt;p&gt;One last note: this post is based on sections “2-4-2. The Difference Between Branches and Bookmarks” and “2-4-3. Working on Anonymous Branches” of my book, &lt;em&gt;Juju-chu! — Starting Your Jujutsu × AI Workflow with &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://juju-chu.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Fog%2Fen%2Fdefault.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://juju-chu.com/" rel="noopener noreferrer" class="c-link"&gt;
            Juju-chu! — Starting Your Jujutsu × AI Workflow with jj new
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A hands-on book on adopting Jujutsu (jj) with Claude Code and Codex: automatic snapshots, undoable operations, and safe history rewriting.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Ficons%2Ffavicon.ico" width="48" height="48"&gt;
          juju-chu.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;The early chapters of the book focus on the difference between Git’s and Jujutsu’s mental models. Besides branches versus bookmarks, they carefully walk through the other places where newcomers tend to stumble. If this post made you want to try Jujutsu, or to give it another shot after bouncing off it once, take a look.&lt;/p&gt;

&lt;h2 id="footnote-label"&gt;Footnotes&lt;/h2&gt;

&lt;ol&gt;
&lt;li id="user-content-fn-pro-git"&gt;
&lt;p&gt;An open-source book on Git by Scott Chacon and Ben Straub, also used as Git’s official documentation. It’s available free online. &lt;a href="https://git-scm.com/book/en/v2" rel="noopener noreferrer"&gt;https://git-scm.com/book/en/v2&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-divergent"&gt;
&lt;p&gt;&lt;a href="https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell#divergent_history" rel="noopener noreferrer"&gt;https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell#divergent_history&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-dag"&gt;
&lt;p&gt;Short for Directed Acyclic Graph: a graph structure in which nodes connected by directed edges never form a cycle. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-move-bookmark"&gt;
&lt;p&gt;If you’d rather name things up front, you can of course do that too. Create a bookmark with &lt;code&gt;jj bookmark create&lt;/code&gt; when you start working, then move it to the target change with &lt;code&gt;jj bookmark move&lt;/code&gt; or &lt;code&gt;jj bookmark advance&lt;/code&gt; before you push. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-spr-available"&gt;
&lt;p&gt;&lt;a href="https://github.blog/changelog/2026-10-06-stacked-pull-requests-generally-available/" rel="noopener noreferrer"&gt;Stacked pull requests generally available - GitHub Changelog&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>git</category>
      <category>jujutsu</category>
      <category>jj</category>
    </item>
    <item>
      <title>Por que continuo escolhendo o Jujutsu mesmo com a IA cuidando do Git</title>
      <dc:creator>Yuka Ooka</dc:creator>
      <pubDate>Tue, 06 Oct 2026 12:48:00 +0000</pubDate>
      <link>https://dev.to/jujuchu-pt/por-que-continuo-escolhendo-o-jujutsu-mesmo-com-a-ia-cuidando-do-git-5gpa</link>
      <guid>https://dev.to/jujuchu-pt/por-que-continuo-escolhendo-o-jujutsu-mesmo-com-a-ia-cuidando-do-git-5gpa</guid>
      <description>&lt;p&gt;&lt;strong&gt;“Se um agente de IA já cuida do Git para você, por que aprender outro sistema de controle de versões, como o &lt;a href="https://www.jj-vcs.dev/" rel="noopener noreferrer"&gt;Jujutsu&lt;/a&gt;?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Essa foi a objeção mais comum ao meu último post, &lt;a href="https://dev.to/jujuchu-pt/15-anos-de-git-e-depois-jujutsu-por-que-nao-consigo-mais-voltar-14pe"&gt;15 anos de Git e depois Jujutsu: por que não consigo mais voltar&lt;/a&gt;. É uma dúvida legítima, e também interessante, então este post é a minha resposta.&lt;/p&gt;

&lt;p&gt;Concordo que o controle de versões do dia a dia é trabalho para um agente de IA. É exatamente assim que eu trabalho. A diferença é que os comandos que meus agentes executam são do Jujutsu, não do Git. Depois de experimentar os dois jeitos, estou convencida de que, mesmo com a IA no comando, o Jujutsu oferece uma experiência de desenvolvimento muito melhor, e de que o tempo investido para aprendê-lo se paga rapidamente.&lt;/p&gt;

&lt;p&gt;Antes de apresentar meus argumentos, vale esclarecer logo uma dúvida óbvia: a IA consegue mesmo lidar com o Jujutsu? Testei com Opus, GPT, Gemini e outros. Os modelos mais recentes já conhecem nativamente os conceitos básicos e os principais comandos do Jujutsu, e conseguem cuidar das operações do dia a dia sem carregar nenhuma skill extra. Dito isso, o Jujutsu não está tão integrado às ferramentas dos agentes quanto o Git, então é preciso alguma configuração para impedir que o agente volte ao Git sem avisar e para ensinar a ele um fluxo de trabalho adequado ao Jujutsu. &lt;a href="https://juju-chu.com/pt/agent-config" rel="noopener noreferrer"&gt;Esta é a configuração que eu uso&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A cerimônia do commit no Git versus os changes sem atrito do Jujutsu
&lt;/h2&gt;

&lt;p&gt;No Git, a unidade básica do histórico é o &lt;strong&gt;commit&lt;/strong&gt;. O fluxo padrão é assim: você edita arquivos na working tree, escolhe os que quer e os adiciona ao índice, depois escreve uma mensagem e cria um commit. Só então algo entra no histórico. Um commit foi pensado para ser um produto acabado, algo feito com cuidado, e é por isso que o Git oferece o índice como staging area. Editar um arquivo e registrar essas alterações no histórico exige uma sequência longa e rígida de passos. É quase um ritual.&lt;/p&gt;

&lt;p&gt;Então, mesmo quando você entrega o Git a uma IA, continua terminando cada tarefa com o pedido &lt;strong&gt;“faça o commit disso”&lt;/strong&gt;. Peça qualquer operação no histórico no meio de uma tarefa e lá vem a troca de sempre: &lt;strong&gt;“Há alterações sem commit. Devo guardá-las no stash ou fazer o commit primeiro?”&lt;/strong&gt;. Cada rodada talvez leve só meio minuto, mas acontece o tempo todo, e tudo isso vai somando. Há também um custo cognitivo, pago tanto por você quanto pela IA, mesmo que você não perceba.&lt;/p&gt;

&lt;p&gt;No Jujutsu, a unidade básica do histórico é o &lt;strong&gt;change&lt;/strong&gt;. Quando você inicializa um repositório, começa em um change vazio. Cada edição que você faz ali é salva, conforme você trabalha, como uma nova revisão desse change&lt;sup&gt;1&lt;/sup&gt;. Você pode adicionar uma descrição, o equivalente no Jujutsu a uma mensagem de commit, quando quiser. Um change nunca tem um momento em que fica oficialmente “pronto”&lt;sup&gt;2&lt;/sup&gt;. Quando termina o trabalho, você simplesmente segue em frente.&lt;/p&gt;

&lt;p&gt;Isso significa que, quando uma IA opera o Jujutsu por você, basta deixar uma instrução fixa: começar cada tarefa em um change novo, com uma descrição&lt;sup&gt;3&lt;/sup&gt;. A partir daí, você só diz “crie a funcionalidade X”, e o histórico fica dividido em unidades razoáveis que acompanham o fluxo do trabalho. Chega de “faça o commit disso” no fim de cada tarefa, e chega de ter que arrumar a cópia de trabalho antes de uma operação no histórico.&lt;/p&gt;

&lt;p&gt;O Jujutsu é compatível com o Git, mas não existe índice entre o seu diretório de trabalho e o seu repositório local. Além disso, o estado do seu diretório de trabalho &lt;em&gt;é&lt;/em&gt; o ponto atual do histórico (o Jujutsu chama isso de “working copy as a commit”, a cópia de trabalho como commit). No Git, tanto pessoas quanto a IA precisam acompanhar &lt;strong&gt;três estados&lt;/strong&gt; para cada alteração em um arquivo. No Jujutsu, normalmente há &lt;strong&gt;só um&lt;/strong&gt;. Só depois de migrar percebi quanto esforço mental extra eu gastava para me adaptar ao jeito do Git de fazer as coisas, e como todo aquele controle era estressante.&lt;/p&gt;

&lt;p&gt;Alguns de vocês vão dizer que isso não incomoda nem um pouco. Tudo bem. Muita gente realmente não se importa de vestir terno e chegar ao escritório às 8h30 todas as manhãs. Mas imagine sair disso para um emprego sem código de vestimenta, com horário flexível e trabalho remoto até três dias por semana, e achar tudo tão confortável que não daria mais para voltar. Foi isso que senti com a mudança.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Jujutsu facilita desfazer os erros da IA
&lt;/h2&gt;

&lt;p&gt;Pessoas erram, e a IA também. Ainda vejo, de vez em quando, relatos de agentes de IA que apagaram arquivos em que alguém estava trabalhando, sem nenhum jeito de recuperá-los. Peça a um agente para resolver um conflito e não é raro receber um resultado que passa nos testes, mas está semanticamente quebrado. E como as instruções aos agentes são dadas em linguagem natural, um prompt nem sempre transmite bem a sua intenção, então muitas vezes você não vai ficar satisfeito com o que recebe.&lt;/p&gt;

&lt;p&gt;Quando a IA executa comandos do Git como parte do trabalho, recuperar-se de um resultado ruim fica muito mais difícil. O Git não tem como voltar o repositório inteiro ao estado em que estava antes de uma determinada operação. Como mencionei, o Git guarda estado em vários lugares: a working tree, o índice, o stash e os commits, e cada um tem sua própria forma de proteção, quando existe alguma. Rebase, amend e squash não modificam os commits existentes. Eles criam commits novos e movem o branch para eles, de modo que os originais deixam de ser referenciados por qualquer branch. Eles continuam no reflog, mas encontrar depois a entrada certa, enterrada no meio de todo o resto, é uma verdadeira dor de cabeça.&lt;/p&gt;

&lt;p&gt;Para compensar o fato de o Git não salvar alterações sem commit, o Claude Code oferece o comando &lt;code&gt;/rewind&lt;/code&gt;, que volta o código a um ponto anterior junto com a conversa. Mas ele não combina bem com um agente que executa comandos do Git. Seus arquivos voltam, mas o estado do Git não, então de repente o &lt;code&gt;git status&lt;/code&gt; mostra uma pilha de alterações que você nunca quis, e lá vai você arrumar o histórico de novo. E o que tiver sido alterado por comandos do shell, por você ou por outros agentes rodando em paralelo não é revertido de jeito nenhum.&lt;/p&gt;

&lt;p&gt;Se você percebe um erro na hora, ainda está numa boa. Mas o mais comum é ele aparecer depois, quando você roda os testes após continuar trabalhando ou quando revisa as coisas dias mais tarde. A essa altura, fica muito mais difícil desembaraçar tudo. Mais operações se acumularam em cima da errada e, mesmo que você mergulhe de cabeça no reflog, nada garante que uma longa série de passos delicados vai resolver. Pior: o Git não oferece nenhum jeito de desfazer a própria tentativa de recuperação. Uma IA que tenta uma correção atrás da outra para sair do buraco pode facilmente piorar as coisas.&lt;/p&gt;

&lt;p&gt;O Jujutsu resolve quase tudo isso. Como regra geral, o resultado de qualquer comando &lt;code&gt;jj&lt;/code&gt; pode ser revertido com &lt;code&gt;jj undo&lt;/code&gt;, e o próprio undo pode ser desfeito com &lt;code&gt;jj redo&lt;/code&gt;. Isso é possível porque o Jujutsu mantém, separado do log normal, um registro de cada operação que altera o repositório: o &lt;strong&gt;operation log&lt;/strong&gt;. Cada entrada do operation log está ligada a um snapshot do repositório como ele ficou ao final daquela operação. Você pode restaurar os arquivos para esse estado, ou reverter só o efeito daquela operação, mantendo tudo o que veio depois.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcasjsavrt5w9v9w4j1dm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcasjsavrt5w9v9w4j1dm.png" alt="O operation log do Jujutsu" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cada comando &lt;code&gt;jj&lt;/code&gt; que uma IA executa durante uma longa sessão de tentativa e erro também vai parar no operation log. Quando algo dá errado, você pode repassar tudo o que a IA fez, identificar a causa e voltar ao estado logo antes de as coisas desandarem.&lt;/p&gt;

&lt;p&gt;Além disso, ao contrário do hash de um commit do Git, que muda toda vez que você edita o commit, o change ID do Jujutsu continua o mesmo, não importa quantas vezes o change seja revisado. Você pode consultar o histórico de revisões de um change no &lt;strong&gt;evolution log&lt;/strong&gt; e, com um pouco de garimpo, encontrar uma versão anterior e restaurar seu conteúdo. Usando a data e a hora ou o diff como referência, dá até para se recuperar de uma resolução de conflito malfeita de vários dias atrás e refazê-la.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffwwgp4filcvseq706r60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffwwgp4filcvseq706r60.png" alt="O evolution log do Jujutsu" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cada edição é salva no histórico conforme você trabalha. O operation log e o evolution log permitem encontrar onde as coisas deram errado e voltar a esse ponto. E se a própria recuperação der errado, &lt;code&gt;jj undo&lt;/code&gt; e &lt;code&gt;jj redo&lt;/code&gt; deixam você tentar de novo na mesma hora. É um nível de segurança que o Git simplesmente não oferece, e é exatamente por isso que, com o Jujutsu, consigo entregar o controle de versões a uma IA com mais tranquilidade, e com mais ousadia, do que jamais consegui com o Git.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que um histórico limpo importa mais na era da programação com IA
&lt;/h2&gt;

&lt;p&gt;Outro comentário que se destacou no meu último post foi &lt;strong&gt;“não faço questão de manter o histórico limpo, então não vejo sentido no Jujutsu”&lt;/strong&gt;. O raciocínio parece ser que, mesmo que o histórico esteja uma bagunça, basta pedir à IA para encontrar o que você precisa. Mas será que é assim mesmo? Eu diria que é o contrário: justamente porque, com a IA, escrevemos e lemos menos código, um histórico limpo importa mais do que nunca.&lt;/p&gt;

&lt;p&gt;Os agentes de programação melhoraram tanto que muitos desenvolvedores hoje mal escrevem código e também não leem cada linha que a IA gera. Mesmo assim, eles continuam zelando pela qualidade do que vai para produção, seja pedindo a um agente com outro modelo que revise o trabalho, seja conferindo pessoalmente as partes críticas, como mudanças em estruturas de dados. Se você consegue rastrear direto no histórico o que mudou, por que e do que depende, tudo isso fica mais rápido e com menos erros. Justamente porque ninguém está revisando cada linha, &lt;strong&gt;seu histórico de commits precisa funcionar como o sumário do código&lt;/strong&gt; , para que você encontre as partes que importam. Uma sequência de commits gigantes sem intenção clara obriga a IA a carregar contexto irrelevante toda vez, o que gasta tokens e pode prejudicar a qualidade do trabalho dela.&lt;/p&gt;

&lt;p&gt;No início de cada sessão, um agente costuma olhar primeiro os diffs significativos mais recentes, antes do diretório de trabalho como um todo. Enfie “uma correção de bug + uma atualização de dependências + conteúdo sem relação + uma refatoração que não tem nada a ver” em um único commit, e o agente se confunde. Organize commits de tamanho razoável e com intenção clara, numa ordem que reflita a relação de causa e efeito, e até um prompt curto vai dar ao agente o contexto de que ele precisa para a próxima tarefa.&lt;/p&gt;

&lt;p&gt;E mesmo que você quase não leia o código gerado pela IA durante o desenvolvimento, um incidente vai obrigar você a lê-lo com atenção. A primeira pergunta diante de uma queda em produção é “quando e onde entrou o código problemático?”. Quando cada minuto conta, um histórico de commits semanticamente coerentes ajuda você a localizar o problema rapidamente.&lt;/p&gt;

&lt;p&gt;A programação com IA também criou um problema novo ao disparar a produtividade: &lt;strong&gt;os PRs ficam enormes&lt;/strong&gt; → &lt;strong&gt;fica difícil revisá-los&lt;/strong&gt; → &lt;strong&gt;PRs sem merge se acumulam à espera de revisão&lt;/strong&gt;. Agora até equipes de poucas pessoas caem nesse ciclo. Gigantes de tecnologia como Google e Meta lidam com esse problema há mais de uma década, e a resposta delas tem sido “dividir os PRs em unidades pequenas que dependem umas das outras”. Suponha que você normalmente enviaria uma funcionalidade inteira como um único PR. Em vez disso, você cria quatro PRs: “1. alterações na camada de modelo”, “2. alterações nas tarefas agendadas”, “3. alterações na API do servidor” e “4. alterações no frontend web”. Depois, empilha esses PRs na ordem 1 → 2 → 3 → 4. Cada um pode ser revisado, aprovado e receber merge separadamente, mas um PR só pode receber merge depois que os PRs abaixo dele na pilha (no caso do 3, o 1 e o 2) já tiverem entrado. Essas empresas incorporaram esse fluxo às suas ferramentas e passaram a usá-lo no desenvolvimento do dia a dia.&lt;/p&gt;

&lt;p&gt;PRs pequenos e com um papel lógico claro facilitam a vida de quem revisa, e fica mais fácil identificar quais você precisa revisar. As alterações no branch de um PR mais abaixo na pilha se propagam automaticamente para os branches acima dele, com o rebase feito pelas ferramentas. E, graças às dependências, você pode começar com segurança a próxima parte do trabalho enquanto o primeiro PR ainda espera revisão. É isso que se costuma chamar de &lt;strong&gt;stacked diffs&lt;/strong&gt; ou &lt;strong&gt;stacked PRs&lt;/strong&gt;. &lt;a href="https://graphite.com/docs/create-submit-prs" rel="noopener noreferrer"&gt;Graphite&lt;/a&gt;, &lt;a href="https://docs.gitbutler.com/features/branch-management/stacked-branches" rel="noopener noreferrer"&gt;GitButler&lt;/a&gt;, &lt;a href="https://docs.gitlab.com/user/project/merge_requests/reviews/stacked_merge_requests/" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt; e outros vêm oferecendo suporte há anos. E, em julho de 2026, o GitHub finalmente &lt;a href="https://github.blog/changelog/2026-07-30-stacked-pull-requests-are-now-in-public-preview/" rel="noopener noreferrer"&gt;lançou os stacked PRs em versão prévia pública&lt;/a&gt;. Com o maior player a bordo, tudo indica que a tendência vai ganhar força.&lt;/p&gt;

&lt;p&gt;Entre a popularização dos monorepos e o impacto dos agentes de IA, a demanda por stacked PRs está crescendo não só nas grandes empresas, mas também nas pequenas e médias. Quando os stacked PRs passam a fazer parte do jeito de trabalhar de uma equipe, acertar as unidades do histórico e a ordem delas vira parte do trabalho de cada desenvolvedor. PRs em que antes cabia de tudo agora precisam ser divididos pelo papel lógico, com dependências entre eles. E o Jujutsu torna isso fácil e seguro.&lt;/p&gt;

&lt;p&gt;Pense em dividir um commit gigante em unidades com sentido. É uma tarefa difícil, até para a IA. No Git, você provavelmente faria &lt;code&gt;git reset HEAD^&lt;/code&gt; para devolver o commit inteiro à working tree e depois repetiria o ciclo de adicionar ao índice e fazer commit, pedaço por pedaço. Se você errar no meio do caminho, recuperar-se significa descobrir exatamente até onde a divisão chegou e quais edições ficaram onde, o que já é uma dor de cabeça por si só. E se o commit que você quer dividir for antigo, prepare-se para a emoção de encadear rebases com o HEAD desanexado (detached HEAD). No Jujutsu, você passa os arquivos para &lt;code&gt;jj split -m &amp;lt;description&amp;gt;&lt;/code&gt; e pronto. Se errar, desfaz e tenta de novo. Quando quem faz isso é uma IA, a divisão é por arquivo, mas uma pessoa operando o Jujutsu pode usar &lt;code&gt;jj split -i&lt;/code&gt; para dividir de forma interativa, linha a linha, ou consultar o evolution log e dividir o trabalho na ordem em que ele foi realmente feito.&lt;/p&gt;

&lt;p&gt;Transformar um branch de trabalho em uma cadeia de branches dependentes para um stacked PR dá muito trabalho no Git. No Jujutsu, basta ir colocando bookmarks, um depois do outro, em uma única linha do histórico. A documentação oficial do GitHub inclusive mostra, passo a passo, como montar a cadeia de branches de um stacked PR com o Jujutsu&lt;sup&gt;4&lt;/sup&gt;. É bom ver essa afinidade reconhecida oficialmente.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é fácil para pessoas também é fácil para a IA
&lt;/h2&gt;

&lt;p&gt;O Git foi projetado colocando as funcionalidades à frente de quem usa. O Jujutsu é um sistema de controle de versões criado para resolver os pontos fracos do Git&lt;sup&gt;5&lt;/sup&gt; e para manter a carga cognitiva das pessoas o mais baixa possível. E o que é fácil para a mente humana acaba sendo fácil para a IA também. Você nunca precisa se preocupar se uma edição já entrou no histórico, porque o estado do diretório de trabalho é o ponto atual do histórico. Um change mantém o mesmo ID não importa quantas vezes seja revisado, então ele nunca se perde durante longas rodadas de tentativa e erro. O operation log registra cada operação em ordem, então é fácil ver qual passo deu errado e restaurar a partir dali. E quando surge um conflito no meio de uma tarefa, o próprio estado em conflito é salvo no histórico, então você pode ir com calma e tentar resolvê-lo quantas vezes precisar. Cada uma dessas características é uma grande vantagem quando é a IA que está no comando.&lt;/p&gt;

&lt;p&gt;O Jujutsu não está tão integrado às ferramentas dos agentes de IA quanto o Git. Mas é muito mais fácil para esses agentes entenderem como ele funciona, o que tende a tornar o trabalho deles mais estável e seguro. Mesmo que você entregue à IA o controle de versões junto com a programação, escolher o Jujutsu para essa tarefa faz todo o sentido.&lt;/p&gt;

&lt;p&gt;Essa é a minha opinião, e também o argumento que desenvolvo no “Capítulo 1: Que tipo de ferramenta é o Jujutsu?” do meu livro, &lt;em&gt;Juju-chu! — Comece seu fluxo de trabalho Jujutsu × IA com &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;. O capítulo desenvolve esse argumento ao explorar cada funcionalidade. O “Capítulo 3: Fluxo de trabalho Jujutsu × IA na prática” é um passo a passo prático de como realmente entregar a operação do Jujutsu ao Claude Code e ao Codex.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://juju-chu.com/pt" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Fog%2Fpt%2Fdefault.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://juju-chu.com/pt" rel="noopener noreferrer" class="c-link"&gt;
            Juju-chu! — Comece seu fluxo de trabalho Jujutsu × IA com jj new
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Um guia prático para adotar Jujutsu (jj) com Claude Code e Codex: snapshots automáticos, operações que podem ser desfeitas e reescrita segura do histórico.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Ficons%2Ffavicon.ico" width="48" height="48"&gt;
          juju-chu.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Se este post despertou sua curiosidade pelo Jujutsu, dê uma olhada.&lt;/p&gt;

&lt;h2 id="footnote-label"&gt;Footnotes&lt;/h2&gt;

&lt;ol&gt;
&lt;li id="user-content-fn-save-timing"&gt;
&lt;p&gt;Para ser exata, sempre que qualquer comando &lt;code&gt;jj&lt;/code&gt; é executado, o Jujutsu compara a cópia de trabalho com o estado mais recente do histórico. Se houver diferenças, ele tira um snapshot e o change ganha uma nova revisão. Se você usa uma interface gráfica do Jujutsu, ela normalmente tira um snapshot automaticamente sempre que você consulta o histórico nela. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-no-desc"&gt;
&lt;p&gt;Um detalhe: um change sem descrição não pode ser enviado ao remoto com push. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-agent-config"&gt;
&lt;p&gt;Veja &lt;a href="https://juju-chu.com/pt/agent-config" rel="noopener noreferrer"&gt;Faça seu agente de programação usar Jujutsu em vez de Git&lt;/a&gt;. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-gh-stack-jj"&gt;
&lt;p&gt;&lt;a href="https://docs.github.com/pt/pull-requests/reference/use-other-tools-with-stacked-pull-requests" rel="noopener noreferrer"&gt;Usar outras ferramentas com solicitações de pull empilhadas - Documentos do GitHub&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-solve-pain"&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ulJ_Pw8qqsE" rel="noopener noreferrer"&gt;Solving Git’s Pain Points with Jujutsu (with Martin von Zweigbergk) - YouTube&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>jujutsu</category>
      <category>productivity</category>
      <category>braziliandevs</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Why I Still Choose Jujutsu When AI Can Handle Git</title>
      <dc:creator>Yuka Ooka</dc:creator>
      <pubDate>Tue, 06 Oct 2026 12:00:00 +0000</pubDate>
      <link>https://dev.to/oukayuka/why-i-still-choose-jujutsu-when-ai-can-handle-git-4na9</link>
      <guid>https://dev.to/oukayuka/why-i-still-choose-jujutsu-when-ai-can-handle-git-4na9</guid>
      <description>&lt;p&gt;&lt;strong&gt;“If an AI agent handles Git for you, why bother learning another version control system like &lt;a href="https://www.jj-vcs.dev/" rel="noopener noreferrer"&gt;Jujutsu&lt;/a&gt;?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That was the most common pushback on my last post, &lt;a href="https://dev.to/oukayuka/15-years-of-git-then-jujutsu-why-i-cant-go-back-2o6n"&gt;15 Years of Git, Then Jujutsu: Why I Can’t Go Back&lt;/a&gt;. It’s a fair question and an interesting one, so this post is my answer.&lt;/p&gt;

&lt;p&gt;I agree that day-to-day version control is a job for an AI agent. That’s exactly how I work. The difference is that the commands my agents run are Jujutsu commands, not Git commands. Having done it both ways, I’m convinced that even when AI does the driving, Jujutsu makes for a much better developer experience, and that the time you spend learning it pays for itself quickly.&lt;/p&gt;

&lt;p&gt;Before I make my case, there’s an obvious question to get out of the way: can AI actually handle Jujutsu? I checked with Opus, GPT, Gemini and others. The latest models already know Jujutsu’s core concepts and main commands out of the box, and they can handle everyday operations without loading any extra skills. That said, Jujutsu doesn’t get the first-class support Git does, so you need some configuration to stop the agent from drifting back to Git and to teach it a workflow that suits Jujutsu. &lt;a href="https://juju-chu.com/agent-config" rel="noopener noreferrer"&gt;Here’s the setup I use&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Git’s Commit Ceremony vs. Jujutsu’s Frictionless Changes
&lt;/h2&gt;

&lt;p&gt;In Git, the basic unit of history is the &lt;strong&gt;commit&lt;/strong&gt;. The standard workflow goes like this: you edit files in the working tree, pick the ones you want and add them to the index, then write a message and create a commit. Only then does anything land in history. A commit is meant to be a finished product, something you craft with care, which is why Git gives you the index as a staging area. Getting from an edited file to recorded history takes a long, rigid sequence of steps. It’s almost a ritual.&lt;/p&gt;

&lt;p&gt;So even when you hand Git over to an AI, you still end every task by asking it to &lt;strong&gt;“commit this.”&lt;/strong&gt; Ask for any history operation mid-task and you get the familiar back-and-forth: &lt;strong&gt;“You have uncommitted changes. Should I stash them, or commit first?”&lt;/strong&gt; Each round may only take half a minute or so, but it happens constantly, and it adds up. There’s a cognitive cost too, paid by both you and the AI whether you notice it or not.&lt;/p&gt;

&lt;p&gt;In Jujutsu, the basic unit of history is the &lt;strong&gt;change&lt;/strong&gt;. When you initialize a repository, you start out in an empty change. Every edit you make there is saved as a new revision of that change as you go&lt;sup&gt;1&lt;/sup&gt;. You can add a description, Jujutsu’s equivalent of a commit message, whenever you like. A change never has a moment where it’s officially “done”&lt;sup&gt;2&lt;/sup&gt;. When you finish the work, you simply move on.&lt;/p&gt;

&lt;p&gt;That means when an AI handles Jujutsu for you, all it takes is one standing instruction to start each task in a new change with a description&lt;sup&gt;3&lt;/sup&gt;. After that you just say “build feature X,” and your history gets split into sensible units that follow the flow of the work. No more “commit this” at the end of every task, and no more being asked to tidy up your working copy before a history operation.&lt;/p&gt;

&lt;p&gt;Jujutsu is compatible with Git, but there’s no index between your working directory and your local repository. On top of that, the state of your working directory &lt;em&gt;is&lt;/em&gt; the current point in history (Jujutsu calls this “working copy as a commit”). In Git, humans and AI alike have to track &lt;strong&gt;three states&lt;/strong&gt; for every change to a file. In Jujutsu, there’s normally &lt;strong&gt;just one&lt;/strong&gt;. Only after switching did I realize how much extra mental effort I’d been spending to fit Git’s way of doing things, and how stressful all that bookkeeping had been.&lt;/p&gt;

&lt;p&gt;Some of you will say this doesn’t bother you at all. Fair enough. Plenty of people genuinely don’t mind putting on a suit and getting to the office by 8:30 every morning. But imagine moving from that to a job with no dress code, flexible hours and remote work up to three days a week, and finding it so comfortable you could never go back. That’s what the switch felt like.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jujutsu Makes AI Mistakes Easy to Undo
&lt;/h2&gt;

&lt;p&gt;Humans make mistakes, and so does AI. I still see the occasional report of an AI agent deleting files someone was working on, with no way to get them back. Ask an agent to resolve a conflict and it’s not unusual to get a result that passes the tests but is semantically broken. And since you instruct agents in natural language, a prompt doesn’t always get your intent across, so you’ll often be unhappy with what comes back.&lt;/p&gt;

&lt;p&gt;When the AI is running Git commands as part of its work, recovering from a bad result gets dramatically harder. Git has no way to roll the entire repository back to how it was before a given operation. As I mentioned, Git keeps state in several places: the working tree, the index, the stash and commits, and each one is protected in its own way, if at all. Rebase, amend and squash don’t modify existing commits. They create new ones and repoint the branch, so the originals are no longer referenced by any branch. They’re still in the reflog, but finding the right entry after the fact, buried among everything else, is a real chore.&lt;/p&gt;

&lt;p&gt;To make up for Git not saving uncommitted changes, Claude Code offers a &lt;code&gt;/rewind&lt;/code&gt; command that rolls the code back to an earlier point along with the conversation. But it doesn’t mix well with an agent that runs Git commands. Your files go back, but Git’s state doesn’t, so &lt;code&gt;git status&lt;/code&gt; suddenly shows a pile of changes you never intended, and you’re back to cleaning up history. Anything changed by shell commands, by you, or by other agents running in parallel doesn’t get rolled back at all.&lt;/p&gt;

&lt;p&gt;If you catch a mistake right away, you’re in decent shape. More often, though, it surfaces later, when you run the tests after more work or when you review things days afterward. By then it’s much harder to untangle. More operations have piled up on top of the bad one, and even if you go all in on the reflog, there’s no guarantee that a long series of delicate steps will actually fix things. Worse, Git gives you no way to undo a recovery attempt itself. An AI trying fix after fix to dig itself out can easily make things worse.&lt;/p&gt;

&lt;p&gt;Jujutsu takes care of almost all of this. As a rule, the result of any &lt;code&gt;jj&lt;/code&gt; command can be rolled back with &lt;code&gt;jj undo&lt;/code&gt;, and the undo itself can be reversed with &lt;code&gt;jj redo&lt;/code&gt;. That’s possible because Jujutsu keeps a record of every operation that changes the repository, the &lt;strong&gt;operation log&lt;/strong&gt; , separate from the regular log. Each entry in the operation log is tied to a snapshot of the repository as it stood when that operation finished. You can restore the files to that state, or reverse just the effect of that one operation while keeping everything that came after it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcasjsavrt5w9v9w4j1dm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcasjsavrt5w9v9w4j1dm.png" alt="Jujutsu’s operation log" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every &lt;code&gt;jj&lt;/code&gt; command an AI runs during a long session of trial and error ends up in the operation log too. When something goes wrong, you can look over everything the AI did, pin down the cause, and go back to the state just before things went sideways.&lt;/p&gt;

&lt;p&gt;And unlike a Git commit hash, which changes every time you edit the commit, a Jujutsu change-ID stays the same no matter how many times the change is revised. You can browse a change’s revision history in the &lt;strong&gt;evolution log&lt;/strong&gt; , and with a little digging, you can trace it back and restore an earlier version’s contents. Narrow it down by timestamp or diff, and you can even recover from a botched conflict resolution from several days ago and redo it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffwwgp4filcvseq706r60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffwwgp4filcvseq706r60.png" alt="Jujutsu’s evolution log" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every edit gets saved to history as you go. The operation log and the evolution log let you find where things went wrong and go back to that point. And if the recovery itself goes wrong, &lt;code&gt;jj undo&lt;/code&gt; and &lt;code&gt;jj redo&lt;/code&gt; let you try again right away. That’s a level of safety Git simply doesn’t offer, and it’s exactly why I can hand version control to an AI more casually, and more boldly, with Jujutsu than I ever could with Git.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Clean History Matters More in the Age of AI Coding
&lt;/h2&gt;

&lt;p&gt;Another comment that stood out on my last post was &lt;strong&gt;“I don’t care about keeping a clean history, so I don’t see the point of Jujutsu.”&lt;/strong&gt; The reasoning seems to be that even if the history is a mess, you can just ask AI to dig out whatever you need. But is that really true? I’d argue the opposite: precisely because AI means we write and read less code ourselves, a clean history matters more than ever.&lt;/p&gt;

&lt;p&gt;Coding agents have improved so much that plenty of developers now barely write code themselves, and don’t read every line the AI generates either. Even so, they still guard the quality of what ships, by having an agent running a different model review the work, or by checking the critical parts, like data structure changes, themselves. If you can trace what changed, why, and what it depends on straight from the history, all of that gets faster and less error-prone. Precisely because nobody is reviewing every line, &lt;strong&gt;your commit history needs to work as a table of contents for the code&lt;/strong&gt; , so you can find the parts that matter. A string of giant commits with no clear intent forces the AI to pull irrelevant context in every time, which burns tokens and can hurt the quality of its work.&lt;/p&gt;

&lt;p&gt;At the start of each session, an agent will usually look at the most recent meaningful diffs before it looks at the working directory as a whole. Cram “a bug fix + a dependency update + some unrelated content + an unrelated refactor” into a single commit, and the agent gets confused. Line up commits of sensible size with clear intent, in an order that reflects cause and effect, and even a short prompt gives the agent the context it needs for the next task.&lt;/p&gt;

&lt;p&gt;And even if you barely read AI-generated code during development, an incident will force you to read it carefully. The first question in a production outage is “when and where did the bad code get in?” When every minute counts, a history of semantically coherent commits helps you pinpoint the problem fast.&lt;/p&gt;

&lt;p&gt;AI coding has also created a new problem as productivity has shot up: &lt;strong&gt;PRs get huge&lt;/strong&gt; → &lt;strong&gt;they get hard to review&lt;/strong&gt; → &lt;strong&gt;unmerged PRs pile up waiting for review&lt;/strong&gt;. Now even teams of just a few people are stuck in that loop. Big tech companies like Google and Meta have been dealing with this problem for more than a decade, and their answer has been to “split PRs into small units that depend on each other.” Say you’d normally submit a whole feature as one PR. Instead, you split it into “1. model layer changes,” “2. scheduled job changes,” “3. server API changes” and “4. web frontend changes,” and stack them 1 → 2 → 3 → 4. Each can be reviewed, approved and merged on its own, but a PR can only be merged once the PRs below it in the stack (for 3, that’s 1 and 2) have merged. These companies built that into their tooling and ran it as part of everyday development.&lt;/p&gt;

&lt;p&gt;Small PRs with a clear, logical role are easier on reviewers, and it’s easier to spot the ones that are yours to review. Changes to a PR branch lower in the stack propagate automatically to the branches above it, rebased by the tooling. And thanks to the dependencies, you can safely start on the next piece of work while the first PR is still waiting for review. This is what’s commonly called &lt;strong&gt;stacked diffs&lt;/strong&gt; or &lt;strong&gt;stacked PRs&lt;/strong&gt;. &lt;a href="https://graphite.com/docs/create-submit-prs" rel="noopener noreferrer"&gt;Graphite&lt;/a&gt;, &lt;a href="https://docs.gitbutler.com/features/branch-management/stacked-branches" rel="noopener noreferrer"&gt;GitButler&lt;/a&gt;, &lt;a href="https://docs.gitlab.com/user/project/merge_requests/reviews/stacked_merge_requests/" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt; and others have been rolling out support for years now. And in July 2026, GitHub finally &lt;a href="https://github.blog/changelog/2026-07-30-stacked-pull-requests-are-now-in-public-preview/" rel="noopener noreferrer"&gt;launched stacked PRs in public preview&lt;/a&gt;. With the biggest player on board, the trend looks set to pick up speed.&lt;/p&gt;

&lt;p&gt;Between monorepos becoming the norm and the impact of AI agents, demand for stacked PRs is growing not just at big companies but at small and mid-sized ones too. Once stacked PRs are part of how a team works, getting the units of history and their order right becomes part of every developer’s job. PRs you could once stuff with anything now have to be split by logical role, with dependencies between them. And Jujutsu makes that easy and safe.&lt;/p&gt;

&lt;p&gt;Take splitting a giant commit into meaningful units. It’s a hard task, even for AI. In Git, you’d probably &lt;code&gt;git reset HEAD^&lt;/code&gt; to dump the whole commit back into the working tree, then repeat the index-then-commit cycle piece by piece. Slip up along the way, and recovery means figuring out exactly how far you got with the split and which edits are left where—a headache in itself. If you’re splitting an older commit, you’re in for the thrill of repeated rebases with a detached HEAD. In Jujutsu, you pass the files to &lt;code&gt;jj split -m &amp;lt;description&amp;gt;&lt;/code&gt; and you’re done. Get it wrong, and you undo and try again. When an AI does these, the split works at the file level, but a human running Jujutsu can use &lt;code&gt;jj split -i&lt;/code&gt; to split interactively line by line, or consult the evolution log and split the work in the order it was actually done.&lt;/p&gt;

&lt;p&gt;Turning a working branch into a chain of dependent branches for a stacked PR is a real hassle in Git. In Jujutsu, you just put bookmarks, one after another, on a single line of history. GitHub’s own docs even walk through building a stacked-PR branch chain with Jujutsu&lt;sup&gt;4&lt;/sup&gt;. It’s nice to see the fit recognized officially.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Easy on Humans Is Easy on AI Too
&lt;/h2&gt;

&lt;p&gt;Git was designed with features first. Jujutsu is a version control system built to fix Git’s pain points&lt;sup&gt;5&lt;/sup&gt; and to keep the cognitive load on humans as low as possible. What’s easy on human minds turns out to be easy on AI as well. You never have to worry whether an edit has made it into history, because the state of the working directory is the current point in history. A change keeps the same ID however many times it’s revised, so it never gets lost during long rounds of trial and error. The operation log records every operation in order, so it’s easy to see which step went wrong and restore from there. And when a conflict comes up mid-task, the conflicted state itself is saved to history, so you can take your time and try resolving it as many times as you need. Every one of these is a big advantage when AI is the one at the controls.&lt;/p&gt;

&lt;p&gt;Jujutsu doesn’t get the same first-class support from AI agents that Git does. But it’s far easier for them to reason about, and that tends to make their work more stable and safer. Even if you’re handing version control to AI along with the coding, choosing Jujutsu for the job just makes sense.&lt;/p&gt;

&lt;p&gt;That’s my take, and it’s also the argument I develop in “Chapter 1: What Kind of Tool Is Jujutsu?” of my book, &lt;em&gt;Juju-chu! — Starting Your Jujutsu × AI Workflow with &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;. The chapter walks through the same argument feature by feature. “Chapter 3: Jujutsu × AI Workflow in Practice” is a hands-on walkthrough of actually handing Jujutsu over to Claude Code and Codex.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://juju-chu.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Fog%2Fen%2Fdefault.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://juju-chu.com/" rel="noopener noreferrer" class="c-link"&gt;
            Juju-chu! — Starting Your Jujutsu × AI Workflow with jj new
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A hands-on book on adopting Jujutsu (jj) with Claude Code and Codex: automatic snapshots, undoable operations, and safe history rewriting.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Ficons%2Ffavicon.ico" width="48" height="48"&gt;
          juju-chu.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;If this post got you curious about Jujutsu, take a look.&lt;/p&gt;

&lt;h2 id="footnote-label"&gt;Footnotes&lt;/h2&gt;

&lt;ol&gt;
&lt;li id="user-content-fn-save-timing"&gt;
&lt;p&gt;To be precise, whenever any &lt;code&gt;jj&lt;/code&gt; command runs, Jujutsu checks the working copy against the latest state in history. If they differ, it takes a snapshot and the change gets a new revision. If you use a Jujutsu UI tool, it usually takes a snapshot automatically whenever you view the history there. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-no-desc"&gt;
&lt;p&gt;One catch: a change with no description can’t be pushed to the remote. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-agent-config"&gt;
&lt;p&gt;See &lt;a href="https://juju-chu.com/agent-config" rel="noopener noreferrer"&gt;Make Your Coding Agent Use Jujutsu Instead of Git&lt;/a&gt;. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-gh-stack-jj"&gt;
&lt;p&gt;&lt;a href="https://docs.github.com/en/pull-requests/reference/use-other-tools-with-stacked-pull-requests" rel="noopener noreferrer"&gt;Use other tools with stacked pull requests - GitHub Docs&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-solve-pain"&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ulJ_Pw8qqsE" rel="noopener noreferrer"&gt;Solving Git’s Pain Points with Jujutsu (with Martin von Zweigbergk) - YouTube&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>jujutsu</category>
      <category>git</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Por qué sigo eligiendo Jujutsu aunque la IA pueda encargarse de Git</title>
      <dc:creator>Yuka Ooka</dc:creator>
      <pubDate>Tue, 06 Oct 2026 12:00:00 +0000</pubDate>
      <link>https://dev.to/jujuchu-es/por-que-sigo-eligiendo-jujutsu-aunque-la-ia-pueda-encargarse-de-git-1844</link>
      <guid>https://dev.to/jujuchu-es/por-que-sigo-eligiendo-jujutsu-aunque-la-ia-pueda-encargarse-de-git-1844</guid>
      <description>&lt;p&gt;&lt;strong&gt;«Si un agente de IA ya se encarga de Git, ¿para qué aprender otro sistema de control de versiones como &lt;a href="https://www.jj-vcs.dev/" rel="noopener noreferrer"&gt;Jujutsu&lt;/a&gt;?»&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esa fue la objeción más repetida a mi último artículo, &lt;a href="https://dev.to/jujuchu-es/15-anos-de-git-y-luego-jujutsu-por-que-ya-no-puedo-volver-4jjm"&gt;15 años de Git y luego Jujutsu: por qué ya no puedo volver&lt;/a&gt;. Es una pregunta razonable y, además, interesante, así que este artículo es mi respuesta.&lt;/p&gt;

&lt;p&gt;Estoy de acuerdo en que el control de versiones del día a día es trabajo para un agente de IA. Así es exactamente como trabajo yo. La diferencia es que los comandos que ejecutan mis agentes son de Jujutsu, no de Git. Después de probar las dos cosas, estoy convencida de que, incluso cuando la IA va al volante, Jujutsu ofrece una experiencia de desarrollo mucho mejor, y de que el tiempo que inviertes en aprenderlo se recupera enseguida.&lt;/p&gt;

&lt;p&gt;Antes de exponer mis argumentos, conviene despejar una duda evidente: ¿de verdad la IA sabe manejar Jujutsu? Lo comprobé con Opus, GPT, Gemini y otros. Los modelos más recientes ya conocen los conceptos básicos y los comandos principales de Jujutsu, y pueden encargarse de las operaciones cotidianas sin cargar ningún skill adicional. Eso sí, Jujutsu no está tan integrado en las herramientas de los agentes como Git, así que hace falta algo de configuración para evitar que el agente vuelva a Git sin avisar y para enseñarle un flujo de trabajo adecuado para Jujutsu. &lt;a href="https://juju-chu.com/es/agent-config" rel="noopener noreferrer"&gt;Esta es la configuración que uso yo&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  La ceremonia del commit en Git frente a los changes sin fricción de Jujutsu
&lt;/h2&gt;

&lt;p&gt;En Git, la unidad básica del historial es el &lt;strong&gt;commit&lt;/strong&gt;. El flujo estándar es este: editas archivos en el working tree, eliges los que quieres y los añades al índice, y después escribes un mensaje y creas un commit. Solo entonces queda algo registrado en el historial. Un commit está pensado para ser un producto terminado, algo que se elabora con cuidado, y por eso Git te ofrece el índice como área de staging. Editar un archivo y lograr que esos cambios queden registrados en el historial exige una secuencia de pasos larga y rígida. Es casi un ritual.&lt;/p&gt;

&lt;p&gt;Así que, aunque le cedas Git a una IA, sigues terminando cada tarea pidiéndole &lt;strong&gt;«haz commit de esto»&lt;/strong&gt;. Pide cualquier operación sobre el historial a mitad de una tarea y llega el intercambio de siempre: &lt;strong&gt;«Tienes cambios sin commit. ¿Los guardo en el stash o hago commit primero?»&lt;/strong&gt;. Cada ronda quizá solo lleve medio minuto, pero ocurre constantemente y todo suma. También hay un costo cognitivo, que pagan tanto tú como la IA, lo notes o no.&lt;/p&gt;

&lt;p&gt;En Jujutsu, la unidad básica del historial es el &lt;strong&gt;change&lt;/strong&gt;. Cuando inicializas un repositorio, empiezas en un change vacío. Cada edición que haces ahí se guarda sobre la marcha como una nueva revisión de ese change&lt;sup&gt;1&lt;/sup&gt;. Puedes añadirle una descripción, el equivalente en Jujutsu a un mensaje de commit, cuando quieras. Un change nunca tiene un momento en que quede oficialmente «terminado»&lt;sup&gt;2&lt;/sup&gt;. Cuando acabas el trabajo, simplemente pasas a otra cosa.&lt;/p&gt;

&lt;p&gt;Eso significa que, cuando una IA maneja Jujutsu por ti, basta con una instrucción permanente: empezar cada tarea en un change nuevo con su descripción&lt;sup&gt;3&lt;/sup&gt;. A partir de ahí solo tienes que decir «crea la funcionalidad X», y tu historial queda dividido en unidades razonables que siguen el hilo del trabajo. Se acabó el «haz commit de esto» al final de cada tarea, y se acabó que te pidan ordenar la copia de trabajo antes de una operación sobre el historial.&lt;/p&gt;

&lt;p&gt;Jujutsu es compatible con Git, pero no hay ningún índice entre tu directorio de trabajo y tu repositorio local. Es más, el estado de tu directorio de trabajo &lt;em&gt;es&lt;/em&gt; el punto actual del historial (Jujutsu lo llama «working copy as a commit», la copia de trabajo como commit). En Git, tanto las personas como la IA tienen que seguir la pista de &lt;strong&gt;tres estados&lt;/strong&gt; por cada cambio en un archivo. En Jujutsu, normalmente hay &lt;strong&gt;solo uno&lt;/strong&gt;. Solo después de pasarme a Jujutsu me di cuenta de cuánto esfuerzo mental extra gastaba en ajustarme a la forma de hacer las cosas de Git, y de lo estresante que era todo ese llevar la cuenta.&lt;/p&gt;

&lt;p&gt;Habrá quien diga que esto no le molesta en absoluto. Me parece bien. Hay mucha gente a la que de verdad no le importa ponerse traje y estar en la oficina a las 8:30 cada mañana. Pero imagina pasar de eso a un trabajo sin código de vestimenta, con horario flexible y trabajo remoto hasta tres días por semana, y encontrarlo tan cómodo que ya no podrías volver atrás. Eso es lo que sentí con el cambio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jujutsu hace que los errores de la IA sean fáciles de deshacer
&lt;/h2&gt;

&lt;p&gt;Las personas cometemos errores, y la IA también. Todavía veo de vez en cuando casos de agentes de IA que borran archivos con los que alguien estaba trabajando, sin forma de recuperarlos. Pídele a un agente que resuelva un conflicto y no es raro recibir un resultado que pasa los tests pero está roto a nivel semántico. Y como a los agentes se les dan instrucciones en lenguaje natural, un prompt no siempre transmite bien tu intención, así que a menudo no te convencerá lo que recibes.&lt;/p&gt;

&lt;p&gt;Cuando la IA ejecuta comandos de Git como parte de su trabajo, recuperarse de un mal resultado se vuelve muchísimo más difícil. Git no tiene forma de devolver todo el repositorio al estado en que estaba antes de una operación concreta. Como comenté, Git guarda el estado en varios sitios: el working tree, el índice, el stash y los commits, y cada uno está protegido a su manera, si es que lo está. Rebase, amend y squash no modifican los commits existentes. Crean otros nuevos y mueven la rama hacia ellos, de modo que los commits originales ya no están referenciados por ninguna rama. Siguen en el reflog, pero encontrar la entrada correcta después, enterrada entre todo lo demás, es un verdadero dolor de cabeza.&lt;/p&gt;

&lt;p&gt;Para compensar que Git no guarda los cambios sin commit, Claude Code ofrece el comando &lt;code&gt;/rewind&lt;/code&gt;, que devuelve el código a un punto anterior junto con la conversación. Pero no se lleva bien con un agente que ejecuta comandos de Git. Tus archivos vuelven atrás, pero el estado de Git no, así que de repente &lt;code&gt;git status&lt;/code&gt; muestra un montón de cambios que nunca quisiste, y otra vez te toca poner orden en el historial. Y lo que se haya cambiado con comandos de shell, a mano o mediante otros agentes que se ejecutan en paralelo no se revierte en absoluto.&lt;/p&gt;

&lt;p&gt;Si detectas un error en el momento, todavía vas bien. Pero lo más habitual es que salga a la luz más tarde, cuando ejecutas los tests después de seguir trabajando o cuando revisas las cosas días después. Para entonces es mucho más difícil desenredarlo. Se han acumulado más operaciones encima de la errónea y, aunque te emplees a fondo con el reflog, nada garantiza que una larga serie de pasos delicados vaya a arreglarlo. Peor aún, Git no te da ninguna forma de deshacer el propio intento de recuperación. Una IA que prueba un arreglo tras otro para salir del agujero puede empeorar las cosas con facilidad.&lt;/p&gt;

&lt;p&gt;Jujutsu resuelve casi todo esto. Por regla general, el resultado de cualquier comando &lt;code&gt;jj&lt;/code&gt; se puede revertir con &lt;code&gt;jj undo&lt;/code&gt;, y el propio undo se puede deshacer con &lt;code&gt;jj redo&lt;/code&gt;. Esto es posible porque Jujutsu lleva, aparte del log normal, un registro de cada operación que modifica el repositorio: el &lt;strong&gt;operation log&lt;/strong&gt;. Cada entrada del operation log está ligada a una instantánea del repositorio tal como quedó al terminar esa operación. Puedes restaurar los archivos a ese estado, o revertir solo el efecto de esa operación conservando todo lo que vino después.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcasjsavrt5w9v9w4j1dm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcasjsavrt5w9v9w4j1dm.png" alt="El operation log de Jujutsu" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cada comando &lt;code&gt;jj&lt;/code&gt; que ejecuta una IA durante una larga sesión de ensayo y error también queda en el operation log. Cuando algo sale mal, puedes repasar todo lo que hizo la IA, localizar la causa y volver al estado justo anterior a que las cosas se torcieran.&lt;/p&gt;

&lt;p&gt;Además, a diferencia del hash de un commit de Git, que cambia cada vez que editas el commit, el change ID de Jujutsu se mantiene igual por muchas veces que se revise el change. Puedes consultar el historial de revisiones de un change en el &lt;strong&gt;evolution log&lt;/strong&gt; y, con un poco de trabajo, seguirle la pista hacia atrás y restaurar el contenido de una versión anterior. Si lo acotas por fecha y hora o por diff, puedes incluso recuperarte de una resolución de conflictos fallida de hace varios días y volver a hacerla.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffwwgp4filcvseq706r60.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffwwgp4filcvseq706r60.png" alt="El evolution log de Jujutsu" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cada edición se guarda en el historial sobre la marcha. El operation log y el evolution log te permiten encontrar dónde se torcieron las cosas y volver a ese punto. Y si la propia recuperación sale mal, &lt;code&gt;jj undo&lt;/code&gt; y &lt;code&gt;jj redo&lt;/code&gt; te dejan intentarlo de nuevo al momento. Es un nivel de seguridad que Git sencillamente no ofrece. Por eso, con Jujutsu me siento mucho más cómoda delegando el control de versiones a una IA y dejando que actúe con más audacia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué un historial limpio importa más en la era de la programación con IA
&lt;/h2&gt;

&lt;p&gt;Otro comentario que destacó en mi último artículo fue &lt;strong&gt;«no me importa mantener el historial limpio, así que no le veo sentido a Jujutsu»&lt;/strong&gt;. El razonamiento parece ser que, aunque el historial sea un desastre, basta con pedirle a la IA que encuentre lo que necesites. Pero ¿es realmente así? Yo diría que es al revés: precisamente porque con la IA escribimos y leemos menos código, un historial limpio importa más que nunca.&lt;/p&gt;

&lt;p&gt;Los agentes de programación han mejorado tanto que muchos desarrolladores ya apenas escriben código y tampoco leen cada línea que genera la IA. Aun así, siguen velando por la calidad de lo que se publica, ya sea haciendo que un agente con otro modelo revise el trabajo o revisando por su cuenta las partes críticas, como los cambios en las estructuras de datos. Si puedes rastrear directamente en el historial qué cambió, por qué y de qué depende, todo eso se hace más rápido y con menos errores. Precisamente porque nadie revisa cada línea, &lt;strong&gt;tu historial de commits tiene que funcionar como el índice del código&lt;/strong&gt; , para que puedas encontrar las partes que importan. Una sucesión de commits gigantes sin una intención clara obliga a la IA a cargar contexto irrelevante cada vez, lo que consume tokens y puede perjudicar la calidad de su trabajo.&lt;/p&gt;

&lt;p&gt;Al empezar cada sesión, lo normal es que un agente mire los diffs significativos más recientes antes que el directorio de trabajo en su conjunto. Mete «una corrección de bug + una actualización de dependencias + contenido sin relación + una refactorización que no viene a cuento» en un solo commit, y el agente se confunde. Ordena commits de tamaño razonable y con una intención clara, en una secuencia que refleje la relación de causa y efecto, y hasta un prompt corto le dará al agente el contexto que necesita para la siguiente tarea.&lt;/p&gt;

&lt;p&gt;Y aunque durante el desarrollo apenas leas el código que genera la IA, un incidente te obligará a leerlo con atención. La primera pregunta ante una caída en producción es «¿cuándo y dónde entró el código problemático?». Cuando cada minuto cuenta, un historial de commits semánticamente coherentes te ayuda a localizar el problema rápido.&lt;/p&gt;

&lt;p&gt;La programación con IA también ha creado un problema nuevo al disparar la productividad: &lt;strong&gt;los PR se vuelven enormes&lt;/strong&gt; → &lt;strong&gt;cuesta revisarlos&lt;/strong&gt; → &lt;strong&gt;los PR sin fusionar se acumulan esperando revisión&lt;/strong&gt;. Ahora incluso equipos de unas pocas personas caen en ese círculo. Grandes tecnológicas como Google y Meta llevan más de una década lidiando con este problema, y su respuesta ha sido «dividir los PR en unidades pequeñas que dependen unas de otras». Supón que normalmente enviarías una funcionalidad entera como un solo PR. En su lugar, la divides en «1. cambios en la capa de modelo», «2. cambios en las tareas programadas», «3. cambios en la API del servidor» y «4. cambios en el frontend web», y los apilas 1 → 2 → 3 → 4. Cada uno se puede revisar, aprobar y fusionar por separado, pero un PR solo se puede fusionar cuando ya se han fusionado los que tiene debajo en la pila (para el 3, el 1 y el 2). Estas empresas lo integraron en sus herramientas y lo usaban en el desarrollo del día a día.&lt;/p&gt;

&lt;p&gt;Los PR pequeños y con un papel lógico claro les ponen las cosas más fáciles a los revisores, y es más fácil identificar los que te toca revisar. Los cambios en la rama de un PR situado más abajo en la pila se propagan automáticamente a las ramas de encima, a las que las herramientas aplican el rebase. Y gracias a las dependencias, puedes empezar con seguridad la siguiente parte del trabajo mientras el primer PR sigue esperando revisión. Esto es lo que se suele llamar &lt;strong&gt;stacked diffs&lt;/strong&gt; o &lt;strong&gt;stacked PRs&lt;/strong&gt;. &lt;a href="https://graphite.com/docs/create-submit-prs" rel="noopener noreferrer"&gt;Graphite&lt;/a&gt;, &lt;a href="https://docs.gitbutler.com/features/branch-management/stacked-branches" rel="noopener noreferrer"&gt;GitButler&lt;/a&gt;, &lt;a href="https://docs.gitlab.com/user/project/merge_requests/reviews/stacked_merge_requests/" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt; y otros llevan años incorporándolo. Y en julio de 2026, GitHub por fin &lt;a href="https://github.blog/changelog/2026-07-30-stacked-pull-requests-are-now-in-public-preview/" rel="noopener noreferrer"&gt;lanzó los stacked PRs en vista previa pública&lt;/a&gt;. Con el actor principal ya a bordo, todo apunta a que la tendencia va a acelerarse.&lt;/p&gt;

&lt;p&gt;Con la generalización de los monorepos y el impacto de los agentes de IA, la demanda de stacked PRs está creciendo no solo en las grandes empresas, sino también en las pequeñas y medianas. Cuando los stacked PRs forman parte de la forma de trabajar de un equipo, organizar bien las unidades del historial y su orden pasa a ser parte del trabajo de cada desarrollador. Los PR en los que antes cabía cualquier cosa, ahora hay que dividirlos según su papel lógico, con dependencias entre ellos. Y Jujutsu hace que eso sea fácil y seguro.&lt;/p&gt;

&lt;p&gt;Pensemos en dividir un commit gigante en unidades con sentido. Es una tarea difícil, incluso para la IA. En Git, probablemente harías &lt;code&gt;git reset HEAD^&lt;/code&gt; para devolver todo el commit al working tree y luego repetirías el ciclo de añadir al índice y hacer commit, parte por parte. Si te equivocas por el camino, recuperarte implica averiguar exactamente hasta dónde llegaste con la división y qué ediciones quedaron dónde, lo que ya es un dolor de cabeza en sí mismo. Y si el commit que quieres dividir es antiguo, te espera la emoción de encadenar rebases con un HEAD desacoplado (detached HEAD). En Jujutsu, le pasas los archivos a &lt;code&gt;jj split -m &amp;lt;description&amp;gt;&lt;/code&gt; y listo. Si te equivocas, deshaces y vuelves a intentarlo. Cuando lo hace una IA, la división es a nivel de archivo, pero una persona que maneje Jujutsu puede usar &lt;code&gt;jj split -i&lt;/code&gt; para dividir de forma interactiva línea a línea, o consultar el evolution log y dividir el trabajo en el orden en que realmente se hizo.&lt;/p&gt;

&lt;p&gt;Convertir una rama de trabajo en una cadena de ramas dependientes para un stacked PR es bastante complicado en Git. En Jujutsu, basta con ir poniendo bookmarks, uno tras otro, sobre una sola línea del historial. La documentación oficial de GitHub incluso explica paso a paso cómo crear la cadena de ramas de un stacked PR con Jujutsu&lt;sup&gt;4&lt;/sup&gt;. Es genial ver esa compatibilidad reconocida oficialmente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que es fácil para las personas también lo es para la IA
&lt;/h2&gt;

&lt;p&gt;Git se diseñó poniendo las funcionalidades por delante de quien las usa. Jujutsu es un sistema de control de versiones creado para resolver los puntos débiles de Git&lt;sup&gt;5&lt;/sup&gt; y para reducir al mínimo la carga cognitiva de las personas. Y lo que le resulta fácil a la mente humana también le resulta fácil a la IA. Nunca tienes que preocuparte de si una edición ha llegado al historial, porque el estado del directorio de trabajo es el punto actual del historial. Un change conserva el mismo ID por muchas veces que se revise, así que nunca se pierde durante largas rondas de ensayo y error. El operation log registra cada operación en orden, así que es fácil ver qué paso salió mal y restaurar desde ahí. Y cuando surge un conflicto a mitad de una tarea, el propio estado en conflicto se guarda en el historial, así que puedes tomarte tu tiempo e intentar resolverlo tantas veces como haga falta. Cada una de estas características es una gran ventaja cuando es la IA quien está a los mandos.&lt;/p&gt;

&lt;p&gt;Jujutsu no está tan integrado en las herramientas de los agentes de IA como Git. Pero les resulta mucho más fácil de entender, y eso tiende a hacer su trabajo más estable y seguro. Aunque le cedas a la IA el control de versiones junto con la programación, elegir Jujutsu para esa tarea tiene todo el sentido.&lt;/p&gt;

&lt;p&gt;Esa es mi opinión, y también el argumento que desarrollo en el «Capítulo 1: ¿Qué clase de herramienta es Jujutsu?» de mi libro, &lt;em&gt;Juju-chu! —Comienza tu flujo de trabajo Jujutsu × IA con &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;. Ese capítulo recorre el mismo argumento funcionalidad por funcionalidad. El «Capítulo 3: El flujo Jujutsu × IA en la práctica» es una guía práctica para cederles de verdad el manejo de Jujutsu a Claude Code y Codex.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://juju-chu.com/es" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Fog%2Fes%2Fdefault.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://juju-chu.com/es" rel="noopener noreferrer" class="c-link"&gt;
            Juju-chu! —Comienza tu flujo de trabajo Jujutsu × IA con jj new
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Una guía práctica para adoptar Jujutsu (jj) junto a Claude Code y Codex: snapshots automáticos, operaciones que siempre se pueden deshacer y una reescritura del historial que es segura.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Ficons%2Ffavicon.ico" width="48" height="48"&gt;
          juju-chu.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Si este artículo despertó tu curiosidad por Jujutsu, échale un vistazo.&lt;/p&gt;

&lt;h2 id="footnote-label"&gt;Footnotes&lt;/h2&gt;

&lt;ol&gt;
&lt;li id="user-content-fn-save-timing"&gt;
&lt;p&gt;Para ser exactos, cada vez que se ejecuta cualquier comando &lt;code&gt;jj&lt;/code&gt;, Jujutsu compara la copia de trabajo con el último estado del historial. Si hay diferencias, toma una instantánea y el change recibe una nueva revisión. Si usas una interfaz gráfica de Jujutsu, normalmente toma una instantánea automáticamente cada vez que consultas el historial en ella. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-no-desc"&gt;
&lt;p&gt;Eso sí: un change sin descripción no se puede enviar al remoto con push. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-agent-config"&gt;
&lt;p&gt;Consulta &lt;a href="https://juju-chu.com/es/agent-config" rel="noopener noreferrer"&gt;Haz que tu agente de programación use Jujutsu en vez de Git&lt;/a&gt;. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-gh-stack-jj"&gt;
&lt;p&gt;&lt;a href="https://docs.github.com/es/pull-requests/reference/use-other-tools-with-stacked-pull-requests" rel="noopener noreferrer"&gt;Uso de otras herramientas con solicitudes de incorporación de cambios apiladas - Documentación de GitHub&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-solve-pain"&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=ulJ_Pw8qqsE" rel="noopener noreferrer"&gt;Solving Git’s Pain Points with Jujutsu (with Martin von Zweigbergk) - YouTube&lt;/a&gt; ↩&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>jujutsu</category>
      <category>ai</category>
      <category>productivity</category>
      <category>spanish</category>
    </item>
    <item>
      <title>15 Years of Git, Then Jujutsu: Why I Can’t Go Back</title>
      <dc:creator>Yuka Ooka</dc:creator>
      <pubDate>Tue, 29 Sep 2026 00:29:00 +0000</pubDate>
      <link>https://dev.to/oukayuka/15-years-of-git-then-jujutsu-why-i-cant-go-back-2o6n</link>
      <guid>https://dev.to/oukayuka/15-years-of-git-then-jujutsu-why-i-cant-go-back-2o6n</guid>
      <description>&lt;h2&gt;
  
  
  2026: The First VCS I Actually Chose
&lt;/h2&gt;

&lt;p&gt;Looking back, I never really chose a version control system (VCS). I used whatever the company I worked for had picked. Most of my earlier workplaces ran Subversion on an in-house server. Then in 2011 I joined a company that had adopted GitHub, which meant every engineer was expected to use Git. That’s when I started using Git and GitHub for real.&lt;/p&gt;

&lt;p&gt;Coming from Subversion, Git felt unintuitive and hard to use. GitHub also brought a new expectation: clean up your history so it’s easy to review. The commands for doing that were inconsistent and hard to remember, and each one carried the kind of pressure where you can’t afford to slip.&lt;/p&gt;

&lt;p&gt;Over time I went numb to it and accepted that this was just how things were. I still couldn’t remember the commands, though. Anything slightly complicated meant a trip to Google, and I steered clear of anything that might cause a conflict. Five years went by that way, then ten. Just as it looked like fifteen would pass the same way, everything changed. AI coding agents like Claude Code arrived, and almost before I knew it, AI was writing more code than humans were. A few years earlier I wouldn’t have believed it.&lt;/p&gt;

&lt;p&gt;Give an AI instructions and it writes the code in no time. With everything moving that much faster, Git’s friction-heavy add-then-commit ritual became a real bottleneck. If it worked, I’d commit it for the time being, even if I didn’t yet understand it as thoroughly as code I’d written myself. Then, inevitably, I’d want to change things later. I’d lose important changes somewhere in rebase hell, or give up and pile quick-fix commits on top until the history was a mess. This became an everyday thing.&lt;/p&gt;

&lt;p&gt;That’s when I found &lt;strong&gt;&lt;a href="https://www.jj-vcs.dev/" rel="noopener noreferrer"&gt;Jujutsu&lt;/a&gt;&lt;/strong&gt;. In Japan, a wave of introductory articles made the rounds around January 2026, and ordinary developers started to notice it. After reading a few, I figured it would pair well with AI coding and tried it on a project I was working on. Its design philosophy and commands are so different from Git’s that at first I struggled to use it. What kept me from giving up was how much simpler things felt without a staging area, and the comfort of knowing any operation could be undone. After about a month, I could use it reasonably well.&lt;/p&gt;

&lt;p&gt;Since then I’ve managed every repository with Jujutsu, and I do all my writing in it too, from blog posts and docs to book manuscripts (this post included, of course). Now that I think about it, moving from Git to Jujutsu was the first time I’d ever chosen a VCS myself. And somewhere along the way, I realized I couldn’t go back to Git. Here are the reasons, as I see them, that I have no desire to go back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reason 1: I Never Have to Wonder Whether My Work Is Saved
&lt;/h2&gt;

&lt;p&gt;Git uses a three-state model: working tree → index → local repository. To record a change in history, you first stage it with &lt;code&gt;git add&lt;/code&gt;, then run &lt;code&gt;git commit&lt;/code&gt;. In Jujutsu, the state of your working copy is itself a commit. From Jujutsu’s point of view, there’s no gap between your working directory and the current commit. Which comes with a few practical upsides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You never have to decide when to save to history&lt;/li&gt;
&lt;li&gt;You don’t need anything like &lt;code&gt;git stash&lt;/code&gt; when switching tasks&lt;/li&gt;
&lt;li&gt;You’re very unlikely to lose work in progress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keeping track of which files are unstaged or haven’t made it into a commit yet is cognitive overhead that has nothing to do with the actual development work. So is pushing and popping stashes when something unexpected interrupts you. Jujutsu brings those costs close to zero.&lt;/p&gt;

&lt;p&gt;For AI coding, with &lt;a href="https://juju-chu.com/agent-config" rel="noopener noreferrer"&gt;the right configuration&lt;/a&gt;, all you have to do is ask an agent to “build feature X.” The work lands in a single commit as it happens, and the agent finishes it off with a message like “feat: X”. In the normal flow, you don’t do any history bookkeeping at all.&lt;/p&gt;

&lt;p&gt;You also almost never hit the accident where &lt;code&gt;git reset&lt;/code&gt;, &lt;code&gt;git clean&lt;/code&gt;, or a shell command deletes files you can’t get back. I’ve had an AI agent delete files I couldn’t recover, and even now, when models are supposedly far better than they used to be, I still see reports of it now and then. Jujutsu commits the working copy as you go&lt;sup&gt;1&lt;/sup&gt;, so in most cases anything deleted by mistake can be recovered from history.&lt;/p&gt;

&lt;p&gt;If I were forced back to Git, I’d have to start thinking about saving again, and I’d always be one bad command away from losing work in progress. Just picturing it wears me out. &lt;strong&gt;Jujutsu lowers the cognitive load of version control and gives me peace of mind.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reason 2: Experimenting Is Far Cheaper
&lt;/h2&gt;

&lt;p&gt;Now that an AI agent can build whatever I ask for in moments, I do a lot more trial and error: build something, keep it if it’s good, throw it away and try again if it isn’t. Doing that in Git gets awkward fast. If you experiment in the working tree without committing, you’re stuck when you throw something away and then decide you wanted it after all. If you want it saved, you need branches, and creating, switching, merging and deleting them is enough of a chore that the whole thing suddenly feels heavy.&lt;/p&gt;

&lt;p&gt;So how does Jujutsu handle it? The basic unit of history in Jujutsu, roughly equivalent to a Git commit, is the &lt;strong&gt;change&lt;/strong&gt;. When Jujutsu detects edits in the working copy, it updates the current change automatically and keeps the earlier versions too. You just experiment inside a change. Create a new one with &lt;code&gt;jj new&lt;/code&gt; and try whatever you want. If you like the result, give it a description (roughly, a commit message). If you don’t, drop it with &lt;code&gt;jj abandon&lt;/code&gt;. If you later want it back, &lt;code&gt;jj operation revert &amp;lt;operation ID&amp;gt;&lt;/code&gt; undoes the deletion&lt;sup&gt;2&lt;/sup&gt;, and if you only just deleted it, a single &lt;code&gt;jj undo&lt;/code&gt; brings it back.&lt;/p&gt;

&lt;p&gt;Jujutsu also lets you branch off history at any point without naming anything. Just pass the parent change’s ID to &lt;code&gt;jj new&lt;/code&gt;. To compare different approaches to the same task, create several of these sibling changes and move between them with &lt;code&gt;jj edit &amp;lt;change ID&amp;gt;&lt;/code&gt;. Give the one you want to keep a description, and &lt;code&gt;jj abandon&lt;/code&gt; the rest. That’s it.&lt;/p&gt;

&lt;p&gt;Because the change, Jujutsu’s basic unit of history, doubles as a sandbox, experimenting is just part of normal workflow. No merge needed. And since you can’t tell whether an experiment will pan out when you start it, you don’t have to name it up front either.&lt;/p&gt;

&lt;p&gt;If I were forced back to Git, I’d definitely be more reluctant to experiment. I can already see myself skipping the branch because it’s a hassle, experimenting in the working tree, throwing something away, wanting it back, and kicking myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reason 3: Rewriting History Is Simple and Intuitive
&lt;/h2&gt;

&lt;p&gt;When I wrote the code myself, I knew it inside out, so my commits were solid and I rarely had to go back to them. But hardly anyone reads every line an AI generates and understands it as well as their own code before committing. So I find myself wanting to change supposedly finished commits far more often than I used to.&lt;/p&gt;

&lt;p&gt;Say you want to fold a change to &lt;code&gt;src/styles/global.css&lt;/code&gt; into the commit three back. What does that look like in Git, and in Jujutsu? There are two ways to go about it: edit the target commit directly, or make the change on top and squash it into the target commit. Here I’ll compare the first.&lt;/p&gt;

&lt;p&gt;Let’s start with Git. You can’t do this with uncommitted changes lying around, so if you have any, you first need to stash them with &lt;code&gt;git stash -u&lt;/code&gt;. Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; HEAD~4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In the editor that opens, change &lt;code&gt;pick&lt;/code&gt; to &lt;code&gt;edit&lt;/code&gt; on the target commit’s line and save.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- pick bbbbbbb Commit message for B
&lt;/span&gt;&lt;span class="gi"&gt;+ edit bbbbbbb Commit message for B
&lt;/span&gt;  pick ccccccc Commit message for C
  pick ddddddd Commit message for D
  pick eeeeeee Commit message for E
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Your working tree is now at commit B. Edit &lt;code&gt;src/styles/global.css&lt;/code&gt;, then commit it.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add src/styles/global.css
git commit &lt;span class="nt"&gt;--amend&lt;/span&gt; &lt;span class="nt"&gt;--no-edit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;But you’re not done. The commits after it still need to be replayed on top of that edit. Run &lt;code&gt;git rebase --continue&lt;/code&gt; and pray there’s no conflict. If there is, the rebase stops, and you fix the files, &lt;code&gt;git add&lt;/code&gt;, and &lt;code&gt;git rebase --continue&lt;/code&gt; again, as many times as it takes. If you lose track of what’s going on, &lt;code&gt;git rebase --abort&lt;/code&gt; sends you back to square one. It wears you out.&lt;/p&gt;

&lt;p&gt;Now the same thing in Jujutsu. &lt;code&gt;jj edit @---&lt;/code&gt; moves the working copy to the change three back. Edit &lt;code&gt;src/styles/global.css&lt;/code&gt;. Jujutsu automatically rebases the descendant changes onto it, so if there are no conflicts, you’re done. Even if a conflict comes up, the automatic rebase finishes without stopping. Just &lt;code&gt;jj edit&lt;/code&gt; your way to the conflicted change and fix it there, and the automatic rebase runs again.&lt;/p&gt;

&lt;p&gt;Fewer steps is a nice bonus, but the bigger win is that it feels far more intuitive. Go to the point in history you care about and edit the files. Jujutsu handles the rebasing on its own, so you barely notice it’s happening. In Git, for some reason, rebase is the star of the show. You start with &lt;code&gt;git rebase&lt;/code&gt; and you finish with &lt;code&gt;git rebase&lt;/code&gt;. It’s counterintuitive, and the steps in between are fiddly enough that I never did manage to memorize them.&lt;/p&gt;

&lt;p&gt;If I were forced back to Git, I’d probably avoid rewriting history whenever I could because of the hassle. Quick-fix commits would pile up, or unrelated changes would get stuffed into whatever commit was handy, and my history would get much harder to read.&lt;/p&gt;
&lt;h2&gt;
  
  
  Reason 4: I See History as a Graph, Not Just a Timeline
&lt;/h2&gt;

&lt;p&gt;Let’s start by comparing the output of each tool’s log command. The first is &lt;code&gt;git log&lt;/code&gt;, the second &lt;code&gt;jj log&lt;/code&gt;. By default Jujutsu hides most immutable changes, so I passed &lt;code&gt;-r ::&lt;/code&gt; to lift that limit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fquua0x3hwzgu3mhpt2jz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fquua0x3hwzgu3mhpt2jz.png" alt="Output of git log" width="800" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v8q1eooxrzyvsdgic1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v8q1eooxrzyvsdgic1n.png" alt="Output of jj log" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Git’s log shows what happened on your current branch, in order, in a straight line like a timeline in a history textbook. Jujutsu’s log gives you a bird’s-eye view of the whole history, draws the branching with ASCII art, and packs in more information. You take in far more at a glance.&lt;/p&gt;

&lt;p&gt;What happens when you move to a past point in history is different too. Run &lt;code&gt;git checkout &amp;lt;commit ID&amp;gt;&lt;/code&gt; in Git, and &lt;code&gt;git log&lt;/code&gt; no longer shows anything after that point. Run &lt;code&gt;jj edit &amp;lt;change ID&amp;gt;&lt;/code&gt; in Jujutsu, and the log stays as it was. Only the &lt;code&gt;@&lt;/code&gt; marker, which stands for the working-copy commit, moves to that change’s node.&lt;/p&gt;

&lt;p&gt;These differences in how the log looks and behaves say a lot about the two tools’ design philosophies. In Git, you’re generally expected to be on some named branch while you work, and you’re always being pushed to the tip of that one line of history. That may be why the default log doesn’t bother showing where you are in the overall history or what’s happening outside that timeline&lt;sup&gt;3&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Jujutsu has nothing that corresponds to Git’s named branches&lt;sup&gt;4&lt;/sup&gt;. You can move freely to any editable node in the history, regardless of which line it sits on. That’s why a graph of the overall history is so useful.&lt;/p&gt;

&lt;p&gt;A lot of what makes rewriting history easy in Jujutsu comes down to this dense, readable log. It’s like working in video editing software with a multi-track timeline in front of you. By comparison, editing history in Git feels like cutting analog film with scissors and gluing the pieces back together.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git log&lt;/code&gt; can draw an ASCII tree graph too if you pass &lt;code&gt;--graph&lt;/code&gt;, though it’s not as readable as Jujutsu’s. But seeing the graph doesn’t let you edit across branches intuitively and safely the way Jujutsu does, so even if I went back to Git, I’d hardly ever use it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Where Git Fits In Now
&lt;/h2&gt;

&lt;p&gt;It’s been over six months since I switched to Jujutsu completely, but I haven’t actually stopped using Git. Jujutsu’s storage layer is pluggable, and it can use a Git repository as its backend. When you initialize a repository with Jujutsu, by default you get a colocated workspace, with &lt;code&gt;.git/&lt;/code&gt; and &lt;code&gt;.jj/&lt;/code&gt; sitting side by side in the project root. I’m still using a Git repository. I’ve just stopped using Git’s interface to it. The &lt;code&gt;git&lt;/code&gt; command still works if you want it.&lt;/p&gt;

&lt;p&gt;Because of that compatibility, nobody around you can tell you’re using Jujutsu unless you say so. On a team using GitHub or GitLab, it’s entirely possible someone has been quietly using Jujutsu all along. Day to day, about the only times I think about Git are when I set up a repository with &lt;code&gt;jj git init&lt;/code&gt; or &lt;code&gt;jj git clone&lt;/code&gt;, and after that when I sync with the remote using &lt;code&gt;jj git fetch&lt;/code&gt; and &lt;code&gt;jj git push&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I started using Git because of GitHub, and I switched to Jujutsu when I went all in on AI coding. Now there’s no going back. After years of being trained by Git, some of Jujutsu’s ways felt odd at first. But when you look at the history of version control, it often turns out Git was the odd one, and these days Jujutsu feels more natural to me in most situations.&lt;/p&gt;

&lt;p&gt;Jujutsu is still niche, though, and it frustrates me that a tool this good isn’t better known. The catch is that it’s compatible with Git but built on a very different mental model. If you try it with a Git mindset, working from a Git-to-jj command comparison, you’ll barely notice the benefits. So I wrote &lt;strong&gt;a beginner-friendly Jujutsu guide designed so you won’t get stuck&lt;/strong&gt; , one built around switching mental models.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://juju-chu.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Fog%2Fen%2Fdefault.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://juju-chu.com/" rel="noopener noreferrer" class="c-link"&gt;
            Juju-chu! — Starting Your Jujutsu × AI Workflow with jj new
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A hands-on book on adopting Jujutsu (jj) with Claude Code and Codex: automatic snapshots, undoable operations, and safe history rewriting.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Ficons%2Ffavicon.ico" width="48" height="48"&gt;
          juju-chu.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;It’s called &lt;em&gt;Juju-chu! — Starting Your Jujutsu × AI Workflow with &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;, and with its light-novel-style cover it looks pretty playful, but the content is the real deal. It takes Jujutsu beginners step by step to the point where they can use it with confidence. If this post got you curious about Jujutsu, take a look. The page above has a sample you can read right in your browser.&lt;/p&gt;

&lt;h2 id="footnote-label"&gt;Footnotes&lt;/h2&gt;

&lt;ol&gt;
&lt;li id="user-content-fn-save-timing"&gt;
&lt;p&gt;To be precise, whenever any &lt;code&gt;jj&lt;/code&gt; command runs, Jujutsu checks for differences between the working copy and the latest state in history, and commits them if there are any. AI agents told to use Jujutsu typically check their work with &lt;code&gt;jj status&lt;/code&gt; or a similar command at natural breaks in a task, and that’s when the commit happens. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-operation-id"&gt;
&lt;p&gt;Separately from the regular log, Jujutsu keeps an operation log that records every operation performed on the repository. Each entry has an operation ID, which you can use to reverse that operation or restore the files as they were right after it. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-git-log-opt"&gt;
&lt;p&gt;This refers to the default behavior. With &lt;code&gt;--all&lt;/code&gt;, you’ll see every branch in your local repository and the commits reachable from them. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-bookmark-branch"&gt;
&lt;p&gt;Jujutsu’s bookmarks are treated as branches when working with Git, but conceptually they’re a different thing. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>jujutsu</category>
      <category>jj</category>
      <category>git</category>
    </item>
    <item>
      <title>15 años de Git y luego Jujutsu: por qué ya no puedo volver</title>
      <dc:creator>Yuka Ooka</dc:creator>
      <pubDate>Mon, 28 Sep 2026 00:37:00 +0000</pubDate>
      <link>https://dev.to/jujuchu-es/15-anos-de-git-y-luego-jujutsu-por-que-ya-no-puedo-volver-4jjm</link>
      <guid>https://dev.to/jujuchu-es/15-anos-de-git-y-luego-jujutsu-por-que-ya-no-puedo-volver-4jjm</guid>
      <description>&lt;h2&gt;
  
  
  2026: el primer VCS que elegí de verdad
&lt;/h2&gt;

&lt;p&gt;Mirando hacia atrás, nunca llegué a elegir un sistema de control de versiones (VCS). Usaba el que hubiera escogido la empresa en la que trabajaba. En la mayoría de mis trabajos anteriores se usaba Subversion en un servidor interno. Luego, en 2011, entré en una empresa que había adoptado GitHub, así que a todos los ingenieros se nos pedía usar Git. Fue entonces cuando empecé a usar Git y GitHub en serio.&lt;/p&gt;

&lt;p&gt;Viniendo de Subversion, Git me parecía poco intuitivo y difícil de usar. GitHub trajo además una nueva exigencia: dejar el historial limpio para que fuera fácil de revisar. Los comandos necesarios para ello eran incoherentes y difíciles de recordar, y cada uno venía con esa presión de saber que no te puedes permitir un error.&lt;/p&gt;

&lt;p&gt;Con el tiempo se me adormeció esa sensación y acepté que las cosas eran así. Aun así, seguía sin recordar los comandos. Cualquier cosa un poco complicada implicaba buscar en Google, y evitaba todo lo que pudiera provocar un conflicto. Así pasaron cinco años, luego diez. Justo cuando parecía que los quince pasarían igual, todo cambió. Llegaron los agentes de programación con IA como Claude Code y, casi sin darme cuenta, la IA ya escribía más código que las personas. Unos años antes no me lo habría creído.&lt;/p&gt;

&lt;p&gt;Dale instrucciones a una IA y escribirá el código en un abrir y cerrar de ojos. Con todo avanzando tan rápido, el tedioso ritual de add y commit de Git se convirtió en un verdadero cuello de botella. Si funcionaba, hacía commit de momento, aunque todavía no lo entendiera tan a fondo como el código que había escrito yo. Y luego, inevitablemente, quería cambiar cosas. Perdía cambios importantes en algún punto del infierno del rebase, o me rendía y apilaba commits de parche encima hasta dejar el historial hecho un desastre. Aquello se convirtió en el pan de cada día.&lt;/p&gt;

&lt;p&gt;Fue entonces cuando descubrí &lt;strong&gt;&lt;a href="https://www.jj-vcs.dev/" rel="noopener noreferrer"&gt;Jujutsu&lt;/a&gt;&lt;/strong&gt;. En Japón, hacia enero de 2026, circuló una oleada de artículos introductorios y la comunidad de desarrolladores en general empezó a prestarle atención. Después de leer unos cuantos, pensé que encajaría bien con la programación con IA y lo probé en un proyecto en el que estaba trabajando. Su filosofía de diseño y sus comandos son tan distintos de los de Git que al principio me costó mucho usarlo. Lo que evitó que tirara la toalla fue lo sencillo que resultaba todo sin área de staging, y la tranquilidad de saber que cualquier operación se podía deshacer. Al cabo de un mes, más o menos, ya lo manejaba razonablemente bien.&lt;/p&gt;

&lt;p&gt;Desde entonces gestiono todos mis repositorios con Jujutsu, y también escribo todo con él, desde entradas de blog y documentación hasta manuscritos de libros (este artículo incluido, por supuesto). Pensándolo bien, pasar de Git a Jujutsu fue la primera vez que elegí un VCS por mi cuenta. Y en algún momento me di cuenta de que ya no podía volver a Git. Estas son, a mi juicio, las razones por las que no tengo ningunas ganas de volver.&lt;/p&gt;

&lt;h2&gt;
  
  
  Razón 1: nunca tengo que preguntarme si mi trabajo está guardado
&lt;/h2&gt;

&lt;p&gt;Git usa un modelo de tres estados: working tree → índice → repositorio local. Para registrar un cambio en el historial, primero lo pasas a staging con &lt;code&gt;git add&lt;/code&gt; y luego ejecutas &lt;code&gt;git commit&lt;/code&gt;. En Jujutsu, el estado de tu copia de trabajo (working copy) es en sí mismo un commit. Desde el punto de vista de Jujutsu, no hay ninguna diferencia entre tu directorio de trabajo y el commit actual. Eso trae varias ventajas prácticas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nunca tienes que decidir cuándo guardar en el historial&lt;/li&gt;
&lt;li&gt;No necesitas nada parecido a &lt;code&gt;git stash&lt;/code&gt; al cambiar de tarea&lt;/li&gt;
&lt;li&gt;Es muy poco probable que pierdas el trabajo en curso&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Llevar la cuenta de qué archivos no están en staging o todavía no han entrado en un commit es una carga cognitiva que no tiene nada que ver con el trabajo de desarrollo en sí. Lo mismo ocurre con guardar y recuperar stashes cuando algo imprevisto te interrumpe. Jujutsu reduce esos costos casi a cero.&lt;/p&gt;

&lt;p&gt;En la programación con IA, con &lt;a href="https://juju-chu.com/es/agent-config" rel="noopener noreferrer"&gt;la configuración adecuada&lt;/a&gt;, basta con pedirle a un agente «crea la funcionalidad X». El trabajo va quedando en un único commit a medida que avanza, y el agente lo remata con un mensaje como «feat: X». En el flujo normal, no tienes que ocuparte del historial en absoluto.&lt;/p&gt;

&lt;p&gt;Casi nunca te pasa el accidente en el que &lt;code&gt;git reset&lt;/code&gt;, &lt;code&gt;git clean&lt;/code&gt; o un comando de shell borra archivos que ya no puedes recuperar. A mí un agente de IA me ha borrado archivos que no pude recuperar, e incluso ahora, cuando se supone que los modelos son mucho mejores que antes, sigo viendo casos así de vez en cuando. Jujutsu hace commit de la copia de trabajo sobre la marcha&lt;sup&gt;1&lt;/sup&gt;, así que en la mayoría de los casos cualquier cosa borrada por error se puede recuperar del historial.&lt;/p&gt;

&lt;p&gt;Si me viera obligada a volver a Git, tendría que volver a pensar en guardar, y siempre estaría a un comando equivocado de perder el trabajo en curso. Solo de imaginarlo me agoto. &lt;strong&gt;Jujutsu reduce la carga cognitiva del control de versiones y me da tranquilidad.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Razón 2: experimentar sale mucho más barato
&lt;/h2&gt;

&lt;p&gt;Ahora que un agente de IA puede construir en un momento lo que le pida, hago mucho más ensayo y error: construir algo, quedármelo si está bien y tirarlo y volver a empezar si no. Hacer eso en Git se complica enseguida. Si experimentas en el working tree sin hacer commit, no tienes salida cuando descartas algo y luego decides que lo querías. Si quieres conservarlo en el historial, necesitas ramas, y crearlas, cambiar entre ellas, fusionarlas y eliminarlas requiere tanto trabajo que experimentar empieza a dar pereza.&lt;/p&gt;

&lt;p&gt;¿Y cómo lo resuelve Jujutsu? La unidad básica del historial en Jujutsu, más o menos equivalente a un commit de Git, es el &lt;strong&gt;change&lt;/strong&gt;. Cuando Jujutsu detecta modificaciones en la copia de trabajo, actualiza automáticamente el change actual y conserva también las versiones anteriores. Basta con experimentar dentro de un change. Crea uno nuevo con &lt;code&gt;jj new&lt;/code&gt; y prueba lo que quieras. Si te gusta el resultado, dale una descripción (más o menos, un mensaje de commit). Si no, descártalo con &lt;code&gt;jj abandon&lt;/code&gt;. Si más adelante lo quieres recuperar, &lt;code&gt;jj operation revert &amp;lt;operation ID&amp;gt;&lt;/code&gt; deshace esa operación&lt;sup&gt;2&lt;/sup&gt;, y si acabas de borrarlo, basta un &lt;code&gt;jj undo&lt;/code&gt; para traerlo de vuelta.&lt;/p&gt;

&lt;p&gt;Jujutsu también te permite ramificar el historial desde cualquier punto sin ponerle nombre a nada. Solo tienes que pasarle a &lt;code&gt;jj new&lt;/code&gt; el ID del change padre. Para comparar distintos enfoques de la misma tarea, crea varios de estos changes hermanos y muévete entre ellos con &lt;code&gt;jj edit &amp;lt;change ID&amp;gt;&lt;/code&gt;. Ponle una descripción al que quieras conservar y haz &lt;code&gt;jj abandon&lt;/code&gt; del resto. Eso es todo.&lt;/p&gt;

&lt;p&gt;Como el change, la unidad básica del historial de Jujutsu, sirve a la vez de espacio de pruebas, experimentar forma parte del flujo de trabajo normal. No hace falta ningún merge. Y como al empezar un experimento no sabes si saldrá bien, tampoco tienes que ponerle nombre de antemano.&lt;/p&gt;

&lt;p&gt;Si me viera obligada a volver a Git, sin duda me costaría más ponerme a experimentar. Ya me veo evitando crear la rama porque resulta tedioso, experimentando en el working tree, tirando algo, queriendo recuperarlo y arrepintiéndome.&lt;/p&gt;

&lt;h2&gt;
  
  
  Razón 3: reescribir el historial es sencillo e intuitivo
&lt;/h2&gt;

&lt;p&gt;Cuando escribía el código yo misma, lo conocía al dedillo, así que mis commits eran sólidos y rara vez tenía que volver a ellos. Pero casi nadie lee cada línea que genera una IA y la entiende tan bien como su propio código antes de hacer commit. Así que ahora me encuentro queriendo cambiar commits que se suponían terminados mucho más a menudo que antes.&lt;/p&gt;

&lt;p&gt;Supón que quieres incorporar un cambio en &lt;code&gt;src/styles/global.css&lt;/code&gt; al commit de tres posiciones atrás. ¿Cómo se hace en Git y cómo en Jujutsu? Hay dos maneras de abordarlo: editar directamente el commit en cuestión, o hacer el cambio encima y fusionarlo (squash) con ese commit. Aquí compararé la primera.&lt;/p&gt;

&lt;p&gt;Empecemos por Git. No puedes hacerlo con cambios sin commit de por medio, así que, si los tienes, primero debes apartarlos con &lt;code&gt;git stash -u&lt;/code&gt;. Después:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; HEAD~4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;En el editor que se abre, cambia &lt;code&gt;pick&lt;/code&gt; por &lt;code&gt;edit&lt;/code&gt; en la línea del commit en cuestión y guarda.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- pick bbbbbbb Mensaje del commit B
&lt;/span&gt;&lt;span class="gi"&gt;+ edit bbbbbbb Mensaje del commit B
&lt;/span&gt;  pick ccccccc Mensaje del commit C
  pick ddddddd Mensaje del commit D
  pick eeeeeee Mensaje del commit E
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Tu working tree está ahora en el commit B. Edita &lt;code&gt;src/styles/global.css&lt;/code&gt; y haz commit.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add src/styles/global.css
git commit &lt;span class="nt"&gt;--amend&lt;/span&gt; &lt;span class="nt"&gt;--no-edit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Pero no has terminado. Los commits posteriores todavía tienen que volver a aplicarse encima de esa edición. Ejecuta &lt;code&gt;git rebase --continue&lt;/code&gt; y reza para que no haya conflictos. Si los hay, el rebase se detiene, y tienes que arreglar los archivos, hacer &lt;code&gt;git add&lt;/code&gt; y volver a ejecutar &lt;code&gt;git rebase --continue&lt;/code&gt;, tantas veces como haga falta. Si pierdes el hilo, &lt;code&gt;git rebase --abort&lt;/code&gt; te devuelve a la casilla de salida. Es agotador.&lt;/p&gt;

&lt;p&gt;Ahora lo mismo en Jujutsu. &lt;code&gt;jj edit @---&lt;/code&gt; mueve la copia de trabajo al change de tres posiciones atrás. Edita &lt;code&gt;src/styles/global.css&lt;/code&gt;. Jujutsu hace rebase automáticamente de los changes descendientes sobre él, así que, si no hay conflictos, has terminado. Incluso si surge un conflicto, el rebase automático termina sin detenerse. Basta con ir con &lt;code&gt;jj edit&lt;/code&gt; al change en conflicto y arreglarlo allí, y el rebase automático vuelve a ejecutarse.&lt;/p&gt;

&lt;p&gt;Que haya menos pasos es un buen extra, pero la gran ventaja es que resulta mucho más intuitivo. Vas al punto del historial que te interesa y editas los archivos. Jujutsu se encarga del rebase por su cuenta, así que apenas notas que está ocurriendo. En Git, por alguna razón, el rebase es el protagonista. Empiezas con &lt;code&gt;git rebase&lt;/code&gt; y terminas con &lt;code&gt;git rebase&lt;/code&gt;. Es contraintuitivo, y los pasos intermedios son tan complicados que nunca llegué a memorizarlos.&lt;/p&gt;

&lt;p&gt;Si me viera obligada a volver a Git, probablemente evitaría reescribir el historial siempre que pudiera, por lo complicado del proceso. Se irían acumulando commits de parche, o se colarían cambios sin relación en el primer commit que tuviera a mano, y mi historial sería mucho más difícil de leer.&lt;/p&gt;
&lt;h2&gt;
  
  
  Razón 4: veo el historial como un grafo, no solo como una línea temporal
&lt;/h2&gt;

&lt;p&gt;Empecemos comparando la salida del comando de log de cada herramienta. La primera es &lt;code&gt;git log&lt;/code&gt;; la segunda, &lt;code&gt;jj log&lt;/code&gt;. Por defecto, Jujutsu oculta la mayoría de los changes inmutables, así que pasé &lt;code&gt;-r ::&lt;/code&gt; para quitar esa limitación.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fquua0x3hwzgu3mhpt2jz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fquua0x3hwzgu3mhpt2jz.png" alt="Salida de git log" width="800" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v8q1eooxrzyvsdgic1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v8q1eooxrzyvsdgic1n.png" alt="Salida de jj log" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El log de Git muestra lo que ocurrió en tu rama actual, en orden y en línea recta, como la cronología de un libro de historia. El log de Jujutsu te da una vista panorámica de todo el historial, dibuja las ramificaciones con arte ASCII y concentra más información. De un vistazo captas muchísimo más.&lt;/p&gt;

&lt;p&gt;Lo que ocurre al moverte a un punto pasado del historial también es distinto. Ejecuta &lt;code&gt;git checkout &amp;lt;commit ID&amp;gt;&lt;/code&gt; en Git, y &lt;code&gt;git log&lt;/code&gt; deja de mostrar lo que hay después de ese punto. Ejecuta &lt;code&gt;jj edit &amp;lt;change ID&amp;gt;&lt;/code&gt; en Jujutsu, y el log se queda como estaba. Solo la marca &lt;code&gt;@&lt;/code&gt;, que representa el commit de la copia de trabajo, se mueve al nodo de ese change.&lt;/p&gt;

&lt;p&gt;Estas diferencias en el aspecto y el comportamiento del log dicen mucho de la filosofía de diseño de cada herramienta. En Git, en principio se espera que estés en alguna rama con nombre mientras trabajas, y siempre te empuja hacia la punta de esa única línea del historial. Quizá por eso el log por defecto no se molesta en mostrar dónde estás dentro del historial completo ni lo que ocurre fuera de esa línea&lt;sup&gt;3&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Jujutsu no tiene nada que corresponda a las ramas con nombre de Git&lt;sup&gt;4&lt;/sup&gt;. Puedes moverte libremente a cualquier nodo editable del historial, esté en la línea que esté. Por eso un grafo del historial completo resulta tan útil.&lt;/p&gt;

&lt;p&gt;Reescribir el historial en Jujutsu es fácil, en buena parte, gracias a este log denso y legible. Es como trabajar con un programa de edición de video con una línea de tiempo multipista delante. En comparación, editar el historial en Git se siente como cortar película analógica con tijeras y volver a pegar los trozos.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git log&lt;/code&gt; también puede dibujar un árbol en arte ASCII si le pasas &lt;code&gt;--graph&lt;/code&gt;, aunque no es tan legible como el de Jujutsu. Pero ver el grafo no te permite editar entre ramas de forma intuitiva y segura como en Jujutsu, así que, aunque volviera a Git, casi no lo usaría.&lt;/p&gt;
&lt;h2&gt;
  
  
  El lugar de Git hoy
&lt;/h2&gt;

&lt;p&gt;Hace más de seis meses que me pasé por completo a Jujutsu, pero en realidad no he dejado de usar Git. La capa de almacenamiento de Jujutsu admite distintos backends, y puede usar un repositorio Git como backend. Cuando inicializas un repositorio con Jujutsu, por defecto obtienes un colocated workspace, con &lt;code&gt;.git/&lt;/code&gt; y &lt;code&gt;.jj/&lt;/code&gt; uno al lado del otro en la raíz del proyecto. Sigo usando un repositorio Git; simplemente he dejado de usar la interfaz de Git para trabajar con él. El comando &lt;code&gt;git&lt;/code&gt; sigue funcionando si lo necesitas.&lt;/p&gt;

&lt;p&gt;Gracias a esa compatibilidad, nadie a tu alrededor sabrá que usas Jujutsu a menos que lo digas. En un equipo que use GitHub o GitLab, es perfectamente posible que alguien lleve todo este tiempo usando Jujutsu sin decir nada. En el día a día, casi las únicas veces que pienso en Git son cuando preparo un repositorio con &lt;code&gt;jj git init&lt;/code&gt; o &lt;code&gt;jj git clone&lt;/code&gt; y, a partir de ahí, cuando sincronizo con el remoto usando &lt;code&gt;jj git fetch&lt;/code&gt; y &lt;code&gt;jj git push&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Empecé a usar Git por GitHub, y me pasé a Jujutsu cuando me lancé de lleno a programar con IA. Ya no hay vuelta atrás. Después de tantos años acostumbrada a Git, algunas costumbres de Jujutsu me resultaron raras al principio. Pero si miras la historia del control de versiones, a menudo resulta que el raro era Git, y hoy Jujutsu me parece más natural en la mayoría de las situaciones.&lt;/p&gt;

&lt;p&gt;Aun así, Jujutsu sigue siendo minoritario, y me frustra que una herramienta tan buena no sea más conocida. El problema es que es compatible con Git, pero se basa en un modelo mental muy distinto. Si lo pruebas con mentalidad de Git, guiándote por una tabla de equivalencias entre comandos de Git y jj, apenas notarás las ventajas. Por eso escribí &lt;strong&gt;una guía de Jujutsu para principiantes pensada para que no te atasques&lt;/strong&gt; , centrada en ayudarte a adoptar ese nuevo modelo mental.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://juju-chu.com/es" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Fog%2Fes%2Fdefault.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://juju-chu.com/es" rel="noopener noreferrer" class="c-link"&gt;
            Juju-chu! —Comienza tu flujo de trabajo Jujutsu × IA con jj new
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Una guía práctica para adoptar Jujutsu (jj) junto a Claude Code y Codex: snapshots automáticos, operaciones que siempre se pueden deshacer y una reescritura del historial que es segura.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Ficons%2Ffavicon.ico" width="48" height="48"&gt;
          juju-chu.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Se titula &lt;em&gt;Juju-chu! —Comienza tu flujo de trabajo Jujutsu × IA con &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;. El libro tiene una portada de estilo novela ligera y un aspecto divertido, pero el contenido va en serio. Lleva paso a paso a quienes empiezan con Jujutsu hasta que pueden usarlo con confianza. Si este artículo despertó tu curiosidad por Jujutsu, échale un vistazo. En la página encontrarás una muestra que puedes leer directamente en tu navegador.&lt;/p&gt;

&lt;h2 id="footnote-label"&gt;Footnotes&lt;/h2&gt;

&lt;ol&gt;
&lt;li id="user-content-fn-save-timing"&gt;
&lt;p&gt;Para ser exactos, cada vez que se ejecuta cualquier comando &lt;code&gt;jj&lt;/code&gt;, Jujutsu comprueba si hay diferencias entre la copia de trabajo y el último estado del historial y, si las hay, hace commit. Los agentes de IA a los que se les indica usar Jujutsu suelen revisar su trabajo con &lt;code&gt;jj status&lt;/code&gt; o un comando similar en las pausas naturales de una tarea, y es en ese momento cuando se produce el commit. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-operation-id"&gt;
&lt;p&gt;Aparte del log normal, Jujutsu mantiene un registro de operaciones que recoge cada operación realizada sobre el repositorio. Cada entrada tiene un ID de operación, con el que puedes revertir esa operación o restaurar los archivos tal como estaban justo después de ella. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-git-log-opt"&gt;
&lt;p&gt;Me refiero al comportamiento por defecto. Con &lt;code&gt;--all&lt;/code&gt;, verás todas las ramas de tu repositorio local y los commits alcanzables desde ellas. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-bookmark-branch"&gt;
&lt;p&gt;Los bookmarks de Jujutsu se tratan como ramas al trabajar con Git, pero conceptualmente son otra cosa. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>spanish</category>
      <category>jujutsu</category>
      <category>jj</category>
      <category>git</category>
    </item>
    <item>
      <title>15 anos de Git e depois Jujutsu: por que não consigo mais voltar</title>
      <dc:creator>Yuka Ooka</dc:creator>
      <pubDate>Mon, 28 Sep 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/jujuchu-pt/15-anos-de-git-e-depois-jujutsu-por-que-nao-consigo-mais-voltar-14pe</link>
      <guid>https://dev.to/jujuchu-pt/15-anos-de-git-e-depois-jujutsu-por-que-nao-consigo-mais-voltar-14pe</guid>
      <description>&lt;h2&gt;
  
  
  2026: o primeiro VCS que escolhi de verdade
&lt;/h2&gt;

&lt;p&gt;Olhando para trás, eu nunca cheguei a escolher um sistema de controle de versões (VCS). Usava o que a empresa onde eu trabalhava tivesse adotado. Na maioria dos meus empregos anteriores, usava-se Subversion em um servidor interno. Até que, em 2011, entrei em uma empresa que tinha adotado o GitHub, o que significava que todos os engenheiros precisavam usar Git. Foi aí que comecei a usar Git e GitHub para valer.&lt;/p&gt;

&lt;p&gt;Vindo do Subversion, o Git me parecia pouco intuitivo e difícil de usar. O GitHub também trouxe uma nova exigência: deixar o histórico limpo para facilitar a revisão. Os comandos para isso eram inconsistentes e difíceis de memorizar, e cada um vinha com aquela pressão de saber que não dava para errar.&lt;/p&gt;

&lt;p&gt;Com o tempo, aquela frustração foi amortecendo e eu aceitei que as coisas eram assim. Mesmo assim, continuava sem conseguir memorizar os comandos. Qualquer coisa um pouco mais complicada exigia uma busca no Google, e eu evitava tudo o que pudesse causar um conflito. Assim se passaram cinco anos, depois dez. Justo quando parecia que os quinze passariam do mesmo jeito, tudo mudou. Chegaram os agentes de IA para programação, como o Claude Code, e, quase sem eu perceber, a IA já escrevia mais código do que humanos. Alguns anos antes, eu não teria acreditado.&lt;/p&gt;

&lt;p&gt;Dê instruções a uma IA e ela escreve o código num piscar de olhos. Com tudo andando tão rápido, o ritual trabalhoso de fazer add e depois commit no Git virou um verdadeiro gargalo. Se funcionava, eu fazia o commit por enquanto, mesmo sem ainda entender o código tão a fundo quanto o que eu mesma tinha escrito. E depois, inevitavelmente, queria mudar coisas. Perdia alterações importantes em algum ponto do inferno do rebase, ou desistia e empilhava commits de remendo por cima até o histórico virar uma bagunça. Isso passou a fazer parte do dia a dia.&lt;/p&gt;

&lt;p&gt;Foi então que encontrei o &lt;strong&gt;&lt;a href="https://www.jj-vcs.dev/" rel="noopener noreferrer"&gt;Jujutsu&lt;/a&gt;&lt;/strong&gt;. No Japão, por volta de janeiro de 2026, uma leva de artigos introdutórios circulou bastante, e a comunidade de desenvolvedores em geral começou a prestar atenção nele. Depois de ler alguns, achei que ele combinaria bem com a programação com IA e o experimentei em um projeto em que eu estava trabalhando. A filosofia de design e os comandos são tão diferentes dos do Git que, no começo, tive muita dificuldade para usá-lo. O que me impediu de desistir foi a simplicidade de trabalhar sem staging area e a tranquilidade de saber que qualquer operação podia ser desfeita. Depois de mais ou menos um mês, eu já conseguia usá-lo razoavelmente bem.&lt;/p&gt;

&lt;p&gt;Desde então, gerencio todos os meus repositórios com o Jujutsu, e também escrevo tudo com ele, de posts de blog e documentação a manuscritos de livros (este post incluído, claro). Pensando bem, trocar o Git pelo Jujutsu foi a primeira vez que escolhi um VCS por conta própria. E, em algum momento, percebi que não conseguia mais voltar ao Git. Estas são, na minha visão, as razões pelas quais não tenho a menor vontade de voltar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Razão 1: nunca preciso me perguntar se meu trabalho está salvo
&lt;/h2&gt;

&lt;p&gt;O Git usa um modelo de três estados: working tree → índice → repositório local. Para registrar uma alteração no histórico, primeiro você a coloca em staging com &lt;code&gt;git add&lt;/code&gt; e depois executa &lt;code&gt;git commit&lt;/code&gt;. No Jujutsu, o estado da sua cópia de trabalho (working copy) já é, em si, um commit. Do ponto de vista do Jujutsu, não existe diferença entre o seu diretório de trabalho e o commit atual. Isso traz algumas vantagens práticas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você nunca precisa decidir quando salvar no histórico&lt;/li&gt;
&lt;li&gt;Você não precisa de nada parecido com &lt;code&gt;git stash&lt;/code&gt; ao trocar de tarefa&lt;/li&gt;
&lt;li&gt;É muito improvável que você perca trabalho em andamento&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Controlar quais arquivos ainda não estão em staging ou ainda não entraram em um commit é uma carga cognitiva que não tem nada a ver com o trabalho de desenvolvimento em si. O mesmo vale para guardar e recuperar stashes quando algo inesperado interrompe você. O Jujutsu reduz esses custos a quase zero.&lt;/p&gt;

&lt;p&gt;Na programação com IA, com &lt;a href="https://juju-chu.com/pt/agent-config" rel="noopener noreferrer"&gt;a configuração certa&lt;/a&gt;, basta pedir a um agente “crie a funcionalidade X”. O trabalho vai sendo registrado em um único commit à medida que avança, e o agente o finaliza com uma mensagem como “feat: X”. No fluxo normal, você não precisa cuidar do histórico em nenhum momento.&lt;/p&gt;

&lt;p&gt;Você também quase nunca passa pela situação de ver &lt;code&gt;git reset&lt;/code&gt;, &lt;code&gt;git clean&lt;/code&gt; ou um comando do shell apagar arquivos que não dá mais para recuperar. Eu mesma já tive arquivos apagados por um agente de IA sem conseguir recuperá-los e, mesmo hoje, com modelos supostamente muito melhores do que antes, ainda vejo relatos assim de vez em quando. O Jujutsu faz commit da cópia de trabalho conforme você trabalha&lt;sup&gt;1&lt;/sup&gt;, então, na maioria dos casos, qualquer coisa apagada por engano pode ser recuperada do histórico.&lt;/p&gt;

&lt;p&gt;Se eu fosse obrigada a voltar ao Git, teria que voltar a pensar em salvar, e estaria sempre a um comando errado de perder o trabalho em andamento. Só de imaginar, já fico cansada. &lt;strong&gt;O Jujutsu reduz a carga cognitiva do controle de versões e me dá tranquilidade.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Razão 2: experimentar fica muito mais barato
&lt;/h2&gt;

&lt;p&gt;Agora que um agente de IA consegue construir em instantes o que eu pedir, faço muito mais tentativa e erro: construir algo, ficar com o resultado se estiver bom e jogar fora e recomeçar se não estiver. Fazer isso no Git logo fica complicado. Se você experimenta na working tree sem fazer commit, fica sem saída quando descarta algo e depois decide que queria aquilo. Se quiser guardar no histórico, precisa de branches, e criá-los, alternar entre eles, fazer merge e apagá-los dá tanto trabalho que experimentar começa a dar preguiça.&lt;/p&gt;

&lt;p&gt;E como o Jujutsu resolve isso? A unidade básica do histórico no Jujutsu, mais ou menos equivalente a um commit do Git, é o &lt;strong&gt;change&lt;/strong&gt;. Quando o Jujutsu detecta edições na cópia de trabalho, ele atualiza automaticamente o change atual e também guarda as versões anteriores. Basta experimentar dentro de um change. Crie um novo com &lt;code&gt;jj new&lt;/code&gt; e teste o que quiser. Se gostar do resultado, dê a ele uma descrição (mais ou menos, uma mensagem de commit). Se não gostar, descarte-o com &lt;code&gt;jj abandon&lt;/code&gt;. Se depois quiser recuperá-lo, &lt;code&gt;jj operation revert &amp;lt;operation ID&amp;gt;&lt;/code&gt; desfaz essa operação&lt;sup&gt;2&lt;/sup&gt; e, se você acabou de descartá-lo, um único &lt;code&gt;jj undo&lt;/code&gt; o traz de volta.&lt;/p&gt;

&lt;p&gt;O Jujutsu também permite criar ramificações a partir de qualquer ponto do histórico sem dar nome a nada. Basta passar o ID do change pai para &lt;code&gt;jj new&lt;/code&gt;. Para comparar abordagens diferentes para a mesma tarefa, crie vários desses changes irmãos e alterne entre eles com &lt;code&gt;jj edit &amp;lt;change ID&amp;gt;&lt;/code&gt;. Dê uma descrição ao que quiser manter e faça &lt;code&gt;jj abandon&lt;/code&gt; do resto. Só isso.&lt;/p&gt;

&lt;p&gt;Como o change, a unidade básica do histórico do Jujutsu, também serve de área de testes, experimentar passa a fazer parte do fluxo de trabalho normal. Não é preciso fazer merge. E como, ao começar um experimento, você não sabe se ele vai dar certo, também não precisa dar nome a ele de antemão.&lt;/p&gt;

&lt;p&gt;Se eu fosse obrigada a voltar ao Git, com certeza teria mais resistência a experimentar. Já me vejo deixando de criar o branch pelo trabalho que dá, experimentando na working tree, jogando algo fora, querendo recuperar e me arrependendo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Razão 3: reescrever o histórico é simples e intuitivo
&lt;/h2&gt;

&lt;p&gt;Quando eu mesma escrevia o código, eu o conhecia de trás para a frente, então meus commits eram sólidos e raramente eu precisava voltar a eles. Mas quase ninguém lê cada linha que uma IA gera e a entende tão bem quanto o próprio código antes de fazer commit. Por isso, hoje me pego querendo alterar commits supostamente prontos com muito mais frequência do que antes.&lt;/p&gt;

&lt;p&gt;Suponha que você queira incluir uma alteração em &lt;code&gt;src/styles/global.css&lt;/code&gt; no commit de três posições atrás. Como isso fica no Git e no Jujutsu? Há duas formas de fazer isso: editar diretamente o commit em questão ou fazer a alteração por cima e incorporá-la (squash) a esse commit. Aqui vou comparar a primeira.&lt;/p&gt;

&lt;p&gt;Vamos começar pelo Git. Não dá para fazer isso com alterações sem commit no caminho, então, se houver alguma, primeiro você precisa guardá-las com &lt;code&gt;git stash -u&lt;/code&gt;. Depois:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git rebase &lt;span class="nt"&gt;-i&lt;/span&gt; HEAD~4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No editor que se abre, troque &lt;code&gt;pick&lt;/code&gt; por &lt;code&gt;edit&lt;/code&gt; na linha do commit em questão e salve.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- pick bbbbbbb Mensagem do commit B
&lt;/span&gt;&lt;span class="gi"&gt;+ edit bbbbbbb Mensagem do commit B
&lt;/span&gt;  pick ccccccc Mensagem do commit C
  pick ddddddd Mensagem do commit D
  pick eeeeeee Mensagem do commit E
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora sua working tree está no commit B. Edite &lt;code&gt;src/styles/global.css&lt;/code&gt; e faça o commit.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add src/styles/global.css
git commit &lt;span class="nt"&gt;--amend&lt;/span&gt; &lt;span class="nt"&gt;--no-edit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Mas ainda não acabou. Os commits seguintes ainda precisam ser reaplicados sobre essa edição. Execute &lt;code&gt;git rebase --continue&lt;/code&gt; e reze para não haver conflito. Se houver, o rebase para, e você precisa corrigir os arquivos, fazer &lt;code&gt;git add&lt;/code&gt; e executar &lt;code&gt;git rebase --continue&lt;/code&gt; de novo, quantas vezes forem necessárias. Se você se perder no meio do caminho, &lt;code&gt;git rebase --abort&lt;/code&gt; leva você de volta à estaca zero. É cansativo.&lt;/p&gt;

&lt;p&gt;Agora, a mesma coisa no Jujutsu. &lt;code&gt;jj edit @---&lt;/code&gt; move a cópia de trabalho para o change de três posições atrás. Edite &lt;code&gt;src/styles/global.css&lt;/code&gt;. O Jujutsu faz automaticamente o rebase dos changes descendentes sobre ele, então, se não houver conflitos, pronto. Mesmo que surja um conflito, o rebase automático termina sem parar. Basta ir com &lt;code&gt;jj edit&lt;/code&gt; até o change em conflito e corrigi-lo ali, e o rebase automático é executado de novo.&lt;/p&gt;

&lt;p&gt;Ter menos passos é um bônus, mas a grande vantagem é que tudo fica muito mais intuitivo. Você vai até o ponto do histórico que interessa e edita os arquivos. O Jujutsu cuida do rebase por conta própria, então você mal percebe que ele está acontecendo. No Git, por algum motivo, o rebase é o protagonista. Você começa com &lt;code&gt;git rebase&lt;/code&gt; e termina com &lt;code&gt;git rebase&lt;/code&gt;. É contraintuitivo, e os passos intermediários são tão trabalhosos que nunca consegui memorizá-los.&lt;/p&gt;

&lt;p&gt;Se eu fosse obrigada a voltar ao Git, provavelmente evitaria reescrever o histórico sempre que pudesse, por causa do trabalho que dá. Commits de remendo se acumulariam, ou alterações sem relação acabariam enfiadas em qualquer commit que estivesse à mão, e meu histórico ficaria muito mais difícil de ler.&lt;/p&gt;
&lt;h2&gt;
  
  
  Razão 4: vejo o histórico como um grafo, não só como uma linha do tempo
&lt;/h2&gt;

&lt;p&gt;Vamos começar comparando a saída do comando de log de cada ferramenta. A primeira é do &lt;code&gt;git log&lt;/code&gt;; a segunda, do &lt;code&gt;jj log&lt;/code&gt;. Por padrão, o Jujutsu oculta a maioria dos changes imutáveis, então passei &lt;code&gt;-r ::&lt;/code&gt; para remover essa limitação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fquua0x3hwzgu3mhpt2jz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fquua0x3hwzgu3mhpt2jz.png" alt="Saída do git log" width="800" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v8q1eooxrzyvsdgic1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3v8q1eooxrzyvsdgic1n.png" alt="Saída do jj log" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O log do Git mostra o que aconteceu no seu branch atual, em ordem e em linha reta, como a cronologia de um livro de história. O log do Jujutsu oferece uma visão panorâmica de todo o histórico, desenha as ramificações com arte ASCII e concentra mais informação. Num relance, você absorve muito mais.&lt;/p&gt;

&lt;p&gt;O que acontece quando você vai para um ponto passado do histórico também é diferente. Execute &lt;code&gt;git checkout &amp;lt;commit ID&amp;gt;&lt;/code&gt; no Git, e o &lt;code&gt;git log&lt;/code&gt; deixa de mostrar o que vem depois desse ponto. Execute &lt;code&gt;jj edit &amp;lt;change ID&amp;gt;&lt;/code&gt; no Jujutsu, e o log continua como estava. Só a marca &lt;code&gt;@&lt;/code&gt;, que representa o commit da cópia de trabalho, se move para o nó desse change.&lt;/p&gt;

&lt;p&gt;Essas diferenças na aparência e no comportamento do log dizem muito sobre a filosofia de design de cada ferramenta. No Git, em princípio, espera-se que você esteja em algum branch com nome enquanto trabalha, e você está sempre sendo empurrado para a ponta dessa única linha do histórico. Talvez seja por isso que o log padrão nem se dá ao trabalho de mostrar onde você está no histórico como um todo nem o que acontece fora dessa linha&lt;sup&gt;3&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;O Jujutsu não tem nada que corresponda aos branches com nome do Git&lt;sup&gt;4&lt;/sup&gt;. Você pode ir livremente para qualquer nó editável do histórico, esteja ele na linha que estiver. É por isso que um grafo do histórico completo é tão útil.&lt;/p&gt;

&lt;p&gt;Reescrever o histórico no Jujutsu é fácil, em boa parte, graças a esse log denso e legível. É como trabalhar em um programa de edição de vídeo com uma linha do tempo de várias trilhas à sua frente. Em comparação, editar o histórico no Git parece cortar filme analógico com tesoura e colar os pedaços de volta.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;git log&lt;/code&gt; também consegue desenhar uma árvore em arte ASCII se você passar &lt;code&gt;--graph&lt;/code&gt;, embora não seja tão legível quanto a do Jujutsu. Mas ver o grafo não permite editar entre branches de forma intuitiva e segura como no Jujutsu, então, mesmo que eu voltasse ao Git, quase não o usaria.&lt;/p&gt;
&lt;h2&gt;
  
  
  O lugar do Git hoje
&lt;/h2&gt;

&lt;p&gt;Já faz mais de seis meses que migrei totalmente para o Jujutsu, mas, na verdade, não parei de usar o Git. A camada de armazenamento do Jujutsu é plugável, e ele pode usar um repositório Git como backend. Quando você inicializa um repositório com o Jujutsu, por padrão obtém um colocated workspace, com &lt;code&gt;.git/&lt;/code&gt; e &lt;code&gt;.jj/&lt;/code&gt; lado a lado na raiz do projeto. Continuo usando um repositório Git; só deixei de usar a interface do Git para trabalhar com ele. O comando &lt;code&gt;git&lt;/code&gt; continua funcionando, se você precisar.&lt;/p&gt;

&lt;p&gt;Graças a essa compatibilidade, ninguém ao seu redor vai saber que você usa o Jujutsu, a menos que você conte. Em uma equipe que usa GitHub ou GitLab, é perfeitamente possível que alguém esteja usando o Jujutsu discretamente esse tempo todo. No dia a dia, praticamente as únicas vezes em que penso no Git são quando preparo um repositório com &lt;code&gt;jj git init&lt;/code&gt; ou &lt;code&gt;jj git clone&lt;/code&gt; e, a partir daí, quando sincronizo com o remoto usando &lt;code&gt;jj git fetch&lt;/code&gt; e &lt;code&gt;jj git push&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Comecei a usar o Git por causa do GitHub e troquei pelo Jujutsu quando mergulhei de vez na programação com IA. Agora não tem mais volta. Depois de tantos anos acostumada ao Git, alguns jeitos do Jujutsu me pareceram estranhos no começo. Mas, olhando para a história do controle de versões, muitas vezes o estranho era o Git, e hoje o Jujutsu me parece mais natural na maioria das situações.&lt;/p&gt;

&lt;p&gt;Ainda assim, o Jujutsu continua sendo pouco conhecido, e me frustra que uma ferramenta tão boa não tenha mais visibilidade. O problema é que ele é compatível com o Git, mas se baseia em um modelo mental muito diferente. Se você o experimentar com a cabeça no Git, guiando-se por uma tabela de equivalência entre comandos do Git e do jj, mal vai notar as vantagens. Por isso escrevi &lt;strong&gt;um guia de Jujutsu para iniciantes pensado para você não travar no caminho&lt;/strong&gt; , centrado em ajudar você a adotar esse novo modelo mental.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://juju-chu.com/pt" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Fog%2Fpt%2Fdefault.jpg" height="420" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://juju-chu.com/pt" rel="noopener noreferrer" class="c-link"&gt;
            Juju-chu! — Comece seu fluxo de trabalho Jujutsu × IA com jj new
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Um guia prático para adotar Jujutsu (jj) com Claude Code e Codex: snapshots automáticos, operações que podem ser desfeitas e reescrita segura do histórico.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fjuju-chu.com%2Ficons%2Ffavicon.ico" width="48" height="48"&gt;
          juju-chu.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Ele se chama &lt;em&gt;Juju-chu! — Comece seu fluxo de trabalho Jujutsu × IA com &lt;code&gt;jj new&lt;/code&gt;&lt;/em&gt;. O livro tem uma capa no estilo light novel e um visual divertido, mas o conteúdo é sério. O livro orienta você passo a passo, desde os primeiros contatos com o Jujutsu até você conseguir usá-lo com confiança. Se este post despertou sua curiosidade pelo Jujutsu, dê uma olhada. Na página, você encontra uma amostra que pode ler diretamente no navegador.&lt;/p&gt;

&lt;h2 id="footnote-label"&gt;Footnotes&lt;/h2&gt;

&lt;ol&gt;
&lt;li id="user-content-fn-save-timing"&gt;
&lt;p&gt;Para ser exata, sempre que qualquer comando &lt;code&gt;jj&lt;/code&gt; é executado, o Jujutsu verifica se há diferenças entre a cópia de trabalho e o estado mais recente do histórico e, se houver, faz o commit. Agentes de IA instruídos a usar o Jujutsu costumam conferir o próprio trabalho com &lt;code&gt;jj status&lt;/code&gt; ou um comando parecido nas pausas naturais de uma tarefa, e é nesse momento que o commit acontece. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-operation-id"&gt;
&lt;p&gt;Além do log normal, o Jujutsu mantém um registro de operações com cada operação realizada no repositório. Cada entrada tem um ID de operação, que você pode usar para reverter essa operação ou restaurar os arquivos como estavam logo depois dela. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-git-log-opt"&gt;
&lt;p&gt;Refiro-me ao comportamento padrão. Com &lt;code&gt;--all&lt;/code&gt;, você vê todos os branches do seu repositório local e os commits alcançáveis a partir deles. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;li id="user-content-fn-bookmark-branch"&gt;
&lt;p&gt;Os bookmarks do Jujutsu são tratados como branches ao trabalhar com o Git, mas, conceitualmente, são outra coisa. ↩&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>braziliandevs</category>
      <category>ptbr</category>
      <category>jujutsu</category>
      <category>git</category>
    </item>
  </channel>
</rss>
