comparison docs/instability.rst @ 357:b398e9c2dbd1 stable

doc: English proofreading
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Wed, 11 Jul 2012 13:59:06 -0400
parents 2f68c708e10b
children 9f6a77ec66cb
comparison
equal deleted inserted replaced
345:62de989b2a02 357:b398e9c2dbd1
8 An intrinsic contradiction 8 An intrinsic contradiction
9 ----------------------------------- 9 -----------------------------------
10 10
11 XXX starts by talking about getting ride of changeset. 11 XXX starts by talking about getting ride of changeset.
12 12
13 DVCS bring two new major concepts to the Version Control Scene: 13 DVCSes bring two new major concepts to the Version Control Scene:
14 14
15 * History is organized as a robust DAG, 15 * History is organized as a robust DAG,
16 * History can be rewritten. 16 * History can be rewritten.
17 17
18
19 However, the two concepts are in contradiction: 18 However, the two concepts are in contradiction:
20 19
21 To achieve a robust history, three key elements are gathered in *changeset*: 20 To achieve a robust history, three key elements are gathered in *changesets*:
22 21
23 * Full snapshot of the versioned content, 22 * Full snapshot of the versioned content,
24 * Reference to the previous full snapshot used to build the new one, 23 * Reference to the previous full snapshot used to build the new one,
25 * A description of the change who lead from the old content to the new old. 24 * A description of the change who lead from the old content to the new old.
26 25
27 All three elements are to compute a *unique* hash that identify the changeset 26 All three elements are to compute a *unique* hash that identify the changeset
28 (with various other metadata). This identification is a key part of DVCS design. 27 (with various other metadata). This identification is a key part of DVCS design.
29 28
30 This is a very useful property because Changing B parent means changing B 29 This is a very useful property because Changing B parent means
31 content too. This require the creation of **another** changeset which is a good 30 changing B content too. This requires the creation of **another**
32 semantic. 31 changeset, which is semantically good.
33 32
34 :: 33 ::
35 34
36 Schema base, A, B and B' 35 Schema base, A, B and B'
37 36
38 To avoid duplication, the older changeset is usually discarded from accessible 37 To avoid duplication, the older changeset is usually discarded from accessible
39 history. I'm calling them *obsolete* changesets. 38 history. I'm calling them *obsolete* changesets.
40 39
41 40
42 But rewriting a changeset with children does not changes children parent! And 41 But rewriting a changeset with children does not change these
43 because children of the rewritten changeset still **depends** on the older 42 children's parent! And because children of the rewritten changeset
44 "dead" version of the changeset with can not get ride of this dead version. 43 still **depend** on the older "dead" version of the changeset with
44 can not get rid of this dead version.
45 45
46 :: 46 ::
47 47
48 Schema base, A and A' and B. 48 Schema base, A and A' and B.
49 49
50 I'm calling those children **unstable** because they are based one a dead 50 I'm calling these children **unstable** because they are based on a
51 changeset and prevent people to get ride of it. 51 dead changeset and prevent people to get rid of it.
52 52
53 This instability is an **unavoidable consequence** of the strict dependency of 53 This instability is an **unavoidable consequence** of the strict dependency of
54 changeset. History Rewriting history alway need to take it in account and 54 changeset. History Rewriting history alway need to take it in account and
55 provide a way to rewrite the descendant on the new changeset to avoid 55 provide a way to rewrite the descendant on the new changeset to avoid
56 coexistence of the old and new version of a rewritten changeset.. 56 coexistence of the old and new version of a rewritten changeset.
57 57
58 58
59 Everybody is working around the issue 59 Everybody is working around the issue
60 ------------------------------------------------ 60 ------------------------------------------------
61 61
65 65
66 66
67 Rewriting all at once 67 Rewriting all at once
68 `````````````````````````` 68 ``````````````````````````
69 69
70 The simplest way to avoid instability is to ensure rewriting operation always 70 The simplest way to avoid instability is to ensure rewriting
71 ends in a stable situation. This is achieve by rewriting all impacted changeset 71 operations always end in a stable situation. This is achieved by
72 at the same time. 72 rewriting all affected changesets at the same time.
73 73
74 Rewriting all descendants at the same time than the rewritted of a changeset. 74 Rewriting all descendants at the same time when rewriting a changeset.
75 75
76 :: 76 ::
77 77
78 Schema! 78 Schema!
79 79
80 Several Mercurial commands apply it: rebase, collapse, histedit. Mercurial also 80 Several Mercurial commands apply it: rebase, collapse, histedit.
81 refuse to amend changeset with descendant. The git branch design enforce such 81 Mercurial also refuses to amend changeset with descendant. The git
82 approach in git too. 82 branch design enforces such approach in git too.
83 83
84 84
85 However, DVCS are **Distributed**. This means that you do not control what 85 However, DVCS are **Distributed**. This means that you do not control what
86 happen outside your repository. Once a changeset have been exchanged *outside*, 86 happen outside your repository. Once a changeset have been exchanged *outside*,
87 there is no way to be sure it does not have descendants somewhere else. 87 there is no way to be sure it does not have descendants somewhere else.
89 the risk of instability.** 89 the risk of instability.**
90 90
91 Do not rewrite exchanged changeset 91 Do not rewrite exchanged changeset
92 ``````````````````````````````````` 92 ```````````````````````````````````
93 93
94 To work around the issue above, mercurial introduced phases that prevent you to 94 To work around the issue above, Mercurial introduced phases, which
95 rewrite shared changeset and ensure other can't pull certain changeset from you. 95 prevent you from rewriting shared changesets and ensure others can't
96 But this is a very frustrating limitation that prevent you to efficiently share, 96 pull certain changesets from you. But this is a very frustrating
97 review and collaborate on mutable changeset. 97 limitation that prevents you to efficiently sharing, reviewing and
98 98 collaborating on mutable changesets.
99 Git world use another approach to prevent instability. By convention only a 99
100 single developper works on a changeset contained in a named branch. But once 100 In the Git world, they use another approach to prevent instability. By
101 again this is a huge blocker for collaborating. Moreover clueless people 101 convention only a single developper works on a changeset contained in
102 **will** mess up social convention soon or later. 102 a named branch. But once again this is a huge blocker for
103 collaborating. Moreover clueless people **will** mess up social
104 convention soon or later.
103 105
104 106
105 Loose the DAG robustness 107 Loose the DAG robustness
106 ```````````````````````````` 108 ````````````````````````````
107 109
108 The other approach use in Mercurial is to keep the mutable part of the history 110 The other approach in Mercurial is to keep the mutable part of the
109 outside the DVCS constraint. This is the MQ approach of sticking a quilt queue 111 history outside the DVCS constraint. This is the MQ approach of
110 over Mercurial. 112 sticking a quilt queue over Mercurial.
111 113
112 This allow much more flexible workflow but two major feature are lost in the 114 This allow much more flexible workflow but two major feature are lost in the
113 process: 115 process:
114 116
115 :Graceful merge: MQ use plain-patch to store changeset content and patch have 117 :Graceful merge: MQ use plain-patch to store changeset content and patch have
117 becomes very painful when context changes. 119 becomes very painful when context changes.
118 120
119 :easy branching: A quilt queue is by definition a linear queue. Increasing risk 121 :easy branching: A quilt queue is by definition a linear queue. Increasing risk
120 of conflict 122 of conflict
121 123
122 It is possible to collaborate over versioned mq! But you are going ahead a lot 124 It is possible to collaborate over versioned mq! But you are going to
123 of troubles. 125 have a lot of troubles.
124 126
125 .. Ignore conflicts 127 Ignore conflicts
126 .. ``````````````````````````````````` 128 ```````````````````````````````````
127 .. 129
128 .. Another ignored issue is conflicting rewritting of the same changeset. If a 130 Another ignored issue is a conflicting rewrite of the same changeset.
129 .. changeset is rewritten two times we have two newer version, duplicated history 131 If a changeset is rewritten two times we have two newer versions,
130 .. complicate to merge. 132 and duplicated history is complicated to merge.
131 .. 133
132 .. Mercurial work around by 134 Mercurial work around by
133 .. 135
134 .. The "One set of mutable changset == One developper" mantra is also a way to work 136 The "One set of mutable changset == One developer" mantra is also a way to work
135 .. around conflicting rewritting of changeset. If two different people are able to 137 around conflicting rewriting of changeset. If two different people are able to
136 .. 138
137 .. The git branch model allow to overwrite changeset version by another one. But it 139 The git branch model allow to overwrite changeset version by another
138 .. does not care about divergent version. It is the equilent of "common ftp" source 140 one, but it does not care about divergent version. It is the equivalent
139 .. management for changeset. 141 of "common ftp" source management for changesets.
140 142
141 Facing The Danger Once And For All 143 Facing The Danger Once And For All
142 ------------------------------------------------ 144 ------------------------------------------------
143 145
144 Above we saw that, the more effort you put to avoid instability, the more option 146 Above we saw that, the more effort you put to avoid instability, the more option
146 will never show up! 148 will never show up!
147 149
148 Obsolete marker can handle the job 150 Obsolete marker can handle the job
149 ``````````````````````````````````` 151 ```````````````````````````````````
150 152
151 It is time to provide a full featured solution to deal with instability and to 153 It is time to provide a full featured solution to deal with
152 stop working around the issue! This is why I developing a new feature for 154 instability and to stop working around the issue! This is why I
153 mercurial called "Obsolete markers". Obsolete markers have two key properties: 155 developing a new feature for mercurial called "Obsolete markers".
154 156 Obsolete markers have two key properties:
155 157
156 * Any "old" changeset we want to get ride of is **explicitly** marked as "obsolete" 158
157 by history rewriting operation. 159 * Any "old" changeset we want to get ride of is **explicitly** marked
160 as "obsolete" by history rewriting operation.
158 161
159 By explicitly marking the obsolete part of the history, we will be able to 162 By explicitly marking the obsolete part of the history, we will be able to
160 easily detect instability situation. 163 easily detect instability situation.
161 164
162 * Relations between old and new version of changesets are tracked by obsolete 165 * Relations between old and new version of changesets are tracked by obsolete
184 working directory parent is obsolete! 187 working directory parent is obsolete!
185 $ hg push 188 $ hg push
186 outgoing unstable changesets 189 outgoing unstable changesets
187 (use "hg stabilize" or force the push) 190 (use "hg stabilize" or force the push)
188 191
189 And should not not encourage people to create unstability 192 And should not not encourage people to create instability
190 193
191 :: 194 ::
192 195
193 $ hg up 42 196 $ hg up 42
194 $ hg commit --amend 197 $ hg commit --amend
210 * track resulting changeset when submitting patch//pull request. 213 * track resulting changeset when submitting patch//pull request.
211 214
212 * Focus on what you do: 215 * Focus on what you do:
213 216
214 I do not like the "all at once" model of history rewriting. I'm comfortable 217 I do not like the "all at once" model of history rewriting. I'm comfortable
215 with unstability and obsolete marker offer all the tool to safely create and 218 with instability and obsolete marker offer all the tool to safely create and
216 handle unstability locally. 219 handle instability locally.
217 220
218 221