diff --git a/demos/git_compat.png b/demos/git_compat.png index 2fa3665704..161e1e33d0 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..65a9aea473 --- /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.Ak3NRwnS1L/Hello-World" +Working copy now at: vwswsxty cdcfdc7a (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()' +@  vwswsxty jjfan@example.com 2023-09-09 22:52:54.000 -07:00 cdcfdc7a +│  (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 +cdcfdc7  +| * 566ace6  +| * 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..f6cfe5aba2 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..1bfe09dd19 --- /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 +@  ovrsxxnx jjfan@example.com 2023-09-09 22:52:55.561 -07:00 f93733d6 +│  (empty) (no description set) +◉  svxvskxq jjfan@example.com 2023-09-09 22:52:55.560 -07:00 third c7e83542 +│  third +◉  vqllvzqx jjfan@example.com 2023-09-09 22:52:55.488 -07:00 second 0fe74e58 +│  second +◉  zulolszk jjfan@example.com 2023-09-09 22:52:55.433 -07:00 first b21ec90b +│  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: ovrsxxnx 59c115b9 (conflict) (empty) (no description set) +Parent commit      : svxvskxq 4c9ee69f third | (conflict) third +Added 0 files, modified 1 files, removed 0 files +$ jj rebase -s second -d third +Rebased 1 commits +$ jj log +◉  vqllvzqx jjfan@example.com 2023-09-09 22:52:55.710 -07:00 second 61366571 +│  second +│ @  ovrsxxnx jjfan@example.com 2023-09-09 22:52:55.687 -07:00 59c115b9 conflict +├─╯  (empty) (no description set) +◉  svxvskxq jjfan@example.com 2023-09-09 22:52:55.687 -07:00 third 4c9ee69f +│  conflict +│  third +◉  zulolszk jjfan@example.com 2023-09-09 22:52:55.433 -07:00 first b21ec90b +│  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: kmkxlsnt d5254498 (empty) (no description set) +Parent commit      : vqllvzqx 61366571 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: kmkxlsnt e09dea7a (empty) (no description set) +Parent commit      : vqllvzqx cb7c9891 second | second +Added 0 files, modified 1 files, removed 0 files +$ jj merge second third -m merged +Working copy now at: zskqtvlm 22f8f9af (empty) merged +Parent commit      : vqllvzqx cb7c9891 second | second +Parent commit      : svxvskxq 4c9ee69f third | (conflict) third +Added 0 files, modified 1 files, removed 0 files +$ jj log +@    zskqtvlm jjfan@example.com 2023-09-09 22:52:55.815 -07:00 22f8f9af +├─╮  (empty) merged +│ ◉  svxvskxq jjfan@example.com 2023-09-09 22:52:55.687 -07:00 third 4c9ee69f +│ │  conflict +│ │  third +◉ │  vqllvzqx jjfan@example.com 2023-09-09 22:52:55.789 -07:00 second cb7c9891 +├─╯  second +◉  zulolszk jjfan@example.com 2023-09-09 22:52:55.433 -07:00 first b21ec90b +│  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..e3ffe2683a 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..7ee1f4a170 --- /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 +@  95da50a844c1 jjfan@jujube now, lasted 2 milliseconds +│  check out git remote's default branch +│  args: jj git clone https://github.com/octocat/Hello-World +◉  af5219946754 jjfan@jujube now, lasted 473 milliseconds +│  fetch from git remote into empty repo +│  args: jj git clone https://github.com/octocat/Hello-World +◉  d54385c1739f jjfan@jujube now, lasted 1 millisecond +│  add workspace 'default' +◉  28e8df261313 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: xvksusnn 7512ad25 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: xvksusnn 0c56ab7b 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: rlmutxut 7dd78341 (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: rlmutxut e212d0f4 (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 +@  rlmutxut jjfan@example.com 2023-09-09 22:52:57.000 -07:00 e212d0f4 +│  (empty) other stuff +│ ◉  xvksusnn jjfan@example.com 2023-09-09 22:52:57.000 -07:00 0c56ab7b +│ │  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 +@  a78ef7e40460 jjfan@jujube now, lasted 1 millisecond +│  describe commit 7dd783419ebd7d6b17651ece22d52f269d3d697a +│  args: jj describe -m 'other stuff' +◉  92b84be1b504 jjfan@jujube now, lasted 2 milliseconds +│  check out commit 7fd1a60b01f91b314f59955a4e4d4e80d8edf11d +│  args: jj co master +◉  14debf1308e8 jjfan@jujube now, lasted 2 milliseconds +│  rebase commit 7512ad251a209e3e189cdf502215b6744b4a4c93 and descendants +│  args: jj rebase -d test +◉  8bf55027c33d jjfan@jujube now, lasted 1 millisecond + +# Let's undo that rebase operation: + +$ jj undo a78ef7e4 +Working copy now at: rlmutxut 7dd78341 (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 +@  rlmutxut jjfan@example.com 2023-09-09 22:52:56.000 -07:00 7dd78341 +│  (empty) (no description set) +│ ◉  xvksusnn jjfan@example.com 2023-09-09 22:52:57.000 -07:00 0c56ab7b +│ │  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 a78ef7e4 log +@  rlmutxut jjfan@example.com 2023-09-09 22:52:57.000 -07:00 e212d0f4 +│  (empty) other stuff +│ ◉  xvksusnn jjfan@example.com 2023-09-09 22:52:57.000 -07:00 0c56ab7b +│ │  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 a78ef7e4 +Working copy now at: rlmutxut e212d0f4 (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 +@  rlmutxut jjfan@example.com 2023-09-09 22:52:57.000 -07:00 e212d0f4 +│  (empty) other stuff +│ ◉  xvksusnn jjfan@example.com 2023-09-09 22:52:57.000 -07:00 0c56ab7b +│ │  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..5e90c50749 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..f64b7f9c00 --- /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()' +@  lztpktup jjfan@example.com 2023-09-09 22:52:59.000 -07:00 35de9057 +│  (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: lztpktup df76e1cc (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: lztpktup 6d56fad4 (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()' +@  lztpktup jjfan@example.com 2023-09-09 22:52:59.000 -07:00 6d56fad4 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 : lztpktup 6d56fad4 (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 : lztpktup d4bd111d 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..7800cb2c59 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..b6cc2b27d2 --- /dev/null +++ b/demos/working_copy.svg @@ -0,0 +1,143 @@ + + + + + + + +# We are in the octocat/Hello-World repo. +# We have an empty working copy on top of master: + +$ jj log +@  sulumowq jjfan@example.com 2023-09-09 22:53:01.000 -07:00 75f8ee5d +│  (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 : sulumowq 75f8ee5d (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 : sulumowq 694fb3f4 (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 +@  sulumowq jjfan@example.com 2023-09-09 22:53:01.000 -07:00 goodbye 694fb3f4 +│  (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: xmyxxqpr 3ff426fa (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 +@  xmyxxqpr jjfan@example.com 2023-09-09 22:53:00.000 -07:00 3ff426fa +│  (empty) (no description set) +│ ◉  sulumowq jjfan@example.com 2023-09-09 22:53:01.000 -07:00 goodbye 694fb3f4 +├─╯  (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 : xmyxxqpr 3ff426fa (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 +$ jj status +Working copy changes: +M README +Working copy : xmyxxqpr 8257ee2a (no description set) +Parent commit: orrkosyo 7fd1a60b master | (empty) Merge pull request #6 from Spa +ceghost/patch-1 + +# 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 +... (output redacted) ... + +# Now set it on the change we worked on before: + +$ jj describe goodbye -m goodbye + +# Inspect the result: + +$ jj log +◉  sulumowq jjfan@example.com 2023-09-09 22:53:01.000 -07:00 goodbye bea4d601 +│  goodbye +│ @  xmyxxqpr jjfan@example.com 2023-09-09 22:53:01.000 -07:00 235eba1a +├─╯  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 +~ + + +