forked from mirrors/jj
f67d6a192c
The replacement was done by `sed`.
This should only change versions of the docs prior to 864869ab
(in
particular, not the `latest` version nor the `prerelease` version), and
make it as though the old version of the docs were compiled with that
commit. It tries to solve the same problem:
https://www.google.com/search?q=jj+revsets still points to jj v0.13
docs.
Google seems really slow to update its index, and I'm beginning to worry
that it might think we have a spammy site with many almost identical
pages. I hope it will pick up this change once it tries to update its
crawl of pages it's already indexing.
Loosely related reading: https://news.ycombinator.com/item?id=40970987
1465 lines
No EOL
37 KiB
HTML
1465 lines
No EOL
37 KiB
HTML
|
|
<!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/latest/git-comparison.html">
|
|
|
|
|
|
<link rel="prev" href="templates.html">
|
|
|
|
|
|
<link rel="next" href="git-compatibility.html">
|
|
|
|
|
|
<link rel="icon" href="assets/images/favicon.png">
|
|
<meta name="generator" content="mkdocs-1.5.2, mkdocs-material-9.2.5">
|
|
|
|
|
|
|
|
<title>Git comparison - 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="#comparison-with-git" 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">
|
|
|
|
Git comparison
|
|
|
|
</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--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
|
|
|
|
<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="false">
|
|
<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">
|
|
<a href="branches.html" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Branches
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</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--active md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" checked>
|
|
|
|
<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="true">
|
|
<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 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">
|
|
Git comparison
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<a href="git-comparison.html" class="md-nav__link md-nav__link--active">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Git comparison
|
|
</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="#overview" class="md-nav__link">
|
|
Overview
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#the-index" class="md-nav__link">
|
|
The index
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#command-equivalence-table" class="md-nav__link">
|
|
Command equivalence table
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
|
|
</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="#overview" class="md-nav__link">
|
|
Overview
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#the-index" class="md-nav__link">
|
|
The index
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#command-equivalence-table" class="md-nav__link">
|
|
Command equivalence table
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-content" data-md-component="content">
|
|
<article class="md-content__inner md-typeset">
|
|
|
|
|
|
|
|
|
|
<h1 id="comparison-with-git">Comparison with Git<a class="headerlink" href="#comparison-with-git" title="Permanent link">¶</a></h1>
|
|
<h2 id="introduction">Introduction<a class="headerlink" href="#introduction" title="Permanent link">¶</a></h2>
|
|
<p>This document attempts to describe how Jujutsu is different from Git. See
|
|
<a href="git-compatibility.html">the Git-compatibility doc</a> for information about how
|
|
the <code>jj</code> command interoperates with Git repos.</p>
|
|
<h2 id="overview">Overview<a class="headerlink" href="#overview" title="Permanent link">¶</a></h2>
|
|
<p>Here is a list of conceptual differences between Jujutsu and Git, along with
|
|
links to more details where applicable and available. There's a
|
|
<a href="#command-equivalence-table">table further down</a> explaining how to achieve
|
|
various use cases.</p>
|
|
<ul>
|
|
<li><strong>The working copy is automatically committed.</strong> That results in a simpler and
|
|
more consistent CLI because the working copy is now treated like any other
|
|
commit. <a href="working-copy.html">Details</a>.</li>
|
|
<li><strong>There's no index (staging area).</strong> That also results in a simpler
|
|
CLI for similar reasons. The index is very similar to an intermediate commit
|
|
between <code>HEAD</code> and the working copy, so workflows that depend on it can be
|
|
modeled using proper commits instead. <a href="#the-index">Details</a>.</li>
|
|
<li><strong>No need for branch names.</strong> Git lets you check out a commit without
|
|
attaching a branch. It calls this state "detached HEAD". This is the normal
|
|
state in Jujutsu (there's actually no way -- yet, at least -- to have an
|
|
active branch). However, Jujutsu keeps track of all visible heads (leaves) of
|
|
the commit graph, so the commits won't get lost or garbage-collected.</li>
|
|
<li><strong>No current branch.</strong> Git lets you check out a branch, making it the 'current
|
|
branch', and new commits will automatically update the branch. This is
|
|
necessary in Git because Git might otherwise lose track of the new commits.
|
|
Jujutsu does not have a 'current branch'; instead, you update branches
|
|
manually. For example, if you check out a commit with a branch, new commits
|
|
are created on top of the branch, then you issue a later command to update the
|
|
branch.</li>
|
|
<li><strong>Conflicts can be committed.</strong> No commands fail because of merge conflicts.
|
|
The conflicts are instead recorded in commits and you can resolve them later.
|
|
<a href="conflicts.html">Details</a>.</li>
|
|
<li><strong>Descendant commits are automatically rebased.</strong> Whenever you rewrite a
|
|
commit (e.g. by running <code>jj rebase</code>), all its descendants commits will
|
|
automatically be rebased on top. Branches pointing to it will also get
|
|
updated, and so will the working copy if it points to any of the rebased
|
|
commits.</li>
|
|
<li><strong>Branches are identified by their names (across remotes).</strong> For example, if
|
|
you pull from a remote that has a <code>main</code> branch, you'll get a branch by that
|
|
name in your local repo as well. If you then move it and push back to the
|
|
remote, the <code>main</code> branch on the remote will be updated.
|
|
<a href="branches.html">Details</a>.</li>
|
|
<li><strong>The operation log replaces reflogs.</strong> The operation log is similar to
|
|
reflogs, but is much more powerful. It keeps track of atomic updates to all
|
|
refs at once (Jujutsu thus improves on Git's per-ref history much in the same
|
|
way that Subversion improved on RCS's per-file history). The operation log
|
|
powers e.g. the undo functionality. <a href="operation-log.html">Details</a></li>
|
|
<li><strong>There's a single, virtual root commit.</strong> Like Mercurial, Jujutsu has a
|
|
virtual commit (with a hash consisting of only zeros) called the "root commit"
|
|
(called the "null revision" in Mercurial). This commit is a common ancestor of
|
|
all commits. That removes the awkward state Git calls the "unborn branch"
|
|
state (which is the state a newly initialized Git repo is in), and related
|
|
command-line flags (e.g. <code>git rebase --root</code>, <code>git checkout --orphan</code>).</li>
|
|
</ul>
|
|
<h2 id="the-index">The index<a class="headerlink" href="#the-index" title="Permanent link">¶</a></h2>
|
|
<p>Git's <a href="https://git-scm.com/book/en/v2/Git-Tools-Reset-Demystified">"index"</a> has
|
|
multiple roles. One role is as a cache of file system information. Jujutsu has
|
|
something similar. Unfortunately, Git exposes the index to the user, which makes
|
|
the CLI unnecessarily complicated (learning what the different flavors of
|
|
<code>git reset</code> do, especially when combined with commits and/or paths, usually
|
|
takes a while). Jujutsu, like Mercurial, doesn't make that mistake.</p>
|
|
<p>As a Git power-user, you may think that you need the power of the index to
|
|
commit only part of the working copy. However, Jujutsu provides commands for
|
|
more directly achieving most use cases you're used to using Git's index for. For
|
|
example, to create a commit from part of the changes in the working copy, you
|
|
might be used to using <code>git add -p; git commit</code>. With Jujutsu, you'd instead
|
|
use <code>jj split</code> to split the working-copy commit into two commits. To add more
|
|
changes into the parent commit, which you might normally use
|
|
<code>git add -p; git commit --amend</code> for, you can instead use <code>jj squash -i</code> to
|
|
choose which changes to move into the parent commit, or <code>jj squash <file></code> to
|
|
move a specific file.</p>
|
|
<h2 id="command-equivalence-table">Command equivalence table<a class="headerlink" href="#command-equivalence-table" title="Permanent link">¶</a></h2>
|
|
<p>Note that all <code>jj</code> commands can be run on any commit (not just the working-copy
|
|
commit), but that's left out of the table to keep it simple. For example,
|
|
<code>jj squash/amend -r <revision></code> will move the diff from that revision into its
|
|
parent.</p>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Use case</th>
|
|
<th>Jujutsu command</th>
|
|
<th>Git command</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>Create a new repo</td>
|
|
<td><code>jj init --git</code> (without <code>--git</code>, you get a
|
|
native Jujutsu repo, which is slow and whose format will change)</td>
|
|
<td><code>git init</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Clone an existing repo</td>
|
|
<td><code>jj git clone <source> <destination></code> (there is no support
|
|
for cloning non-Git repos yet)</td>
|
|
<td><code>git clone <source> <destination></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Update the local repo with all branches from a remote</td>
|
|
<td><code>jj git fetch [--remote <remote>]</code> (there is no
|
|
support for fetching into non-Git repos yet)</td>
|
|
<td><code>git fetch [<remote>]</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Update a remote repo with all branches from the local repo</td>
|
|
<td><code>jj git push --all [--remote <remote>]</code> (there is no
|
|
support for pushing from non-Git repos yet)</td>
|
|
<td><code>git push --all [<remote>]</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Update a remote repo with a single branch from the local repo</td>
|
|
<td><code>jj git push --branch <branch name>
|
|
[--remote <remote>]</code> (there is no support for
|
|
pushing from non-Git repos yet)</td>
|
|
<td><code>git push <remote> <branch name></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Show summary of current work and repo status</td>
|
|
<td><code>jj st</code></td>
|
|
<td><code>git status</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Show diff of the current change</td>
|
|
<td><code>jj diff</code></td>
|
|
<td><code>git diff HEAD</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Show diff of another change</td>
|
|
<td><code>jj diff -r <revision></code></td>
|
|
<td><code>git diff <revision>^ <revision></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Show diff from another change to the current change</td>
|
|
<td><code>jj diff --from <revision></code></td>
|
|
<td><code>git diff <revision></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Show diff from change A to change B</td>
|
|
<td><code>jj diff --from A --to B</code></td>
|
|
<td><code>git diff A B</code></td>
|
|
</tr>
|
|
<tr>
|
|
<tr>
|
|
<td>Show description and diff of a change</td>
|
|
<td><code>jj show <revision></code></td>
|
|
<td><code>git show <revision></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Add a file to the current change</td>
|
|
<td><code>touch filename</code></td>
|
|
<td><code>touch filename; git add filename</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Remove a file from the current change</td>
|
|
<td><code>rm filename</code></td>
|
|
<td><code>git rm filename</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Modify a file in the current change</td>
|
|
<td><code>echo stuff >> filename</code></td>
|
|
<td><code>echo stuff >> filename</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Finish work on the current change and start a new change</td>
|
|
<td><code>jj commit</code></td>
|
|
<td><code>git commit -a</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>See log of commits</td>
|
|
<td><code>jj log</code></td>
|
|
<td><code>git log --oneline --graph --decorate</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Abandon the current change and start a new change</td>
|
|
<td><code>jj abandon</code></td>
|
|
<td><code>git reset --hard</code> (cannot be undone)</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Make the current change empty</td>
|
|
<td><code>jj restore</code></td>
|
|
<td><code>git reset --hard</code> (same as abandoning a change since Git
|
|
has no concept of a "change")</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Discard working copy changes in some files</td>
|
|
<td><code>jj restore <paths>...</code></td>
|
|
<td><code>git restore <paths>...</code> or <code>git checkout HEAD -- <paths>...</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Edit description (commit message) of the current change</td>
|
|
<td><code>jj describe</code></td>
|
|
<td>Not supported</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Edit description (commit message) of the previous change</td>
|
|
<td><code>jj describe @-</code></td>
|
|
<td><code>git commit --amend</code> (first make sure that nothing is
|
|
staged)</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Temporarily put away the current change</td>
|
|
<td>Not needed</td>
|
|
<td><code>git stash</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Start working on a new change based on the <main> branch</td>
|
|
<td><code>jj co main</code></td>
|
|
<td><code>git switch -c topic main</code> or
|
|
<code>git checkout -b topic main</code> (may need to stash or commit
|
|
first)</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Move branch A onto branch B</td>
|
|
<td><code>jj rebase -b A -d B</code></td>
|
|
<td><code>git rebase B A</code>
|
|
(may need to rebase other descendant branches separately)</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Move change A and its descendants onto change B</td>
|
|
<td><code>jj rebase -s A -d B</code></td>
|
|
<td><code>git rebase --onto B A^ <some descendant branch></code>
|
|
(may need to rebase other descendant branches separately)</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Reorder changes from A-B-C-D to A-C-B-D</td>
|
|
<td><code>jj rebase -r C -d A; rebase -s B -d C</code> (pass change IDs,
|
|
not commit IDs, to not have to look up commit ID of rewritten C)</td>
|
|
<td><code>git rebase -i A</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Move the diff in the current change into the parent change</td>
|
|
<td><code>jj squash/amend</code></td>
|
|
<td><code>git commit --amend -a</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Interactively move part of the diff in the current change into the
|
|
parent change</td>
|
|
<td><code>jj squash/amend -i</code></td>
|
|
<td><code>git add -p; git commit --amend</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Move the diff in the working copy into an ancestor</td>
|
|
<td><code>jj move --to X</code></td>
|
|
<td><code>git commit --fixup=X; git rebase -i --autosquash X^</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Interactively move part of the diff in an arbitrary change to another
|
|
arbitrary change</td>
|
|
<td><code>jj move -i --from X --to Y</code></td>
|
|
<td>Not supported</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Interactively split the changes in the working copy in two</td>
|
|
<td><code>jj split</code></td>
|
|
<td><code>git commit -p</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Interactively split an arbitrary change in two</td>
|
|
<td><code>jj split -r <revision></code></td>
|
|
<td>Not supported (can be emulated with the "edit" action in
|
|
<code>git rebase -i</code>)</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Interactively edit the diff in a given change</td>
|
|
<td><code>jj diffedit -r <revision></code></td>
|
|
<td>Not supported (can be emulated with the "edit" action in
|
|
<code>git rebase -i</code>)</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Resolve conflicts and continue interrupted operation</td>
|
|
<td><code>echo resolved > filename; jj squash/amend</code> (operations
|
|
don't get interrupted, so no need to continue)</td>
|
|
<td><code>echo resolved > filename; git add filename; git
|
|
rebase/merge/cherry-pick --continue</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Create a copy of a commit on top of another commit</td>
|
|
<td><code>jj duplicate <source>; jj rebase -r <duplicate commit> -d <destination></code>
|
|
(there's no single command for it yet)</td>
|
|
<td><code>git co <destination>; git cherry-pick <source></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>List branches</td>
|
|
<td><code>jj branch list</code></td>
|
|
<td><code>git branch</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Create a branch</td>
|
|
<td><code>jj branch create <name> -r <revision></code></td>
|
|
<td><code>git branch <name> <revision></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Move a branch forward</td>
|
|
<td><code>jj branch set <name> -r <revision></code></td>
|
|
<td><code>git branch -f <name> <revision></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Move a branch backward or sideways</td>
|
|
<td><code>jj branch set <name> -r <revision> --allow-backwards</code></td>
|
|
<td><code>git branch -f <name> <revision></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Delete a branch</td>
|
|
<td><code>jj branch delete <name> </code></td>
|
|
<td><code>git branch --delete <name></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td>See log of operations performed on the repo</td>
|
|
<td><code>jj op log</code></td>
|
|
<td>Not supported</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Undo an earlier operation</td>
|
|
<td><code>jj [op] undo <operation ID></code>
|
|
(<code>jj undo</code> is an alias for <code>jj op undo</code>)
|
|
</td>
|
|
<td>Not supported</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</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> |