Differences between revisions 7 and 9 (spanning 2 versions)
Revision 7 as of 2010-07-03 17:10:33
Size: 4005
Editor: JohanSamyn
Comment:
Revision 9 as of 2010-07-04 10:20:11
Size: 4063
Editor: JohanSamyn
Comment:
Deletions are marked like this. Additions are marked like this.
Line 17: Line 17:
 1. hg update -C -r <rev-to-backout>
 * hg revert --all -r <parent of rev-to-backout>
 * hg commit
 * hg update -C <startrev>
There's a fifth step that is done automatically if you specify --merge:
 5.#5 hg merge (with <startrev>)
 1. `hg update -C -r <rev-to-backout>`
 * `hg revert --all -r <parent of rev-to-backout>`
 * `hg commit`
 * `hg update -C -r <startrev>`
There's a fifth step that is done automatically if you specify `--merge` :
 5.#5 `hg merge` (with <startrev>)
Line 24: Line 24:
 6.#6 hg commit (the result of merging)
When step 3 (commit) aborts, you're left with the first two steps completed and you can either `commit` yourself or `update -C` to abandon the process.<<BR>>
 6.#6 `hg commit` (the result of merging)
When step 3 (commit) aborts, you're left with the first two steps completed and you can either:
 * ` hg commit
` yourself to complete it, or
 * ` hg
update -C ` to abandon the process
Line 121: Line 123:
When we try this using the separate steps, and we omit step 4, we get a slightly different graph : note the reversed order of the parents in changeset 5. When we try this using the separate steps, and we omit step 4, we get a slightly different graph. Note the reversed order of the parents in changeset 5:0eeac5ff9c76.

Backout

hg backout [OPTION]... [-r] REV

Revert the effect of an earlier changeset.

Backout works by applying a changeset that's the opposite of the changeset to be backed out. That new changeset is committed to the repository, and eventually merged.

Help text: http://www.selenic.com/mercurial/hg.1.html#backout

0.1. Here's some more detail from Matt about the inner workings (and slightly adapted by experience)

(see also this email thread)

Let <startrev> be the revision we're at when we start the backout.
Backout is basically four steps rolled into one:

  1. hg update -C -r <rev-to-backout>

  2. hg revert --all -r <parent of rev-to-backout>

  3. hg commit

  4. hg update -C -r <startrev>

There's a fifth step that is done automatically if you specify --merge :

  1. hg merge (with <startrev>)

And there's a sixth, manual step:

  1. hg commit (the result of merging)

When step 3 (commit) aborts, you're left with the first two steps completed and you can either:

  •  hg commit  yourself to complete it, or

  •  hg update -C  to abandon the process

Step 4 assures the parents of the committed merge changeset are in the right order. That is : parent1 = <startrev>, and parent2 = <the new backout rev>.

0.2. An example:

$ hg init borepo
$ cd borepo
$ echo line1 > file.txt
$ echi line2 >> file.txt
$ hg ci -Am "add file"

Edit file.txt, so it contains:

line1
line1a
line2

Commit and add a few more changesets:

$ hg ci -m "add line1a"
$ echo line3 >> file.txt
$ hg ci -m "add line3"
$ echo line4 >> file.txt
$ hg ci -m "add line4"

Which produces the following (somewhat shortened) graph:

@  changeset:   3:36b1c0649d3e
|  tag:         tip
|  summary:     add line4
|
o  changeset:   2:2612107e45fe
|  summary:     add line3
|
o  changeset:   1:1f33c361852e
|  summary:     add line1a
|
o  changeset:   0:e3e45b087239
   summary:     add file

Now we backout changeset 1:1f33c361852e.

$ hg backout -r 1

The graph is now:

o  changeset:   4:c3daad6d657d
|  tag:         tip
|  parent:      1:1f33c361852e
|  summary:     Backed out changeset 1f33c361852e
|
| @  changeset:   3:36b1c0649d3e
| |  summary:     add line4
| |
| o  changeset:   2:2612107e45fe
|/   summary:     add line3
|
o  changeset:   1:1f33c361852e
|  summary:     add line1a
|
o  changeset:   0:e3e45b087239
   summary:     add file

We merge and commit, yielding the final graph:

@    changeset:   5:236d8d74edf8
|\   tag:         tip
| |  parent:      3:36b1c0649d3e
| |  parent:      4:c3daad6d657d
| |  summary:     merge backout
| |
| o  changeset:   4:c3daad6d657d
| |  parent:      1:1f33c361852e
| |  summary:     Backed out changeset 1f33c361852e
| |
o |  changeset:   3:36b1c0649d3e
| |  summary:     add line4
| |
o |  changeset:   2:2612107e45fe
|/   summary:     add line3
|
o  changeset:   1:1f33c361852e
|  summary:     add line1a
|
o  changeset:   0:e3e45b087239
   summary:     add file

And file.txt looks like:

line1
line2
line3
line4



When we try this using the separate steps, and we omit step 4, we get a slightly different graph. Note the reversed order of the parents in changeset 5:0eeac5ff9c76.

@    changeset:   5:0eeac5ff9c76
|\   tag:         tip
| |  parent:      4:cbca219e80e1
| |  parent:      3:f82e9468d652
| |  summary:     merge backout
| |
| o  changeset:   4:cbca219e80e1
| |  parent:      1:0cf85b44002c
| |  summary:     backout
| |
o |  changeset:   3:f82e9468d652
| |  summary:     add line4
| |
o |  changeset:   2:24ceac6b9018
|/   summary:     add line3
|
o  changeset:   1:0cf85b44002c
|  summary:     add line1a
|
o  changeset:   0:73af1be51d81
   summary:     add file



See also: Update, Revert, Commit, Merge


CategoryCommand

Backout (last edited 2019-11-01 00:19:51 by IanMoody)