# HG changeset patch # User Pierre-Yves David # Date 1389332336 28800 # Node ID 4a74288c671c575db0a2dd723cbc119485efe8cc # Parent 6b10897dcba74680cb3050db62bc2de93c69a126 doc: use a symbolic link to point to the tutorial the file was lagging behind a ton. diff -r 6b10897dcba7 -r 4a74288c671c docs/tutorials/tutorial.t --- a/docs/tutorials/tutorial.t Thu Dec 26 17:21:01 2013 -0800 +++ b/docs/tutorials/tutorial.t Thu Jan 09 21:38:56 2014 -0800 @@ -1,774 +1,1 @@ - -Initial setup -------------- - -This Mercurial configuration example is used for testing. -.. Various setup - - $ cat >> $HGRCPATH << EOF - > [ui] - > logtemplate ="{node|short} ({phase}): {desc}\n" - > [diff] - > git = 1 - > [alias] - > # "-d '0 0'" means that the new commit will be at January 1st 1970. - > # This is used for stable hash during test - > amend = amend -d '0 0' - > [extensions] - > hgext.graphlog= - > EOF - - $ hg init local - $ cat >> local/.hg/hgrc << EOF - > [paths] - > remote = ../remote - > other = ../other - > [ui] - > user = Babar the King - > EOF - - $ hg init remote - $ cat >> remote/.hg/hgrc << EOF - > [paths] - > local = ../local - > [ui] - > user = Celestine the Queen - > EOF - - $ hg init other - $ cat >> other/.hg/hgrc << EOF - > [ui] - > user = Princess Flore - > EOF - - -This tutorial uses the following configuration for Mercurial: - -A compact log template with phase data: - - $ hg showconfig ui - ui.slash=True - ui.logtemplate="{node|short} ({phase}): {desc}\n" - -Improved git format diff: - - $ hg showconfig diff - diff.git=1 - -And the graphlog extension - $ hg showconfig extensions - extensions.hgext.graphlog= - -And of course, we anabled the experimental extensions for mutable history: - - $ $(dirname $TESTDIR)/enable.sh >> $HGRCPATH 2> /dev/null - - ------------------------ -Single Developer Usage ------------------------ - -This tutorial shows how to use evolution to rewrite history locally. - - -Fixing mistake with `hg amend` --------------------------------- - -We are versionning a shopping list - - $ cd local - $ cat >> shopping << EOF - > Spam - > Whizzo butter - > Albatross - > Rat (rather a lot) - > Jugged fish - > Blancmange - > Salmon mousse - > EOF - $ hg commit -A -m "Monthy Python Shopping list" - adding shopping - -Its first version is shared with the outside. - - $ hg push remote - pushing to $TESTTMP/remote - searching for changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 1 changes to 1 files - -Later I add additional item to my list - - $ cat >> shopping << EOF - > Egg - > Suggar - > Vinegar - > Oil - > EOF - $ hg commit -m "adding condiment" - $ cat >> shopping << EOF - > Bananos - > Pear - > Apple - > EOF - $ hg commit -m "adding fruit" - -This history is very linear - - $ hg glog - @ d85de4546133 (draft): adding fruit - | - o 4d5dc8187023 (draft): adding condiment - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - -But a typo was made in Babanas! - - $ hg export tip - # HG changeset patch - # User test - # Date 0 0 - # Node ID d85de4546133030c82d257bbcdd9b1b416d0c31c - # Parent 4d5dc81870237d492284826e21840b2ca00e26d1 - adding fruit - - diff --git a/shopping b/shopping - --- a/shopping - +++ b/shopping - @@ -9,3 +9,6 @@ - Suggar - Vinegar - Oil - +Bananos - +Pear - +Apple - -The faulty changeset is in the "draft" phase because it has not been exchanged with -the outside. The first one has been exchanged and is "public" (immutable). - - $ hg glog - @ d85de4546133 (draft): adding fruit - | - o 4d5dc8187023 (draft): adding condiment - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - -hopefully. I can use hg amend to rewrite my faulty changeset! - - $ sed -i'' -e s/Bananos/Banana/ shopping - $ hg diff - diff --git a/shopping b/shopping - --- a/shopping - +++ b/shopping - @@ -9,6 +9,6 @@ - Suggar - Vinegar - Oil - -Bananos - +Banana - Pear - Apple - $ hg amend - -A new changeset with the right diff replace the wrong one. - - $ hg glog - @ 0cacb48f4482 (draft): adding fruit - | - o 4d5dc8187023 (draft): adding condiment - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - $ hg export tip - # HG changeset patch - # User test - # Date 0 0 - # Node ID 0cacb48f44828d2fd31c4e45e18fde32a5b2f07b - # Parent 4d5dc81870237d492284826e21840b2ca00e26d1 - adding fruit - - diff --git a/shopping b/shopping - --- a/shopping - +++ b/shopping - @@ -9,3 +9,6 @@ - Suggar - Vinegar - Oil - +Banana - +Pear - +Apple - -Getting rid of branchy history ----------------------------------- - -While I was working on my list. someone help made a change remotly. - - $ cd ../remote - $ hg up -q - $ sed -i'' -e 's/Spam/Spam Spam Spam/' shopping - $ hg ci -m 'SPAM' - $ cd ../local - -I'll get this remote changeset when pulling - - $ hg pull remote - pulling from $TESTTMP/remote - searching for changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 1 changes to 1 files (+1 heads) - (run 'hg heads .' to see heads, 'hg merge' to merge) - -I now have a new heads. Note that this remote head is immutable - - $ hg log -G - o 9ca060c80d74 (public): SPAM - | - | @ 0cacb48f4482 (draft): adding fruit - | | - | o 4d5dc8187023 (draft): adding condiment - |/ - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - -instead of merging my head with the new one. I'm going to rebase my work - - $ hg diff - $ hg rebase -d 9ca060c80d74 -s 4d5dc8187023 - merging shopping - merging shopping - - -My local work is now rebased on the remote one. - - $ hg log -G - @ 387187ad9bd9 (draft): adding fruit - | - o dfd3a2d7691e (draft): adding condiment - | - o 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - -Removing changesets ------------------------- - -I add new item to my list - - $ cat >> shopping << EOF - > car - > bus - > plane - > boat - > EOF - $ hg ci -m 'transport' - $ hg log -G - @ d58c77aa15d7 (draft): transport - | - o 387187ad9bd9 (draft): adding fruit - | - o dfd3a2d7691e (draft): adding condiment - | - o 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - -I have a new commit but I realize that don't want it. (transport shop list does -not fit well in my standard shopping list) - - $ hg prune . # . is for working directory parent - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - working directory now at 387187ad9bd9 - -The silly changeset is gone. - - $ hg log -G - @ 387187ad9bd9 (draft): adding fruit - | - o dfd3a2d7691e (draft): adding condiment - | - o 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - -Reordering changesets ------------------------- - - -We create two changesets. - - - $ cat >> shopping << EOF - > Shampoo - > Toothbrush - > ... More bathroom stuff to come - > Towel - > Soap - > EOF - $ hg ci -m 'bathroom stuff' -q # XXX remove the -q - - $ sed -i'' -e 's/Spam/Spam Spam Spam/g' shopping - $ hg ci -m 'SPAM SPAM' - $ hg log -G - @ c48f32fb1787 (draft): SPAM SPAM - | - o 8d39a843582d (draft): bathroom stuff - | - o 387187ad9bd9 (draft): adding fruit - | - o dfd3a2d7691e (draft): adding condiment - | - o 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - -.. note: don't amend changeset 7e82d3f3c2cb or 9ca060c80d74 as they are immutable. - -I now want to push to remote all my changes except the bathroom one, which I'm not -totally happy with yet. To be able to push "SPAM SPAM" I need a version of "SPAM SPAM" which is not a child of -"bathroom stuff" - -You can use 'rebase -r' or 'graft -O' for that: - - $ hg up 'p1(8d39a843582d)' # going on "bathroom stuff" parent - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - $ hg graft -O c48f32fb1787 # moving "SPAM SPAM" to the working directory parent - grafting revision 10 - merging shopping - $ hg log -G - @ a2fccc2e7b08 (draft): SPAM SPAM - | - | o 8d39a843582d (draft): bathroom stuff - |/ - o 387187ad9bd9 (draft): adding fruit - | - o dfd3a2d7691e (draft): adding condiment - | - o 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - -We have a new SPAM SPAM version without the bathroom stuff - - $ grep Spam shopping # enough spam - Spam Spam Spam Spam Spam Spam Spam Spam Spam - $ grep Toothbrush shopping # no Toothbrush - [1] - $ hg export . - # HG changeset patch - # User test - # Date 0 0 - # Node ID a2fccc2e7b08bbce6af7255b989453f7089e4cf0 - # Parent 387187ad9bd9d8f9a00a9fa804a26231db547429 - SPAM SPAM - - diff --git a/shopping b/shopping - --- a/shopping - +++ b/shopping - @@ -1,4 +1,4 @@ - -Spam Spam Spam - +Spam Spam Spam Spam Spam Spam Spam Spam Spam - Whizzo butter - Albatross - Rat (rather a lot) - -To make sure I do not push unready changeset by mistake I set the "bathroom -stuff" changeset in the secret phase. - - $ hg phase --force --secret 8d39a843582d - -we can now push our change: - - $ hg push remote - pushing to $TESTTMP/remote - searching for changes - adding changesets - adding manifests - adding file changes - added 3 changesets with 3 changes to 1 files - -for simplicity shake we get the bathroom change in line again - - $ hg rebase -r 8d39a843582d -d a2fccc2e7b08 - merging shopping - $ hg phase --draft . - $ hg log -G - @ 8a79ae8b029e (draft): bathroom stuff - | - o a2fccc2e7b08 (public): SPAM SPAM - | - o 387187ad9bd9 (public): adding fruit - | - o dfd3a2d7691e (public): adding condiment - | - o 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - - - -Splitting change ------------------- - -To be done (currently achieve with "two commit + debugobsolete") - -Collapsing change ------------------- - -To be done (currently achieve with "revert + debugobsolete" or "rebase --collapse") - - - - - - ------------------------ -Collaboration ------------------------ - - -sharing mutable changeset ----------------------------- - -To share mutable changeset with others, just check that the repo you interact -with is "not publishing". Otherwise you will get the previously observe -behavior where exchanged changeset are automatically published. - - $ cd ../remote - $ hg -R ../local/ showconfig phases - -the localrepo does not have any specific configuration for `phases.publish`. It -is ``true`` by default. - - $ hg pull local - pulling from $TESTTMP/local - searching for changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 1 changes to 1 files - (run 'hg update' to get a working copy) - $ hg log -G - o 8a79ae8b029e (public): bathroom stuff - | - o a2fccc2e7b08 (public): SPAM SPAM - | - o 387187ad9bd9 (public): adding fruit - | - o dfd3a2d7691e (public): adding condiment - | - @ 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - - - -We do not want to publish the "bathroom changeset". Let's rollback the last transaction - - $ hg rollback - repository tip rolled back to revision 4 (undo pull) - $ hg log -G - o a2fccc2e7b08 (public): SPAM SPAM - | - o 387187ad9bd9 (public): adding fruit - | - o dfd3a2d7691e (public): adding condiment - | - @ 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - -Let's make the local repo "non publishing" - - $ echo '[phases]' >> ../local/.hg/hgrc - $ echo 'publish=false' >> ../local/.hg/hgrc - $ echo '[phases]' >> .hg/hgrc - $ echo 'publish=false' >> .hg/hgrc - $ hg showconfig phases - phases.publish=false - $ hg -R ../local/ showconfig phases - phases.publish=false - - -I can now exchange mutable changeset between "remote" and "local" repository. - - $ hg pull local - pulling from $TESTTMP/local - searching for changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 1 changes to 1 files - (run 'hg update' to get a working copy) - $ hg log -G - o 8a79ae8b029e (draft): bathroom stuff - | - o a2fccc2e7b08 (public): SPAM SPAM - | - o 387187ad9bd9 (public): adding fruit - | - o dfd3a2d7691e (public): adding condiment - | - @ 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - -Rebasing unstable change after pull ----------------------------------------------- - -Remotely someone add a new changeset on top of the mutable "bathroom" on. - - $ hg up 8a79ae8b029e -q - $ cat >> shopping << EOF - > Giraffe - > Rhino - > Lion - > Bear - > EOF - $ hg ci -m 'animals' - -But at the same time, locally, this same "bathroom changeset" was updated. - - $ cd ../local - $ hg up 8a79ae8b029e -q - $ sed -i'' -e 's/... More bathroom stuff to come/Bath Robe/' shopping - $ hg amend - $ hg log -G - @ ffa278c50818 (draft): bathroom stuff - | - o a2fccc2e7b08 (public): SPAM SPAM - | - o 387187ad9bd9 (public): adding fruit - | - o dfd3a2d7691e (public): adding condiment - | - o 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - - -When we pull from remote again we get an unstable state! - - - $ hg pull remote - pulling from $TESTTMP/remote - searching for changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 1 changes to 1 files (+1 heads) - (run 'hg heads .' to see heads, 'hg merge' to merge) - 1 new unstables changesets - - -The new changeset "animal" is based on an old changeset of "bathroom". You can -see both version showing up in the log. - - $ hg log -G - o 9ac5d0e790a2 (draft): animals - | - | @ ffa278c50818 (draft): bathroom stuff - | | - x | 8a79ae8b029e (draft): bathroom stuff - |/ - o a2fccc2e7b08 (public): SPAM SPAM - | - o 387187ad9bd9 (public): adding fruit - | - o dfd3a2d7691e (public): adding condiment - | - o 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - -The older version 8a79ae8b029e never ceased to exist in the local repo. It was -just hidden and excluded from pull and push. - -.. note:: In hgview there is a nice dotted relation highlighting ffa278c50818 as a new version of 8a79ae8b029e. This is not yet ported to ``hg log -G``. - -There is now an **unstable** changeset in this history. Mercurial will refuse to -share it with the outside: - - $ hg push other - pushing to $TESTTMP/other - searching for changes - abort: push includes an unstable changeset: 9ac5d0e790a2! - (use 'hg stabilize' to get a stable history or --force to ignore warnings) - [255] - - - - -To resolve this unstable state, you need to rebase 9ac5d0e790a2 onto -ffa278c50818. The "hg stabilize" command will do this for you. - -It has a --dry-run option to only suggest the next move. - - $ hg stabilize --dry-run - move:[15] animals - atop:[14] bathroom stuff - hg rebase -r 9ac5d0e790a2 -d ffa278c50818 - -Let's do it - - $ hg rebase -r 9ac5d0e790a2 -d ffa278c50818 - merging shopping - -The old version of bathroom is hidden again. - - $ hg log -G - @ 437efbcaf700 (draft): animals - | - o ffa278c50818 (draft): bathroom stuff - | - o a2fccc2e7b08 (public): SPAM SPAM - | - o 387187ad9bd9 (public): adding fruit - | - o dfd3a2d7691e (public): adding condiment - | - o 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - - -We can push this evolution to remote - - $ hg push remote - pushing to $TESTTMP/remote - searching for changes - adding changesets - adding manifests - adding file changes - added 2 changesets with 2 changes to 1 files (+1 heads) - -remote get a warning that current working directory is based on an obsolete changeset - - $ cd ../remote - $ hg pull local # we up again to trigger the warning. it was displayed during the push - pulling from $TESTTMP/local - searching for changes - no changes found - Working directory parent is obsolete - - $ hg up 437efbcaf700 - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - -Relocating unstable change after prune ----------------------------------------------- - -The remote guy keep working - - $ sed -i'' -e 's/Spam/Spam Spam Spam Spam/g' shopping - $ hg commit -m "SPAM SPAM SPAM" - -I'm pulling its work locally. - - $ cd ../local - $ hg pull remote - pulling from $TESTTMP/remote - searching for changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 1 changes to 1 files - (run 'hg update' to get a working copy) - $ hg log -G - o ae45c0c3092a (draft): SPAM SPAM SPAM - | - @ 437efbcaf700 (draft): animals - | - o ffa278c50818 (draft): bathroom stuff - | - o a2fccc2e7b08 (public): SPAM SPAM - | - o 387187ad9bd9 (public): adding fruit - | - o dfd3a2d7691e (public): adding condiment - | - o 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - -In the mean time I noticed you can't buy animals in a super market and I prune the animal changeset: - - $ hg prune 437efbcaf700 - 1 files updated, 0 files merged, 0 files removed, 0 files unresolved - working directory now at ffa278c50818 - 1 new unstables changesets - - -The animals changeset is still displayed because the "SPAM SPAM SPAM" changeset -is neither dead or obsolete. My repository is in an unstable state again. - - $ hg log -G - o ae45c0c3092a (draft): SPAM SPAM SPAM - | - x 437efbcaf700 (draft): animals - | - @ ffa278c50818 (draft): bathroom stuff - | - o a2fccc2e7b08 (public): SPAM SPAM - | - o 387187ad9bd9 (public): adding fruit - | - o dfd3a2d7691e (public): adding condiment - | - o 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - - $ hg log -r 'unstable()' - ae45c0c3092a (draft): SPAM SPAM SPAM - -# XXX make prune stabilization works -# $ hg stabilize --any -# merging shopping - - $ hg graft -O ae45c0c3092a - grafting revision 17 - merging shopping - - $ hg log -G - @ 20de1fb1cec5 (draft): SPAM SPAM SPAM - | - o ffa278c50818 (draft): bathroom stuff - | - o a2fccc2e7b08 (public): SPAM SPAM - | - o 387187ad9bd9 (public): adding fruit - | - o dfd3a2d7691e (public): adding condiment - | - o 9ca060c80d74 (public): SPAM - | - o 7e82d3f3c2cb (public): Monthy Python Shopping list - - - -Handling Conflicting amend ----------------------------------------------- - -We can detect that multiple diverging/conflicting amendments have been made. There -will be a "evol-merge" command to merge conflicting amendments. - -This command is not ready yet. +../../tests/test-tutorial.t \ No newline at end of file