<!doctype html> <html lang="en" class="no-js"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <link rel="canonical" href="https://martinvonz.github.io/jj/v0.9.0/branches.html"> <link rel="prev" href="working-copy.html"> <link rel="next" href="conflicts.html"> <link rel="icon" href="assets/images/favicon.png"> <meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.2.5"> <title>Branches - Jujutsu docs</title> <link rel="stylesheet" href="assets/stylesheets/main.0e669242.min.css"> <script src="https://unpkg.com/iframe-worker/shim"></script> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> <script>__md_scope=new URL(".",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> </head> <body dir="ltr"> <script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script> <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> <label class="md-overlay" for="__drawer"></label> <div data-md-component="skip"> <a href="#branches" class="md-skip"> Skip to content </a> </div> <div data-md-component="announce"> </div> <div data-md-color-scheme="default" data-md-component="outdated" hidden> </div> <header class="md-header md-header--shadow" data-md-component="header"> <nav class="md-header__inner md-grid" aria-label="Header"> <a href="." title="Jujutsu docs" class="md-header__button md-logo" aria-label="Jujutsu docs" data-md-component="logo"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg> </a> <label class="md-header__button md-icon" for="__drawer"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg> </label> <div class="md-header__title" data-md-component="header-title"> <div class="md-header__ellipsis"> <div class="md-header__topic"> <span class="md-ellipsis"> Jujutsu docs </span> </div> <div class="md-header__topic" data-md-component="header-topic"> <span class="md-ellipsis"> Branches </span> </div> </div> </div> <label class="md-header__button md-icon" for="__search"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> </label> <div class="md-search" data-md-component="search" role="dialog"> <label class="md-search__overlay" for="__search"></label> <div class="md-search__inner" role="search"> <form class="md-search__form" name="search"> <input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> <label class="md-search__icon md-icon" for="__search"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg> </label> <nav class="md-search__options" aria-label="Search"> <button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg> </button> </nav> </form> <div class="md-search__output"> <div class="md-search__scrollwrap" data-md-scrollfix> <div class="md-search-result" data-md-component="search-result"> <div class="md-search-result__meta"> Initializing search </div> <ol class="md-search-result__list" role="presentation"></ol> </div> </div> </div> </div> </div> </nav> </header> <div class="md-container" data-md-component="container"> <main class="md-main" data-md-component="main"> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > <div class="md-sidebar__scrollwrap"> <div class="md-sidebar__inner"> <nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0"> <label class="md-nav__title" for="__drawer"> <a href="." title="Jujutsu docs" class="md-nav__button md-logo" aria-label="Jujutsu docs" data-md-component="logo"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg> </a> Jujutsu docs </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_1" > <label class="md-nav__link" for="__nav_1" id="__nav_1_label" tabindex="0"> <span class="md-ellipsis"> Getting started </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_1_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_1"> <span class="md-nav__icon md-icon"></span> Getting started </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="install-and-setup.html" class="md-nav__link"> <span class="md-ellipsis"> Installation and Setup </span> </a> </li> <li class="md-nav__item"> <a href="tutorial.html" class="md-nav__link"> <span class="md-ellipsis"> Tutorial and Birds-Eye View </span> </a> </li> <li class="md-nav__item"> <a href="github.html" class="md-nav__link"> <span class="md-ellipsis"> Working with GitHub </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="FAQ.html" class="md-nav__link"> <span class="md-ellipsis"> FAQ </span> </a> </li> <li class="md-nav__item md-nav__item--active md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" checked> <label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0"> <span class="md-ellipsis"> Concepts </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="true"> <label class="md-nav__title" for="__nav_3"> <span class="md-nav__icon md-icon"></span> Concepts </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="working-copy.html" class="md-nav__link"> <span class="md-ellipsis"> Working Copy </span> </a> </li> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type="checkbox" id="__toc"> <label class="md-nav__link md-nav__link--active" for="__toc"> <span class="md-ellipsis"> Branches </span> <span class="md-nav__icon md-icon"></span> </label> <a href="branches.html" class="md-nav__link md-nav__link--active"> <span class="md-ellipsis"> Branches </span> </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class="md-nav__title" for="__toc"> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> <li class="md-nav__item"> <a href="#introduction" class="md-nav__link"> Introduction </a> </li> <li class="md-nav__item"> <a href="#remotes" class="md-nav__link"> Remotes </a> </li> <li class="md-nav__item"> <a href="#conflicts" class="md-nav__link"> Conflicts </a> </li> </ul> </nav> </li> <li class="md-nav__item"> <a href="conflicts.html" class="md-nav__link"> <span class="md-ellipsis"> Conflicts </span> </a> </li> <li class="md-nav__item"> <a href="operation-log.html" class="md-nav__link"> <span class="md-ellipsis"> Operation Log </span> </a> </li> <li class="md-nav__item"> <a href="glossary.html" class="md-nav__link"> <span class="md-ellipsis"> Glossary </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" > <label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0"> <span class="md-ellipsis"> Configuration </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_4"> <span class="md-nav__icon md-icon"></span> Configuration </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="config.html" class="md-nav__link"> <span class="md-ellipsis"> Settings </span> </a> </li> <li class="md-nav__item"> <a href="revsets.html" class="md-nav__link"> <span class="md-ellipsis"> Revset language </span> </a> </li> <li class="md-nav__item"> <a href="templates.html" class="md-nav__link"> <span class="md-ellipsis"> Templating language </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" > <label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0"> <span class="md-ellipsis"> Comparisons </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_5"> <span class="md-nav__icon md-icon"></span> Comparisons </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="git-comparison.html" class="md-nav__link"> <span class="md-ellipsis"> Git comparison </span> </a> </li> <li class="md-nav__item"> <a href="git-compatibility.html" class="md-nav__link"> <span class="md-ellipsis"> Git compatibility </span> </a> </li> <li class="md-nav__item"> <a href="sapling-comparison.html" class="md-nav__link"> <span class="md-ellipsis"> Sapling </span> </a> </li> <li class="md-nav__item"> <a href="related-work.html" class="md-nav__link"> <span class="md-ellipsis"> Other related work </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" > <label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0"> <span class="md-ellipsis"> Technical details </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_6"> <span class="md-nav__icon md-icon"></span> Technical details </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="technical/architecture.html" class="md-nav__link"> <span class="md-ellipsis"> Architecture </span> </a> </li> <li class="md-nav__item"> <a href="technical/concurrency.html" class="md-nav__link"> <span class="md-ellipsis"> Concurrency </span> </a> </li> <li class="md-nav__item"> <a href="technical/conflicts.html" class="md-nav__link"> <span class="md-ellipsis"> Conflicts </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" > <label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0"> <span class="md-ellipsis"> Contributing </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_7"> <span class="md-nav__icon md-icon"></span> Contributing </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="contributing.html" class="md-nav__link"> <span class="md-ellipsis"> Guidelines and "How to...?" </span> </a> </li> <li class="md-nav__item"> <a href="code-of-conduct.html" class="md-nav__link"> <span class="md-ellipsis"> Code of conduct </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" > <label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0"> <span class="md-ellipsis"> Design docs </span> <span class="md-nav__icon md-icon"></span> </label> <nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false"> <label class="md-nav__title" for="__nav_8"> <span class="md-nav__icon md-icon"></span> Design docs </label> <ul class="md-nav__list" data-md-scrollfix> <li class="md-nav__item"> <a href="design/git-submodules.html" class="md-nav__link"> <span class="md-ellipsis"> git-submodules </span> </a> </li> <li class="md-nav__item"> <a href="design/git-submodule-storage.html" class="md-nav__link"> <span class="md-ellipsis"> git-submodule-storage </span> </a> </li> <li class="md-nav__item"> <a href="design/tracking-branches.html" class="md-nav__link"> <span class="md-ellipsis"> Tracking branches </span> </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > <div class="md-sidebar__scrollwrap"> <div class="md-sidebar__inner"> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class="md-nav__title" for="__toc"> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix> <li class="md-nav__item"> <a href="#introduction" class="md-nav__link"> Introduction </a> </li> <li class="md-nav__item"> <a href="#remotes" class="md-nav__link"> Remotes </a> </li> <li class="md-nav__item"> <a href="#conflicts" class="md-nav__link"> Conflicts </a> </li> </ul> </nav> </div> </div> </div> <div class="md-content" data-md-component="content"> <article class="md-content__inner md-typeset"> <h1 id="branches">Branches<a class="headerlink" href="#branches" title="Permanent link">¶</a></h1> <h2 id="introduction">Introduction<a class="headerlink" href="#introduction" title="Permanent link">¶</a></h2> <p>Branches are named pointers to revisions (just like they are in Git). You can move them without affecting the target revision's identity. Branches automatically move when revisions are rewritten (e.g. by <code>jj rebase</code>). You can pass a branch's name to commands that want a revision as argument. For example, <code>jj co main</code> will check out the revision pointed to by the "main" branch. Use <code>jj branch list</code> to list branches and <code>jj branch</code> to create, move, or delete branches. There is currently no concept of an active/current/checked-out branch.</p> <h2 id="remotes">Remotes<a class="headerlink" href="#remotes" title="Permanent link">¶</a></h2> <p>Jujutsu identifies a branch by its name across remotes (this is unlike Git and more like Mercurial's "bookmarks"). For example, a branch called "main" in your local repo is considered the same branch as a branch by the same name on a remote. When you pull from a remote (currently only via <code>jj git fetch</code>), any branches from the remote will be imported as branches in your local repo.</p> <p>Jujutsu also records the last seen position on each remote (just like Git's remote-tracking branches). You can refer to these with <code><branch name>@<remote name></code>, such as <code>jj new main@origin</code>. Most commands don't show the remote branch if it has the same target as the local branch. The local branch (without <code>@<remote name></code>) is considered the branch's desired target. Consequently, if you want to update a branch on a remote, you first update the branch locally and then push the update to the remote. If a local branch also exists on some remote but points to a different target there, <code>jj log</code> will show the branch name with an asterisk suffix (e.g. <code>main*</code>). That is meant to remind you that you may want to push the branch to some remote.</p> <p>When you pull from a remote, any changes compared to the current record of the remote's state will be propagated to the local branch. Let's say you run <code>jj git fetch --remote origin</code> and the remote's "main" branch has moved so its target is now ahead of the local record in <code>main@origin</code>. That will update <code>main@origin</code> to the new target. It will also apply the change to the local branch <code>main</code>. If the local target had also moved compared to <code>main@origin</code> (probably because you had run <code>jj branch set main</code>), then the two updates will be merged. If one is ahead of the other, then that target will be the new target. Otherwise, the local branch will be conflicted (see next section for details).</p> <h2 id="conflicts">Conflicts<a class="headerlink" href="#conflicts" title="Permanent link">¶</a></h2> <p>Branches can end up in a conflicted state. When that happens, <code>jj status</code> will include information about the conflicted branches (and instructions for how to mitigate it). <code>jj branch list</code> will have details. <code>jj log</code> will show the branch name with a question mark suffix (e.g. <code>main?</code>) on each of the conflicted branch's potential target revisions. Using the branch name to look up a revision will resolve to all potential targets. That means that <code>jj co main</code> will error out, complaining that the revset resolved to multiple revisions.</p> <p>Both local branches (e.g. <code>main</code>) and the remote branch (e.g. <code>main@origin</code>) can have conflicts. Both can end up in that state if concurrent operations were run in the repo. The local branch more typically becomes conflicted because it was updated both locally and on a remote.</p> <p>To resolve a conflicted state in a local branch (e.g. <code>main</code>), you can move the branch to the desired target with <code>jj branch</code>. You may want to first either merge the conflicted targets with <code>jj merge</code>, or you may want to rebase one side on top of the other with <code>jj rebase</code>.</p> <p>To resolve a conflicted state in a remote branch (e.g. <code>main@origin</code>), simply pull from the remote (e.g. <code>jj git fetch</code>). The conflict resolution will also propagate to the local branch (which was presumably also conflicted).</p> </article> </div> </div> </main> <footer class="md-footer"> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class="md-copyright"> Made with <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> Material for MkDocs </a> </div> </div> </div> </footer> </div> <div class="md-dialog" data-md-component="dialog"> <div class="md-dialog__inner md-typeset"></div> </div> <script id="__config" type="application/json">{"base": ".", "features": [], "search": "assets/javascripts/workers/search.dfff1995.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": {"provider": "mike"}}</script> <script src="assets/javascripts/bundle.78eede0e.min.js"></script> </body> </html>