Manual for Pijul
# Recording, splitting and combining changes

When working on code in your repository, you might come to a point where you
feel that the `pijul log` doesn’t look quite as nice as it could: Some changes
don’t work on their own, or some change is changing unrelated pieces of code.
So you’d like to re-arrange (split and / or combine) your changes so that
other, well-cut changes result.

On this page, you can learn how to achieve `pijul log` nirvana with the tools
at hand.


## Recording a change

After editing the files in your repository, you want to make pijul aware of the
changes. You already came across the command(s) to do that: `pijul add` any
files that aren’t tracked yet (probably using the `-r` flag for directories),
and then `pijul record` all changes.

`pijul record` opens an [editor]./editors.md for you containing a view of the
change as it will be recorded:

```
message = ''
timestamp = '2020-12-07T06:59:38.257226181Z'

[[authors]]
name = 'me'
full_name = My Name
email = 'me@gmail.com'

# Dependencies
[2] 5PI4BUI3SDD23P7V3NNCA3FR6NA7YCMF7PJRIJNMZH5TGDA7AGWQC
[3] H6EG7X443HN5LXRZ3TZLRQSIGW46NXGOMFXT2NP6KBGUKVDMF4RAC
[4]+NM32CQUCZLDJIE3H4SZJU35WJTWES6X2CAVWVZCPDEINQKHYAXTAC

# Changes

1. File addition: "file3.txt" in "/" 644
  up 1.0, new 0:11
+ ui
+ ae
+ nr
+ td

2. Edit in file2.txt:2 3.12
B:BD 3.22 -> 3.22:31/3
- uiaeuiae

3. Edit in file2.txt:3 3.12
  up 3.40, new 26:35
+ uiaexvlc

4. Edit in file.txt:4 4.11
  up 2.5, new 36:49
+ xvlcuiaexvlc
```

You can see the file is divided into three big blocks: the preamble with
metadata about the change like message and author; one block describing the
dependencies of this change; and one block containing a representation of all
changes you made since recording the last change.

To finish recording, this file needs to be edited a bit and saved, and the
editor window needs to be closed.

The `message` field **has** to be filled in, the fields under the `[[author]]`
heading **can** be changed. Changes between `# Dependencies` and `# Changes`
will not be regarded by `pijul`; the dependencies will be computed after you
close the editor window.  This part is purely informational.

The diff below `# Changes`, however, is where you can get creative with your
change. The diff is composed of several small sections. Each section is
introduced by an enumeration and a very short description of the diff (in the
example you can see `Edit in file` and `File addition`) and what file the diff
refers to.

You can remove any of these enumerated sections. This will leave the diff out
of the recorded change, but your working copy will not be touched. This way,
you can split up a big chunk of changes into several small ones or - if there
were changes you didn’t want to keep in your repo - `pijul reset` whatever is
left.


## Amending

Suppose you (or someone else working in the same repository) have already
recorded a large change, which you want to split into two separate changes
(maybe because you’d like to be able to push just one):

```bash
\$ pijul change 5HWYGVSSDKMEQP43H3JDSURPS7FJB4TXMAGMUAKSKWIFH6QRZN3QC
```

```pijul-change
message = 'Big change, should be split up'
timestamp = '2020-12-05T15:34:38.416301967Z'

[[authors]]
name = 'me'
full_name = 'My Name'
email = 'me@gmail.com'

# Dependencies
[2] 5PI4BUI3SDD23P7V3NNCA3FR6NA7YCMF7PJRIJNMZH5TGDA7AGWQC
[3]+NM32CQUCZLDJIE3H4SZJU35WJTWES6X2CAVWVZCPDEINQKHYAXTAC

# Changes

1. File addition: "file2.txt" in "/" 644
  up 1.0, new 0:11
+ xvlcxvlc
+ uiaeuiae
+ nrtdnrtd

2. Edit in file.txt:4 3.11
  up 2.5, new 41:54
+ xvlcuiaexvlc
```

To edit the recorded change, you issue the command

```bash
\$ pijul record --amend 5HWYGVSSDKMEQP43H3JDSURPS7FJB4TXMAGMUAKSKWIFH6QRZN3QC
```

An editor will open showing the change (see above, Recording a change). Now,
you can remove all sections you don’t want to go into the first change.
Whatever you remove, the files themselves will still look the same as before
the amend, only the record will have changed.

From here, you can `pijul record` the next change, again removing any sections
you don’t want to have in it. Repeat until done.

## Splitting a change

Although amending a change should be enough in most, if not all, scenarios, you
might be happy to know there’s an alternative:

By doing `pijul unrecord`, directly followed by `pijul record`, and then
opening a few instances of your favourite text editor to cut and paste the
result into multiple temporary text files, you can pipe them into `pijul
apply`. The whole procedure would look something like this:

Suppose we started with the change from above, and already did `pijul unrecord`
to strip the record of the change, but not the content of the change itself.
When you issue `pijul record`, you will be presented with the following in your
editor:

```
message = ''
timestamp = '2020-12-07T06:59:38.257226181Z'

[[authors]]
name = 'me'
full_name = My Name
email = 'me@gmail.com'

# Dependencies
[2] 5PI4BUI3SDD23P7V3NNCA3FR6NA7YCMF7PJRIJNMZH5TGDA7AGWQC
[3] H6EG7X443HN5LXRZ3TZLRQSIGW46NXGOMFXT2NP6KBGUKVDMF4RAC
[4]+NM32CQUCZLDJIE3H4SZJU35WJTWES6X2CAVWVZCPDEINQKHYAXTAC

# Changes

1. File addition: "file3.txt" in "/" 644
  up 1.0, new 0:11
+ ui
+ ae
+ nr
+ td

2. Edit in file2.txt:2 3.12
B:BD 3.22 -> 3.22:31/3
- uiaeuiae

3. Edit in file2.txt:3 3.12
  up 3.40, new 26:35
+ uiaexvlc

4. Edit in file.txt:4 4.11
  up 2.5, new 36:49
+ xvlcuiaexvlc
```

Now, you can split this text up into several files as you like, remembering to
copy over the preamble of the original, resulting in something like this:

In file1:
```
message = 'First change'
timestamp = '2020-12-07T06:59:38.257226181Z'

[[authors]]
name = 'me'
full_name = My Name
email = 'me@gmail.com'

# Dependencies
[2] 5PI4BUI3SDD23P7V3NNCA3FR6NA7YCMF7PJRIJNMZH5TGDA7AGWQC
[3] H6EG7X443HN5LXRZ3TZLRQSIGW46NXGOMFXT2NP6KBGUKVDMF4RAC
[4]+NM32CQUCZLDJIE3H4SZJU35WJTWES6X2CAVWVZCPDEINQKHYAXTAC

# Changes

1. File addition: "file3.txt" in "/" 644
  up 1.0, new 0:11
+ ui
+ ae
+ nr
+ td

2. Edit in file2.txt:2 3.12
B:BD 3.22 -> 3.22:31/3
- uiaeuiae
```

In file2:
```
message = 'Second change'
timestamp = '2020-12-07T06:59:38.257226181Z'

[[authors]]
name = 'me'
full_name = My Name
email = 'me@gmail.com'

# Dependencies
[2] 5PI4BUI3SDD23P7V3NNCA3FR6NA7YCMF7PJRIJNMZH5TGDA7AGWQC
[3] H6EG7X443HN5LXRZ3TZLRQSIGW46NXGOMFXT2NP6KBGUKVDMF4RAC
[4]+NM32CQUCZLDJIE3H4SZJU35WJTWES6X2CAVWVZCPDEINQKHYAXTAC

# Changes

3. Edit in file2.txt:3 3.12
  up 3.40, new 26:35
+ uiaexvlc
```

And in file3:
```
message = 'Third change'
timestamp = '2020-12-07T06:59:38.257226181Z'

[[authors]]
name = 'me'
full_name = My Name
email = 'me@gmail.com'

# Dependencies
[2] 5PI4BUI3SDD23P7V3NNCA3FR6NA7YCMF7PJRIJNMZH5TGDA7AGWQC
[3] H6EG7X443HN5LXRZ3TZLRQSIGW46NXGOMFXT2NP6KBGUKVDMF4RAC
[4]+NM32CQUCZLDJIE3H4SZJU35WJTWES6X2CAVWVZCPDEINQKHYAXTAC

# Changes

4. Edit in file.txt:4 4.11
  up 2.5, new 36:49
+ xvlcuiaexvlc
```

You don’t need to worry about the `# Dependencies` block, it just needs to be
there. The dependencies themselves will be re-computed by pijul when you record
the change.

Now that your 3 files are saved, back out of the original `pijul record` by
closing the editor without a message for your change.

Finish the task by doing

```
\$ pijul apply <file1
\$ pijul apply <file2
\$ pijul apply <file3
```

or, if you have a real lot of files, you can do some clever shell script like

```bash
\$ for file in file*; do pijul apply <\$file; done
```

## Combining changes

To combine multiple changes into one, there currently is no better way than
running `pijul unrecord` on all changes you want to combine, and then again
`pijul record` them as described above.