The Hackerlab at `regexps.com`

## Cherrypicking Changes

up: arch Meets hello-world next: Multi-tree Projects and Configuration Management prev: Symbolic Tags

So far we've learned about elementary branches for maintaining changes apart from a primary development branch and development branches for coordinating asynchronous work on a single project (see Elementary Branches -- Maintaining Private Changes and Development Branches -- The star-merge Style of Cooperation).

In this chapter, we'll briefly describe a third kind of branch that's useful when a project consists of multiple "forks" -- multiple, equally primary branches.

Let's suppose, somewhat abstractly, that Alice and Bob's mainline has grown quite large:

            mainline
            --------
            base-0
            patch-1
            ....
            patch-23
            patch-24
            patch-25
            ...
            patch-42

At some point, perhaps because some controversy has emerged over choices made in the `mainline` , a new developer, Derick, declares a fork and starts his own branch:

            mainline                derick
            --------                ------
            base-0          ------> base-0
            patch-1        '
            ....          '
            patch-23 ----'
            patch-24
            patch-25
            ...
            patch-42

We already know that Derick can use `update` or `replay` to keep current with the mainline, but what he doesn't want to? What if Derick wants the changes in `patch-25` and `patch-42` , but none of the other post-`patch-23` changes from the `mainline` ?

Derick can apply specific changes from the `mainline` by using the `--exact` option to `replay` :

            % cd ~/wd

            % larch get hello-world--derick--0.1 derick

            % cd derick

            % larch replay --exact -A lord@emf.net--2003-example \
                     hello-world--mainline--0.1--patch-23

            % larch replay --exact -A lord@emf.net--2003-example \
                     hello-world--mainline--0.1--patch-42

            % larch whats-missing -A lord@emf.net--2003-example \
                     hello-world--mainline--0.1
            patch-24
            patch-25
            ...
            patch-41

            % larch log-ls -A lord@emf.net--2003-example \
                     hello-world--mainline--0.1
            base-0
            patch-1
            ...
            patch-22
            patch-23
            patch-42

Cherrypicking changes in this manner isn't necessarily easy or even practical. It depends, for example, on the `mainline` changes being "clean changesets" (see Using commit Well -- The Idea of a Clean Changeset).

Nevertheless, for some projects, especially those characterized by lots of "forks", this technique can be useful.

Learning Note: The `replay` command also has a `--list` option which can useful for cherrypicking many changes at once. If you find yourself using `replay --exact` often, you should take a look at the `--list` option in `larch replay --help` .

arch Meets hello-world: A Tutorial Introduction to The arch Revision Control System
The Hackerlab at `regexps.com`