Differences between revisions 4 and 10 (spanning 6 versions)
Revision 4 as of 2008-03-24 10:39:15
Size: 2146
Editor: abuehl
Comment: new layout using included subpages in table
Revision 10 as of 2008-04-05 09:59:20
Size: 2959
Editor: abuehl
Comment:
Deletions are marked like this. Additions are marked like this.
Line 5: Line 5:
Suppose you have a repository with a number of changesets which you
want to combine into a single changeset.
Suppose you have a [:Repository:repository] with a number of [:ChangeSet:changesets]
which you want to combine into a single changeset. This can be done using operations
[:Clone:clone], [:Push:push], and [:Pull:pull]. But let's make the following assumptions:
Line 8: Line 9:
This can be done as follows using only the basic operations of
mercurial, namely clone, push, pull.
 * The repository in question has a single [:Head:head], and you want to combine the last k [:Revision:revisions] into a single revision.
 * The base revision is called R, and the ending revision is called R+k.
 * The repository has no [:LocalModifications:local modifications].
Line 11: Line 13:
For simplicity, let us assume that the repository in question has a
single head, and you want to combine the last k revisions into a
single revision.
What we do is create a [:Branch:branch] whose root revision is R and which consists of one[[FootNote(Actually it can be multiple changesets. The principle is the same, but for simplicity let us assume one.)]] changeset (result of step 3 below). The procedure is as follows:
Line 15: Line 15:
For concreteness, let us call the base revision R, and the ending
revision R+k.
'''~+{{{1: hg update R}}}+~'''
Line 18: Line 17:
Let us furthermore assume the repository has no local changes.  This [:Update:updates] the [:WorkingDirectory:working directory] to revision R.
 Specifically, this means that the contents of the working directory are
 changed to that of revision R, and that R becomes the [:Parent:parent]
 of the working directory.
Line 20: Line 22:
The strategy is to take advantage of mercurial's support for
repositories with more than one head. What we do is create a branch
whose root revision is R and which consists of just one changeset
(actually it can be multiple changesets, the principle is the same,
but for simplicity let us assume one).
Line 26: Line 23:
Diagramatically, this looks like: '''~+{{{2: hg revert -r tip --all}}}+~'''
Line 28: Line 25:
|| [[Include(/fig1)]] || [[Include(/fig2)]] || [[Include(/fig3)]] ||
||<:> [:/fig1:fig 1] ||<:> [:/fig2:fig 2] ||<:> [:/fig2:fig 3] ||
 {{{#!dot
digraph {
  rankdir = LR;
  node [shape=box];
  "working directory" -> R [label="1. update"];
  R -> "R+1" -> "R+2";
  "R+2" -> "R+k" [style=dashed];
  "working directory" -> "R+k" [color=red label="2. revert"];
  "working directory" [shape=ellipse];
}}}
Line 31: Line 36:
The procedure is as follows.  This [:Revert:reverts] the working directory to its contents at [:Tip:tip].
 Since the parent of the working directory is still R, this means that
 the combined contents of all changesets between R and R+k show up as
 the modifications in the working directory.
Line 33: Line 41:
 1. hg update R
    This updates the working directory to revision R. Specifically, this
    means that the contents of the working directory are changed to that
    of revision R, and that R becomes the parent of the working directory.
Line 38: Line 42:
 2. hg revert -r tip --all
    This reverts the working directory to its contents at tip.
    Since the parent of the working directory is still R, this means that
    the combined contents of all changesets between R and R+k show up as
    the modifications in the working directory.
'''~+{{{3: hg ci -m "Combined changesets between R and R+k"}}}+~'''
Line 44: Line 44:
 3. hg ci -m "Combined changesets between R and R+k"
    At this point, committing these modifications will create a changeset
    containing all combined changesets between revisions R and R+k.
 {{{#!dot
digraph {
  rankdir = LR;
  node [shape=box];
  "working directory" -> "R+k (concatenated)" [color=red label="3. commit"];
  "working directory" -> R [style=invis];
  R -> "R+k (concatenated)";
  R -> "R+1" -> "R+2";
  "R+2" -> "R+k" [style=dashed];
  "working directory" [shape=ellipse];
}}}
Line 48: Line 56:
 4. hg clone -r tip oldrepo newrepo
    This assumes you want to get rid of your individual changesets
    (which are a dangling branch in oldrepo) and just keep the combined
    changeset. newrepo will now just have the combined changeset.
 At this point, [:Commit:committing] these modifications will create a
 changeset containing all combined changesets between revisions R and R+k.


'''~+{{{4: hg clone -r tip oldrepo newrepo}}}+~'''

 {{{#!dot
digraph {
  rankdir = LR;
  node [shape=box];
  "working directory" -> R [style=invis];
  "working directory" -> "R+k (concatenated)" [color=red label="4. clone -r tip"]
  R -> "R+k (concatenated)"
  "working directory" [shape=ellipse label="cloned working directory"]
}}}

 This assumes you want to get rid of your individual changesets (which are a dangling branch in oldrepo) and just keep the combined changeset (see also [:PruningDeadBranches]). newrepo will now just have the combined changeset.

Concatenating multiple changesets into one changeset

(See also [:EditingHistory])

Suppose you have a [:Repository:repository] with a number of [:ChangeSet:changesets] which you want to combine into a single changeset. This can be done using operations [:Clone:clone], [:Push:push], and [:Pull:pull]. But let's make the following assumptions:

  • The repository in question has a single [:Head:head], and you want to combine the last k [:Revision:revisions] into a single revision.

  • The base revision is called R, and the ending revision is called R+k.
  • The repository has no [:LocalModifications:local modifications].

What we do is create a [:Branch:branch] whose root revision is R and which consists of oneFootNote(Actually it can be multiple changesets. The principle is the same, but for simplicity let us assume one.) changeset (result of step 3 below). The procedure is as follows:

1: hg update R

  • This [:Update:updates] the [:WorkingDirectory:working directory] to revision R. Specifically, this means that the contents of the working directory are changed to that of revision R, and that R becomes the [:Parent:parent] of the working directory.

2: hg revert -r tip --all

  • This [:Revert:reverts] the working directory to its contents at [:Tip:tip]. Since the parent of the working directory is still R, this means that the combined contents of all changesets between R and R+k show up as the modifications in the working directory.

3: hg ci -m "Combined changesets between R and R+k"

  • At this point, [:Commit:committing] these modifications will create a changeset containing all combined changesets between revisions R and R+k.

4: hg clone -r tip oldrepo newrepo

  • This assumes you want to get rid of your individual changesets (which are a dangling branch in oldrepo) and just keep the combined changeset (see also [:PruningDeadBranches]). newrepo will now just have the combined changeset.


CategoryTipsAndTricks

ConcatenatingChangesets (last edited 2013-10-10 10:48:33 by RamiroMorales)