docs/obs-concept.rst
author Patrick Mezard <patrick@mezard.eu>
Tue, 12 Jun 2012 13:28:39 +0200
changeset 265 24943df310d4
parent 234 d32c07269dcd
child 357 b398e9c2dbd1
permissions -rw-r--r--
amend: do not traceback on no-ops If rewrite() generated changeset happened to be an existing one, the call would traceback when trying to obsolete the changeset with itself. Instead, leave gracefully, marking any intermediate changeset extinct.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
184
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
     1
-----------------------------------------------------------
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
     2
Why Do We Need a New Concept
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
     3
-----------------------------------------------------------
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
     4
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
     5
Current DVCS are great tools to forge a series of flawless changeset on your own.
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
     6
But they perform poorly when it comes to **sharing** some work in progress and
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
     7
**collaborating** on such work in progress.
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
     8
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
     9
When people forge a new version of a changeset they actually create a
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
    10
new changeset and get rid of the original changeset. Difficulties to
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    11
collaborate mostly came from the way old content is *removed* from
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    12
a repository.
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    13
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    14
Mercurial Approach: Strip
184
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
    15
-----------------------------------------------------
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    16
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    17
With the current version of mercurial, every changeset that exists in
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    18
your repository is *visible* and *meaningful*. To delete old
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    19
(rewritten) changesets, mercurial removes them from the repository
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    20
storage with an operation called *strip*. After the *stripping*, the
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    21
repository looks like if the changeset never existed.
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    22
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
    23
This approach is simple and effective except for one big
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    24
drawback: you can remove changesets from **your repository only**. If
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    25
a stripped changeset exists in another repository it touches, it will
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    26
show up again. This is because a shared changeset becomes
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    27
part of a shared global history. Stripping a changeset from all
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    28
repositories is at best impractical and in most case impossible!
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    29
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    30
As consequence, **you can not rewrite something once you exchange it with
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    31
others**. The old version will still exist along side the new one [#]_.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    32
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    33
Moreover stripping changesets creates backup bundles. This allows
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    34
restoration of the deleted changesets, but the process is painful.
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    35
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    36
Finally, as the repository format is not optimized for deletion. stripping a
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    37
changeset may be slow in some situations.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    38
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    39
To sum up, the strip approach is very simple but does not handle
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    40
interaction with the outer world, which is very unfortunate for a
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    41
*Distributed* VCS.
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    42
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    43
.. [#] various work around exists but they require their own workflows which are distinct from the very elegant basic workflow of Mercurial.
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    44
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    45
Git Approach: Overwrite Reference
184
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
    46
-----------------------------------------------------
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    47
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    48
The Git approach to repository structure is a bit more complex: there
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    49
can be any amount of unrelated changesets in a repository, and **only
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    50
changesets referenced by a git branch** are *visible* and
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    51
*meaningful*.
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    52
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    53
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    54
.. warning:: add a schema::
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    55
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    56
        C
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    57
        | B---<foo>
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    58
        |/
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    59
        |
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    60
        A
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    61
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    62
    Only B and A are visible.
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    63
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    64
This simplifies the process of getting rid of old changesets. You can
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    65
just leave them in place and move the reference on the new one. You
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
    66
can then propagate this change by moving the git-branch on remote host
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    67
with the newer version of the marker overwriting the older one.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    68
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    69
This approach goes a bit further but still has a major drawback:
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    70
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    71
Because you **overwrite** the git-branch, you have no conflict resolution. The last
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    72
to act wins. This makes collaboration on multiple changesets difficult because
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    73
you can't merge concurrent updates on a changeset.
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    74
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
    75
Every overwrite is a forced operation where the operator says "Yes I want this to
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    76
replace that. In highly distributed environments, a user may end up with conflicting
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    77
references and no proper way to choose.
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    78
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    79
Because of this way to visualize a repository, git-branches are a core
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
    80
part of git, which makes the user interface more complicated and
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
    81
constrains moving through history.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    82
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
    83
Finally, even if all older changesets still exist in the repository, accesing them
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    84
is still painful.
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    85
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    86
184
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
    87
-----------------------------------------------------
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
    88
The Obsolete Marker Concept
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
    89
-----------------------------------------------------
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    90
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
    91
193
adf92ff8d4f6 merge arne change
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 192
diff changeset
    92
As None of the concepts was powerful enough to fulfill the need of safely
adf92ff8d4f6 merge arne change
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 192
diff changeset
    93
rewriting history, including easy sharing and collaborating on mutable history,
228
5a17c0d41a00 proof-read documentation and docstrings
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 227
diff changeset
    94
we needed another one. 
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    95
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    96
Basic concept
184
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
    97
-----------------------------------------------------
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    98
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    99
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   100
Every history rewriting operation stores the information that old rewritten
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   101
changeset is replaced by newer version in a given set of changesets.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   102
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   103
All basic history rewriting operation can create an appropriate obsolete marker.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   104
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   105
163
92b073d13f2d more doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 161
diff changeset
   106
.. figure:: ./figures/example-1-update.*
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   107
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   108
    *Updating* a changeset
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   109
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   110
    Create one obsolete marker: ``([A'] obsolete A)``
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   111
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   112
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   113
163
92b073d13f2d more doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 161
diff changeset
   114
.. figure:: ./figures/example-2-split.*
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   115
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   116
    *Splitting* a changeset in multiple one
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   117
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   118
    Create one obsolete marker ``([B1, B2] obsolete B)]``
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   119
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   120
234
d32c07269dcd [doc] fix bad include
Pierre-Yves.David@ens-lyon.org
parents: 228
diff changeset
   121
.. figure:: ./figures/simple-3-merge.*
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   122
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   123
    *Merging* multiple changeset in a single one
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   124
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   125
    Create two obsolete markers ``([C] obsolete A), ([C] obsolete B)``
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   126
234
d32c07269dcd [doc] fix bad include
Pierre-Yves.David@ens-lyon.org
parents: 228
diff changeset
   127
.. figure:: ./figures/simple-4-reorder.*
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   128
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   129
    *Moving* changeset around
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   130
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   131
    Reordering those two changesets need two obsolete markers:
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   132
    ``([A'] obsolete A), ([B'] obsolete B)``
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   133
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   134
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   135
234
d32c07269dcd [doc] fix bad include
Pierre-Yves.David@ens-lyon.org
parents: 228
diff changeset
   136
.. figure:: ./figures/simple-5-delete.*
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   137
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   138
    *Removing* a changeset:
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   139
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   140
    One obselete marker ``([] obsolete B)``
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   141
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   142
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   143
To conclude, a single obsolete marker express a relation from **0..n** new
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   144
changesets to **1** old changeset.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   145
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   146
Basic Usage
184
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
   147
-----------------------------------------------------
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   148
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   149
Obsolete markers create a perpendicular history: **a versioned changeset graph**. This means that offers the same features we have for
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   150
versioned files but applied to changeset:
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   151
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   152
First: we can display a **coherent view** of the history graph in which only a
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   153
single version of your changesets is displayed by the UI.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   154
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   155
Second, because obsolete changeset content is still **available**. You can 
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   156
you can
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   157
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   158
    * **browse** the content of your obsolete commits,
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   159
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   160
    * **compare** newer and older versions of a changeset,
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   161
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   162
    * **restore** content of previously obsolete changesets.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   163
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   164
Finally, the obsolete marker can be **exchanged between
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   165
repositories**. You are able to share the result on your history
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   166
rewriting operations with other prople and **collaborate on the
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   167
mutable part of the history**.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   168
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   169
Conflicting history rewriting operation can be detected and
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   170
**resolved** as easily as conflicting changes on a file.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   171
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   172
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   173
Detecting and solving tricky situations
184
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
   174
-----------------------------------------------------
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   175
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   176
History rewriting can lead to complex situations. The obsolete marker
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   177
introduces a simple representation for this complex reality. But
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   178
people using complex workflows will one day or another have to face
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   179
the intrinsic complexity of some real-world situation.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   180
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   181
This section describes possible situations, defines precise sets of
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   182
changesets involved in such situations and explains how the error
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   183
cases can be resolved automatically using the available information.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   184
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   185
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   186
Obsolete changesets
184
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
   187
````````````````````
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   188
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   189
Old changesets left behind by obsolete operation are called **obsolete**.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   190
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   191
With the current version of mercurial, this *obsolete* part is stripped from the
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   192
repository before the end of every rewriting operation.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   193
163
92b073d13f2d more doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 161
diff changeset
   194
.. figure:: ./figures/error-obsolete.*
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   195
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   196
    Rebasing `B` and `C` on `A` (as `B'`, `C'`)
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   197
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   198
    This rebase operation added two obsolete markers from new changesets to old
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   199
    changesets. These two old changesets are now part of the *obsolete* part of the
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   200
    history.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   201
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   202
In most cases, the obsolete set will be fully hidden to both the UI and
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   203
discovery, hence users do not have to care about them unless they want to
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   204
audit history rewriting operations.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   205
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   206
Unstable changesets
184
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
   207
```````````````````
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   208
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   209
While exploring the possibilities of the obsolete marker a bit further, you may end up with
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   210
*obsolete* changesets which have *non-obsolete* children. There is two common ways to
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   211
achieve this:
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   212
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   213
* Pull a changeset based of an old version of a changeset [#]_.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   214
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   215
* Use a partial rewriting operation. For example amend on a changeset with
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   216
  children.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   217
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   218
*Non-obsolete* changeset based on *obsolete* one are called **unstable**
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   219
163
92b073d13f2d more doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 161
diff changeset
   220
.. figure:: ./figures/error-unstable.*
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   221
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   222
    Amend `A` into `A'` leaving `B` behind.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   223
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   224
    In this situation we can not consider `B` as *obsolete*.  But we have all
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   225
    necessary data to detect `B` as an *unstable* branch of the history because
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   226
    its parent `A` is *obsolete*. In addition, we have enough data to
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   227
    automatically resolve this instability: we know that the new version of `B`
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   228
    parent (`A`) is `A'`, We can deduce that we should rebase `B` on `A'` to get
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   229
    a stable history again.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   230
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   231
Proper warnings should be issued when part of the history becomes
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   232
unstable. The UI will be able to use the obsolete marker to
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   233
automatically suggest a resolution to the user of even carry them out
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   234
for him.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   235
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   236
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   237
XXX details on automatic resolution for
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   238
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   239
* movement
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   240
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   241
* handling deletion
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   242
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   243
* handling split on multiple head
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   244
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   245
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   246
.. [#] For this to happen one needs to explicitly enable exchange of draft
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   247
       changesets. See phase help for details.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   248
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   249
The two parts of the obsolete set
184
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
   250
``````````````````````````````````````
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   251
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   252
The previous section shows that there could be two kinds of *obsolete*
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   253
changesets:
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   254
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   255
* an *obsolete* changeset with no or *obsolete* only descendants is called **extinct**.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   256
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   257
* an *obsolete* changeset with *unstable* descendants is called **suspended**.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   258
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   259
163
92b073d13f2d more doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 161
diff changeset
   260
.. figure:: ./figures/error-extinct.*
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   261
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   262
    Amend `A` and `C` leaving `B` behind.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   263
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   264
    In this example we have two *obsolete* changesets: `C` with no *unstable*
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   265
    children is *extinct*. `A` with *unstable* descendant (`B`) is *suspended*.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   266
    `B` is *unstable* as before.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   267
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   268
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   269
Because nothing outside the obsolete set default on *extinct* changesets, they
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   270
can be safely hidden in the UI and even garbage collected. *Suspended* changesets
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   271
have to stay visible and available until their unstable descendant are rewritten
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   272
into stable version.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   273
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   274
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   275
Conflicting rewrites
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   276
````````````````````
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   277
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   278
If people start to concurrently edit the same part of the history they will
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   279
likely meet conflicting situations when a changeset has been rewritten in two
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   280
different ways.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   281
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   282
163
92b073d13f2d more doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 161
diff changeset
   283
.. figure:: ./figures/error-conflicting.*
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   284
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   285
    Conflicting rewrite of `A` into `A'` and `A''`
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   286
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   287
This kind of conflict is easy to detect with an obsolete marker
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   288
because an obsolete changeset can have more than one new version. It
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   289
may be seen as the multiple heads case. Mercurial warns you about this
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   290
on pull. It is resolved the same way by a merge of A' and A'' that
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   291
will keep the same parent than `A'` and `A''` with two obsolete
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   292
markers pointing to both `A` and `A'`
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   293
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   294
.. warning::  TODO: Add a schema of the resolution. (merge A' and A'' with A as
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   295
              ancestor and graft the result of A^)
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   296
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   297
Allowing multiple new changesets to obsolete a single one allows to
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   298
distinguish a split changeset from a history rewriting conflict.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   299
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   300
Reliable history
184
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
   301
``````````````````````
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   302
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   303
Obsolete marker help to smooth rewriting operation process. However they
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   304
do not change the fact that **you should only rewrite the mutable part of the
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   305
history**. The phase concept enforces this rule by explicitly defining a
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   306
public immutable set of changesets. Rewriting operations refuse to work on
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   307
public changesets, but there are still some corner cases where previously rewritten changesets
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   308
are made public.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   309
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   310
Special rules apply for obsolete markers pointing to public changesets:
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   311
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   312
* Public changesets are excluded from the obsolete set (public
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   313
  changesets are never hidden or candidate to garbage collection)
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   314
192
706a3a57b567 docs: Merged obs-concept changes by hand.
Arne Babenhauserheide <bab@draketo.de>
parents: 191 186
diff changeset
   315
* *newer* version of a public changeset are called **latecomer** and highlighted as
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   316
  an error case.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   317
173
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   318
Solving such an error is easy. Because we know what changeset a
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   319
*latecomer* tries to rewrite, we can easily compute a smaller
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   320
changeset containing only the change from the old *public* to the new
4d44a37d51d1 many fixes
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 166
diff changeset
   321
*latecomer*.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   322
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   323
.. warning:: add a schema
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   324
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   325
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   326
Conclusion
184
f047cd4f1235 backout obs-concept.rst changes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 176
diff changeset
   327
----------------
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   328
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   329
The obsolete marker is a powerful concept that allows mercurial to safely handle
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   330
history rewriting operations. It is a new type of relation between Mercurial
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   331
changesets which tracks the result of history rewriting operations.
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   332
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   333
This concept is simple to define and provides a very solid base for:
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   334
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   335
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   336
- Very fast history rewriting operations,
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   337
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   338
- auditable and reversible history rewriting process,
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   339
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   340
- clean final history,
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   341
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   342
- sharing and collaborating on the mutable part of the history,
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   343
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   344
- gracefully handling history rewriting conflicts,
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   345
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
   346
- various history rewriting UI’s collaborating with an underlying common API.
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   347
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   348
.. list-table:: Comparison on solution [#]_
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   349
   :header-rows: 1
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   350
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   351
   * - Solution
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   352
     - Remove changeset locally
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   353
     - Works on any point of your history
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   354
     - Propagation
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   355
     - Collaboration
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   356
     - Speed
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   357
     - Access to older version
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   358
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   359
   * - Strip
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   360
     - `+`
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   361
     - `+`
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   362
     - \
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   363
     - \ 
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   364
     - \ 
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   365
     - `- -`
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   366
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   367
   * - Reference
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   368
     - `+`
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   369
     - \ 
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   370
     - `+`
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   371
     - \ 
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   372
     - `+`
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   373
     - `-`
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   374
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   375
   * - Obsolete
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   376
     - `+`
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   377
     - `+`
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   378
     - `++`
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   379
     - `++`
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   380
     - `+`
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   381
     - `+`
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   382
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   383
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   384
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   385
.. [#] To preserve good tradition in comparison table, an overwhelming advantage
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
   386
       goes to the defended solution.