annotate docs/obs-concept.rst @ 191:0f1b8119a281

Backed out backout changeset f047cd4f1235
author Arne Babenhauserheide <bab@draketo.de>
date Wed, 28 Mar 2012 11:35:53 +0200
parents f047cd4f1235
children 706a3a57b567
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
1 ==============================
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
2 Why Do We Need a New Concept
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
3 ==============================
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
4
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
5 Current DVCS are great tool to forge a series of flawless changeset on your own.
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
6 But they perform poorly when is comes to **share** work in progress and
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
7 **collaborate** on such work in progress.
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
8
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
9 When people forge new version of a changeset they create a new changeset and get
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
10 ride of the original changeset. Difficulties to collaborate mostly came from the
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
11 way old content are *removed* from repository.
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
12
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
13 Mercurial Approach: Strip
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
14 =========================
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
15
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
16 With current version of mercurial, every changesets that exist in your
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
17 repository are *visible* and *meaningful*. To get ride of old changeset you
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
18 rewrote mercurial remove them from the repository storage. with an operation
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
19 called *strip*. After the *strip* the repository looks like if the changeset
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
20 never existed.
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
21
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
22 This approach is simple and effective but have a very big drawback: You can
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
23 remove changesets from **your repository only**. If strip exists in other
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
24 repositories it will show of again and again. This only cure for this is to
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
25 strip the offending changeset from all repository. And operation at best
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
26 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
27
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
28
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
29 As consequence, **you can not rewrite something once you exchange it with
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
30 others**. The old version will still exists along side the new one [#]_.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
31
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
32 Moreover stripping changesets creates backup bundles. This allows
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
33 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
34
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
35 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
36 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
37
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
38 To sum up, the strip approach is very simple but does not handle interaction
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
39 with the outer world. Which is unfortunate for a *Distributed* VCS.
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
40
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
41 .. [#] 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
42
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
43 Git Approach: Overwrite Reference
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
44 =================================
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
45
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
46 Git approach for repository is a bit more complex: Any number of
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
47 changesets can exist in a repository. but **only changesets referenced by a git
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
48 branch** are *visible* and *meaningful*.
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
49
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
50
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
51 .. warning:: add a schema::
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
52
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
53 C
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
54 | B---<foo>
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
55 |/
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
56 |
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
57 A
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 Only B and A are visible.
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
60
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
61 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
62 just leave them in place and move the reference on the new one. You
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
63 can then propagate that change by moving the git-branch on remote host
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
64 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
65
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
66 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
67
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
68
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
69 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
70 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
71 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
72
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
73 Every overwrite is a forced operation where the operator say "Yes I want this to
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
74 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
75 references and no proper way to choose.
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
76
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
77 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
78 part of git, which makes the user interface more complicated and
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
79 constrains the ways to move through history.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
80
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
81 Finally, even if all older changeset still exist in the repository, access to them
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
82 is still painful.
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
83
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
84
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
85 =============================
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
86 The Obsolete Marker Concept
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
87 =============================
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
88
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
89
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
90
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
91
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
92
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
93 As None of the concepts was powerful enough to fulfill the need of safely rewriting
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
94 history, including easy sharing and collaborating on mutable history, we needed another one.
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
95
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
96
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
97
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
98 Basic concept
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
99 =============
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
100
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
101
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
102 Every history rewriting operation stores the information that the old rewritten
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
103 changeset is replaced by newer version in a given set of changeset.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
104
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
105 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
106
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
107
163
92b073d13f2d more doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 161
diff changeset
108 .. figure:: ./figures/example-1-update.*
161
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 *Updating* a changeset
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 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
113
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
114
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
115
163
92b073d13f2d more doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 161
diff changeset
116 .. figure:: ./figures/example-2-split.*
161
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 *Splitting* a changeset in multiple one
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 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
121
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
122
163
92b073d13f2d more doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 161
diff changeset
123 .. figure:: ./figures/example-3-merge.*
161
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 *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
126
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
127 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
128
163
92b073d13f2d more doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 161
diff changeset
129 .. figure:: ./figures/example-4-reorder.*
161
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 *Moving* changeset around
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
132
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
133 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
134 ``([A'] obsolete A), ([B'] obsolete B)``
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
135
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
136
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
137
163
92b073d13f2d more doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 161
diff changeset
138 .. figure:: ./figures/example-5-delete.*
161
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 *Removing* a changeset:
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 One obselete marker ``([] obsolete B)``
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
143
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
144
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
145 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
146 changesets to **1** old changeset.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
147
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
148 Basic Usage
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
149 ===========
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
150
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
151 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
152 versioned files but applied to changeset:
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
153
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
154 First: we can display a **coherent view** of the history graph in which only a
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
155 single version of your changesets are displayed by the UI.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
156
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
157 Second, because obsolete changeset content is still **available**. You can
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
158
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
159 * **browse** the content of your obsolete commit,
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
160
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
161 * **compare** newer and older version of a changeset,
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
162
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
163 * **restore** content of previously obsolete changeset.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
164
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
165 Finally, obsolete marker can be **exchanged between repositories**. You are able to
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
166 share the result on your history rewriting operation with other and **collaborate
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
167 on mutable part of the history**.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
168
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
169 Conflicting history rewriting operation can be detected and **resolved** as easily
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
170 as conflicting changes on file.
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
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
173 Detecting and solving tricky situations
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
174 ======================================
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
175
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
176 History rewriting can lead to complex situations. Obsolete marker introduce a
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
177 simple representation of this complex reality. But people using complex workflows
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
178 will one day or another have to face the intrinsic complexity of some
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
179 situations.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
180
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
181 This section describes possible situations, defines precise sets of changesets
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
182 involved in such situations and explains how error cases can automatically be
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
183 resolved using available information.
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
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
186 obsolete changesets
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
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
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
202 In most cases, the obsolete set will be fully hidden to both UI and discovery so
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
203 the user does not have to care about them unless he wants to audit the history rewriting
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
204 operation.
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
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
207 -------------------
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
208
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
209 While exploring the possibilities of the obsolete a bit further, you may end up with
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
210 *obsolete* changeset 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
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
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
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
231 Proper warning should be issued when part of the history become unstable. UI
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
232 will be able to use the obsolete marker to automatically suggest resolution to
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
233 the user of even carry them out for him.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
234
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
235
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
236 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
237
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
238 * movement
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
239
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
240 * handling deletion
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
241
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
242 * handling split on multiple head
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
243
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 .. [#] 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
246 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
247
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
248 The two part of the obsolete set
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
249 --------------------------------
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
250
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
251 The previous section show that there can be two kinds of an *obsolete* changeset:
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
252
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
253
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
254 * 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
255
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
256 * 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
257
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
258
163
92b073d13f2d more doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 161
diff changeset
259 .. figure:: ./figures/error-extinct.*
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
260
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
261 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
262
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
263 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
264 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
265 `B` is *unstable* as before.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
266
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 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
269 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
270 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
271 into stable version.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
272
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
273
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
274 Conflicting rewrites
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
275 ---------------------
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
276
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
277 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
278 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
279 different ways.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
280
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
281
163
92b073d13f2d more doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 161
diff changeset
282 .. figure:: ./figures/error-conflicting.*
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
283
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
284 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
285
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
286 This kind of conflict is easy to detect with obsolete markers, because an obsolete
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
287 changeset can have more than one new version. It may be seen as the multiple heads
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
288 case which Mercurial warns you about on pull. It is resolved the same way by a merge of
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
289 A' and A'' that will keep the same parent than `A'` and `A''` with two obsolete
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
290 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
291
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
292 .. 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
293 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
294
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
295 Allowing multiple new changesets to obsolete a single one allows to differenciate
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
296 split changesets from history rewriting conflicts.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
297
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
298 Reliable history
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
299 ----------------
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
300
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
301 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
302 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
303 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
304 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
305 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
306 are made public.
161
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
307
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
308 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
309
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
310 * Public changesets are excluded from the obsolete set (public changeset are
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
311 never hidden or candidate to garbage collection)
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
312
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
313 * *newer* version of public changeset are said **latecomer** and highlighted as
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
314 error case.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
315
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
316
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
317 Solving such error is easy. Because we know what changeset a *latecomer* try to
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
318 rewrite, we can easily compute a smaller changeset containing only the change
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
319 from the old *public* to the new *latecomer*.
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
320
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
321
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
322 .. warning:: add a schema
4e3f25ba5401 More doc and index with sphynx
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
323
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
324
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
325 Conclusion
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
326 ==========
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
327
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
328 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
329 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
330 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
331
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
332 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
333
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 - Very fast history rewriting operations,
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
336
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
337 - auditable and reversible history rewriting process,
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
338
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
339 - clean final history,
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
340
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
341 - 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
342
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
343 - gracefully handling history rewriting conflicts,
166
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
344
191
0f1b8119a281 Backed out backout changeset f047cd4f1235
Arne Babenhauserheide <bab@draketo.de>
parents: 184
diff changeset
345 - 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
346
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
347 .. list-table:: Comparison on solution [#]_
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
348 :header-rows: 1
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
349
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
350 * - Solution
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
351 - Remove changeset locally
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
352 - Works on any point of your history
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
353 - Propagation
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
354 - Collaboration
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
355 - Speed
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
356 - Access to older version
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
357
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
358 * - Strip
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
359 - `+`
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 * - Reference
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
367 - `+`
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 * - Obsolete
8f8a52cd0b9f big doc update
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 163
diff changeset
375 - `+`
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 .. [#] 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
385 goes to the defended solution.