diff --git a/demos/git_compat.png b/demos/git_compat.png index 2fa3665704..58cef7a004 100644 Binary files a/demos/git_compat.png and b/demos/git_compat.png differ diff --git a/demos/git_compat.svg b/demos/git_compat.svg new file mode 100644 index 0000000000..147c07ac71 --- /dev/null +++ b/demos/git_compat.svg @@ -0,0 +1,88 @@ + + + + + + + +# Clone a Git repo: + +$ jj git clone https://github.com/octocat/Hello-World +Fetching into new repo in "/tmp/tmp.uMTIITJUte/Hello-World" +Working copy now at: yvyrykmn ffc103a9 (empty) (no description set) +Parent commit      : orrkosyo 7fd1a60b master | (empty) Merge pull request #6 fr +om Spaceghost/patch-1 +Added 1 files, modified 0 files, removed 0 files +$ cd Hello-World + +# Inspect it: + +$ jj log -r 'all()' +@  yvyrykmn jjfan@example.com 2023-09-09 22:01:47.000 -07:00 ffc103a9 +│  (empty) (no description set) +│ ◉  tpstlust support+octocat@github.com 2018-05-10 12:55:19.000 -05:00 +├─╯  octocat-patch-1 b1b3f972 +│    sentence case +│ ◉  kowxouwz octocat@nowhere.com 2014-06-10 15:22:26.000 -07:00 test b3cbd5bb +├─╯  Create CONTRIBUTING.md +◉    orrkosyo octocat@nowhere.com 2012-03-06 15:06:50.000 -08:00 master 7fd1a60b +├─╮  (empty) Merge pull request #6 from Spaceghost/patch-1 +│ ◉  nznozkvv Johnneylee.rollins@gmail.com 2011-09-13 21:42:41.000 -07:00 +├─╯  76294131 +│    New line at end of file. --Signed off by Spaceghost +◉  syktoqts cameron@github.com 2011-01-26 11:06:08.000 -08:00 553c2077 +│  first commit +◉  zzzzzzzz root() 00000000 + +$ jj diff -r b1 +Modified regular file README: +   1    1: Hello Worldworld! + +# The repo is backed by the actual Git repo: + +$ git --git-dir=.jj/repo/store/git log --graph --all --decorate --oneline +ffc103a  +| * d979f1b  +| * b1b3f97 (origin/octocat-patch-1) sentence case +|/   +| * b3cbd5b (origin/test) Create CONTRIBUTING.md +|/   +*   7fd1a60 (origin/master) Merge pull request #6 from Spaceghost/patch-1 +|\   +| * 7629413 New line at end of file. --Signed off by Spaceghost +|/   +553c207 first commit + + + diff --git a/demos/juggle_conflicts.png b/demos/juggle_conflicts.png index c5a661dcfa..70bc12716e 100644 Binary files a/demos/juggle_conflicts.png and b/demos/juggle_conflicts.png differ diff --git a/demos/juggle_conflicts.svg b/demos/juggle_conflicts.svg new file mode 100644 index 0000000000..5825cb173c --- /dev/null +++ b/demos/juggle_conflicts.svg @@ -0,0 +1,127 @@ + + + + + + + +# We are in a repo with three commits, all +# editing the same line: + +$ jj log +@  vkzowrmy jjfan@example.com 2023-09-09 22:01:48.195 -07:00 42bb566a +│  (empty) (no description set) +◉  wwzzrrtm jjfan@example.com 2023-09-09 22:01:48.194 -07:00 third 228ca2ec +│  third +◉  nsplurtl jjfan@example.com 2023-09-09 22:01:48.150 -07:00 second f2e65ff5 +│  second +◉  nutnsoyx jjfan@example.com 2023-09-09 22:01:48.104 -07:00 first ee5d7933 +│  first +◉  zzzzzzzz root() 00000000 +$ jj diff -r first +Added regular file file: +        1first +$ jj diff -r second +Modified regular file file: +   1    1firstsecond +$ jj diff -r third +Modified regular file file: +   1    1secondthird + +# Let's reorder the second and third commits: + +$ jj rebase -s third -d first +Rebased 2 commits +Working copy now at: vkzowrmy ed47f8c5 (conflict) (empty) (no description set) +Parent commit      : wwzzrrtm f712bbc5 third | (conflict) third +Added 0 files, modified 1 files, removed 0 files +$ jj rebase -s second -d third +Rebased 1 commits +$ jj log +◉  nsplurtl jjfan@example.com 2023-09-09 22:01:48.358 -07:00 second 0217d9c0 +│  second +│ @  vkzowrmy jjfan@example.com 2023-09-09 22:01:48.333 -07:00 ed47f8c5 conflict +├─╯  (empty) (no description set) +◉  wwzzrrtm jjfan@example.com 2023-09-09 22:01:48.333 -07:00 third f712bbc5 +│  conflict +│  third +◉  nutnsoyx jjfan@example.com 2023-09-09 22:01:48.104 -07:00 first ee5d7933 +│  first +◉  zzzzzzzz root() 00000000 + +# The commit labeled "third" has a conflict, as expected. What's more +# interesting is that the top commit has no conflict! That's because it +# has the changes from all three commits applied to it. + +# Let's verify that by looking at its contents: + +$ jj co second +Working copy now at: qywnswwr 4d041b2c (empty) (no description set) +Parent commit      : nsplurtl 0217d9c0 second | second +Added 0 files, modified 1 files, removed 0 files +$ cat file +third + +# Let's now instead make "second" and "third" +# sibling and merge them: + +$ jj rebase -s second -d first +Rebased 2 commits +Working copy now at: qywnswwr d5e97f1d (empty) (no description set) +Parent commit      : nsplurtl a65148fd second | second +Added 0 files, modified 1 files, removed 0 files +$ jj merge second third -m merged +Working copy now at: rrwrqnun ea858dac (empty) merged +Parent commit      : nsplurtl a65148fd second | second +Parent commit      : wwzzrrtm f712bbc5 third | (conflict) third +Added 0 files, modified 1 files, removed 0 files +$ jj log +@    rrwrqnun jjfan@example.com 2023-09-09 22:01:48.472 -07:00 ea858dac +├─╮  (empty) merged +│ ◉  wwzzrrtm jjfan@example.com 2023-09-09 22:01:48.333 -07:00 third f712bbc5 +│ │  conflict +│ │  third +◉ │  nsplurtl jjfan@example.com 2023-09-09 22:01:48.442 -07:00 second a65148fd +├─╯  second +◉  nutnsoyx jjfan@example.com 2023-09-09 22:01:48.104 -07:00 first ee5d7933 +│  first +◉  zzzzzzzz root() 00000000 + +# Again, because the merge commit has the +# changes from all three commits, it has no +# conflict. + + + + diff --git a/demos/operation_log.png b/demos/operation_log.png index 7a4e1a3c5d..16e476c3af 100644 Binary files a/demos/operation_log.png and b/demos/operation_log.png differ diff --git a/demos/operation_log.svg b/demos/operation_log.svg new file mode 100644 index 0000000000..946d5b59b8 --- /dev/null +++ b/demos/operation_log.svg @@ -0,0 +1,169 @@ + + + + + + + +# We are in the octocat/Hello-World repo. +# The "operation log" shows the operations +# so far: + +$ jj op log +@  29225084d9de jjfan@jujube now, lasted 1 millisecond +│  check out git remote's default branch +│  args: jj git clone https://github.com/octocat/Hello-World +◉  43a151f8e638 jjfan@jujube now, lasted 435 milliseconds +│  fetch from git remote into empty repo +│  args: jj git clone https://github.com/octocat/Hello-World +◉  06e3afb50622 jjfan@jujube now, lasted less than a microsecond +│  add workspace 'default' +◉  08cae0fb5912 jjfan@jujube now, lasted less than a microsecond +   initialize repo + +# We are going to make some changes to show +# how the operation log works. Let's add a file, set +# a description, and rebase onto the "test" branch: + +$ echo stuff > new-file +$ jj describe -m stuff +Working copy now at: xtzyyzkw 08eb0b47 stuff +Parent commit      : orrkosyo 7fd1a60b master | (empty) Merge pull request #6 fr +om Spaceghost/patch-1 +$ jj rebase -d test +Rebased 1 commits +Working copy now at: xtzyyzkw c77b1df4 stuff +Parent commit      : kowxouwz b3cbd5bb test | Create CONTRIBUTING.md +Added 1 files, modified 0 files, removed 0 files + +# We are now going to make another change off of +# master: + +$ jj co master +Working copy now at: wzsznrom 63797943 (empty) (no description set) +Parent commit      : orrkosyo 7fd1a60b master | (empty) Merge pull request #6 fr +om Spaceghost/patch-1 +Added 0 files, modified 0 files, removed 2 files +$ jj describe -m "other stuff" +Working copy now at: wzsznrom 6b6cf3e3 (empty) other stuff +Parent commit      : orrkosyo 7fd1a60b master | (empty) Merge pull request #6 fr +om Spaceghost/patch-1 + +# The repo now looks like this: + +$ jj log +@  wzsznrom jjfan@example.com 2023-09-09 22:01:49.000 -07:00 6b6cf3e3 +│  (empty) other stuff +│ ◉  xtzyyzkw jjfan@example.com 2023-09-09 22:01:49.000 -07:00 c77b1df4 +│ │  stuff +│ ◉  kowxouwz octocat@nowhere.com 2014-06-10 15:22:26.000 -07:00 test b3cbd5bb +├─╯  Create CONTRIBUTING.md +◉  orrkosyo octocat@nowhere.com 2012-03-06 15:06:50.000 -08:00 master 7fd1a60b +│  (empty) Merge pull request #6 from Spaceghost/patch-1 +~ + +# The most recent portion of the operation log +# is: + +$ jj op log | head +@  e230796affe8 jjfan@jujube now, lasted 2 milliseconds +│  describe commit 637979437871713d4dc8eaa57ca15db900198885 +│  args: jj describe -m 'other stuff' +◉  7044a912b368 jjfan@jujube now, lasted 2 milliseconds +│  check out commit 7fd1a60b01f91b314f59955a4e4d4e80d8edf11d +│  args: jj co master +◉  c9d307fafeae jjfan@jujube now, lasted 2 milliseconds +│  rebase commit 08eb0b47aa235714dcfe9bdf925f5c4ff2b48327 and descendants +│  args: jj rebase -d test +◉  146c0577d6e9 jjfan@jujube now, lasted less than a microsecond + +# Let's undo that rebase operation: + +$ jj undo e230796a +Working copy now at: wzsznrom 63797943 (empty) (no description set) +Parent commit      : orrkosyo 7fd1a60b master | (empty) Merge pull request #6 fr +om Spaceghost/patch-1 + +# Note that only the rebase was undone, and the +# subsequent "other stuff" change was not undone: + +$ jj log +@  wzsznrom jjfan@example.com 2023-09-09 22:01:48.000 -07:00 63797943 +│  (empty) (no description set) +│ ◉  xtzyyzkw jjfan@example.com 2023-09-09 22:01:49.000 -07:00 c77b1df4 +│ │  stuff +│ ◉  kowxouwz octocat@nowhere.com 2014-06-10 15:22:26.000 -07:00 test b3cbd5bb +├─╯  Create CONTRIBUTING.md +◉  orrkosyo octocat@nowhere.com 2012-03-06 15:06:50.000 -08:00 master 7fd1a60b +│  (empty) Merge pull request #6 from Spaceghost/patch-1 +~ + +# We can also see what the repo looked like +# after the rebase operation: + +$ jj --at-op e230796a log +@  wzsznrom jjfan@example.com 2023-09-09 22:01:49.000 -07:00 6b6cf3e3 +│  (empty) other stuff +│ ◉  xtzyyzkw jjfan@example.com 2023-09-09 22:01:49.000 -07:00 c77b1df4 +│ │  stuff +│ ◉  kowxouwz octocat@nowhere.com 2014-06-10 15:22:26.000 -07:00 test b3cbd5bb +├─╯  Create CONTRIBUTING.md +◉  orrkosyo octocat@nowhere.com 2012-03-06 15:06:50.000 -08:00 master 7fd1a60b +│  (empty) Merge pull request #6 from Spaceghost/patch-1 +~ + +# Let's say we instead want to go back to the +# state of the repo right after the rebase: + +$ jj op restore e230796a +Working copy now at: wzsznrom 6b6cf3e3 (empty) other stuff +Parent commit      : orrkosyo 7fd1a60b master | (empty) Merge pull request #6 fr +om Spaceghost/patch-1 + +# We're now back to before the "other stuff" +# change existed: + +$ jj log +@  wzsznrom jjfan@example.com 2023-09-09 22:01:49.000 -07:00 6b6cf3e3 +│  (empty) other stuff +│ ◉  xtzyyzkw jjfan@example.com 2023-09-09 22:01:49.000 -07:00 c77b1df4 +│ │  stuff +│ ◉  kowxouwz octocat@nowhere.com 2014-06-10 15:22:26.000 -07:00 test b3cbd5bb +├─╯  Create CONTRIBUTING.md +◉  orrkosyo octocat@nowhere.com 2012-03-06 15:06:50.000 -08:00 master 7fd1a60b +│  (empty) Merge pull request #6 from Spaceghost/patch-1 +~ + + + diff --git a/demos/resolve_conflicts.png b/demos/resolve_conflicts.png index 4b96de3461..46fbf1e444 100644 Binary files a/demos/resolve_conflicts.png and b/demos/resolve_conflicts.png differ diff --git a/demos/resolve_conflicts.svg b/demos/resolve_conflicts.svg new file mode 100644 index 0000000000..d32cd5a5cb --- /dev/null +++ b/demos/resolve_conflicts.svg @@ -0,0 +1,138 @@ + + + + + + + +# We are on the master branch of the +# octocat/Hello-World repo: + +$ jj log -r 'all()' +@  mruuzplm jjfan@example.com 2023-09-09 22:01:51.000 -07:00 e1c5f8e0 +│  (empty) (no description set) +│ ◉  tpstlust support+octocat@github.com 2018-05-10 12:55:19.000 -05:00 +├─╯  octocat-patch-1 b1b3f972 +│    sentence case +│ ◉  kowxouwz octocat@nowhere.com 2014-06-10 15:22:26.000 -07:00 test b3cbd5bb +├─╯  Create CONTRIBUTING.md +◉    orrkosyo octocat@nowhere.com 2012-03-06 15:06:50.000 -08:00 master 7fd1a60b +├─╮  (empty) Merge pull request #6 from Spaceghost/patch-1 +│ ◉  nznozkvv Johnneylee.rollins@gmail.com 2011-09-13 21:42:41.000 -07:00 +├─╯  76294131 +│    New line at end of file. --Signed off by Spaceghost +◉  syktoqts cameron@github.com 2011-01-26 11:06:08.000 -08:00 553c2077 +│  first commit +◉  zzzzzzzz root() 00000000 + +# Let's make an edit that will conflict +# when we rebase it: + +$ jj describe -m "README: say which world" +Working copy now at: mruuzplm a625b83c (empty) README: say which world +Parent commit      : orrkosyo 7fd1a60b master | (empty) Merge pull request #6 fr +om Spaceghost/patch-1 +$ echo "Hello Earth!" > README +$ jj diff +Modified regular file README: +   1    1: Hello WorldEarth! + +# We're going to rebase it onto commit b1b. +# That commit looks like this: + +$ jj diff -r b1b +Modified regular file README: +   1    1: Hello Worldworld! + +# Now rebase: + +$ jj rebase -d b1b +Rebased 1 commits +Working copy now at: mruuzplm 4d8e49ee (conflict) README: say which world +Parent commit      : tpstlust b1b3f972 octocat-patch-1 | sentence case +Added 0 files, modified 1 files, removed 0 files + +# That seemed to succeed but we are also told there is now a conflict. +# Let's take a look at the repo: + +$ jj log -r 'all()' +@  mruuzplm jjfan@example.com 2023-09-09 22:01:52.000 -07:00 4d8e49ee conflict +│  README: say which world +◉  tpstlust support+octocat@github.com 2018-05-10 12:55:19.000 -05:00 +│  octocat-patch-1 b1b3f972 +│  sentence case +│ ◉  kowxouwz octocat@nowhere.com 2014-06-10 15:22:26.000 -07:00 test b3cbd5bb +├─╯  Create CONTRIBUTING.md +◉    orrkosyo octocat@nowhere.com 2012-03-06 15:06:50.000 -08:00 master 7fd1a60b +├─╮  (empty) Merge pull request #6 from Spaceghost/patch-1 +│ ◉  nznozkvv Johnneylee.rollins@gmail.com 2011-09-13 21:42:41.000 -07:00 +├─╯  76294131 +│    New line at end of file. --Signed off by Spaceghost +◉  syktoqts cameron@github.com 2011-01-26 11:06:08.000 -08:00 553c2077 +│  first commit +◉  zzzzzzzz root() 00000000 +$ jj status +Working copy changes: +M README +There are unresolved conflicts at these paths: +README    2-sided conflict +Working copy : mruuzplm 4d8e49ee (conflict) README: say which world +Parent commit: tpstlust b1b3f972 octocat-patch-1 | sentence case + +# Indeed, the rebased commit has a conflict. The conflicted file +# in the working copy looks like this: + +$ cat README +<<<<<<< +%%%%%%% +-Hello World! ++Hello world! ++++++++ +Hello Earth! +>>>>>>> + +# Now we will resolve the conflict: + +$ echo "Hello earth!" > README + +# The status command no longer reports it: + +$ jj status +Working copy changes: +M README +Working copy : mruuzplm a16a6bbc README: say which world +Parent commit: tpstlust b1b3f972 octocat-patch-1 | sentence case + + + diff --git a/demos/working_copy.png b/demos/working_copy.png index 85f25d7af1..ef31439c1a 100644 Binary files a/demos/working_copy.png and b/demos/working_copy.png differ diff --git a/demos/working_copy.svg b/demos/working_copy.svg new file mode 100644 index 0000000000..17a11a617b --- /dev/null +++ b/demos/working_copy.svg @@ -0,0 +1,139 @@ + + + + + + + +# We are in the octocat/Hello-World repo. +# We have an empty working copy on top of master: + +$ jj log +@  pwqxkryt jjfan@example.com 2023-09-09 22:01:53.000 -07:00 a31440be +│  (empty) (no description set) +◉  orrkosyo octocat@nowhere.com 2012-03-06 15:06:50.000 -08:00 master 7fd1a60b +│  (empty) Merge pull request #6 from Spaceghost/patch-1 +~ +$ jj status +The working copy is clean +Working copy : pwqxkryt a31440be (empty) (no description set) +Parent commit: orrkosyo 7fd1a60b master | (empty) Merge pull request #6 from Spa +ceghost/patch-1 + +# Now make some changes in the working copy: + +$ echo "Goodbye World!" > README +$ echo stuff > new-file + +# Because of these changes, our working copy is no longer marked as "empty". +# Also, its commit ID (starting with a blue character) changed: + +$ jj status +Working copy changes: +M README +A new-file +Working copy : pwqxkryt 49b26337 (no description set) +Parent commit: orrkosyo 7fd1a60b master | (empty) Merge pull request #6 from Spa +ceghost/patch-1 + +# Add a branch so we can easily refer to this +# commit: + +$ jj branch create goodbye +$ jj log +@  pwqxkryt jjfan@example.com 2023-09-09 22:01:53.000 -07:00 goodbye 49b26337 +│  (no description set) +◉  orrkosyo octocat@nowhere.com 2012-03-06 15:06:50.000 -08:00 master 7fd1a60b +│  (empty) Merge pull request #6 from Spaceghost/patch-1 +~ + +# Start working on a new change off of master: + +$ jj co master +Working copy now at: onmxoums 08c1c95d (empty) (no description set) +Parent commit      : orrkosyo 7fd1a60b master | (empty) Merge pull request #6 fr +om Spaceghost/patch-1 +Added 0 files, modified 1 files, removed 1 files + +# Note that we were told the working copy is now empty (AKA clean). The +# "goodbye" change stayed in its own commit: + +$ jj log +@  onmxoums jjfan@example.com 2023-09-09 22:01:52.000 -07:00 08c1c95d +│  (empty) (no description set) +│ ◉  pwqxkryt jjfan@example.com 2023-09-09 22:01:53.000 -07:00 goodbye 49b26337 +├─╯  (no description set) +◉  orrkosyo octocat@nowhere.com 2012-03-06 15:06:50.000 -08:00 master 7fd1a60b +│  (empty) Merge pull request #6 from Spaceghost/patch-1 +~ + +# Let's do a sanity check: 'jj status' should tell us that +# the working copy is clean. + +$ jj status +The working copy is clean +Working copy : onmxoums 08c1c95d (empty) (no description set) +Parent commit: orrkosyo 7fd1a60b master | (empty) Merge pull request #6 from Spa +ceghost/patch-1 + +# Modify a file in this new change: + +$ echo "Hello everyone!" > README + +# The working copy is not special; we can, for +# example, set the description of any commit. +# First, set it on the working copy: + +$ jj describe -m everyone +Working copy now at: onmxoums 1ac4fadf everyone +Parent commit      : orrkosyo 7fd1a60b master | (empty) Merge pull request #6 fr +om Spaceghost/patch-1 + +# Now set it on the change we worked on before: + +$ jj describe goodbye -m goodbye + +# Inspect the result: + +$ jj log +◉  pwqxkryt jjfan@example.com 2023-09-09 22:01:53.000 -07:00 goodbye 0487eaaa +│  goodbye +│ @  onmxoums jjfan@example.com 2023-09-09 22:01:53.000 -07:00 1ac4fadf +├─╯  everyone +◉  orrkosyo octocat@nowhere.com 2012-03-06 15:06:50.000 -08:00 master 7fd1a60b +│  (empty) Merge pull request #6 from Spaceghost/patch-1 +~ + + +