Fossil

Check-in [2ac5bc3c]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Gave Users A thru E human names, and humanized their story a bit in the branching.wiki article.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 2ac5bc3c3000288b9660a8b06393a6a2830a126b3f412e81f1c04987a7bb0cac
User & Date: wyoung 2019-06-21 13:19:05
Context
2019-06-22
16:57
Enhance the "fossil tag ls" command to allow filtering by tag type. Closed-Leaf check-in: 2d3025ad user: andybradford tags: taglist-tagtype
03:46
More clarifications in the "How Can Forks Divide Development Effort?" section of branching.wiki, primarily in explaining how each user in the example arrives at the view shown in the swim lane diagram. There were multiple implicit possilibities before, and some were misinterpreting it. check-in: 70a7db80 user: wyoung tags: trunk
2019-06-21
13:19
Gave Users A thru E human names, and humanized their story a bit in the branching.wiki article. check-in: 2ac5bc3c user: wyoung tags: trunk
12:58
Moved check-ins 3 and later right in the Figure 6 swim lane diagram within branching.wiki so that there is only one event at each time step. As previously drawn, it implied that check-ins 2 and 3 occurred at the same time, but that's neither true nor necessary to our point here. Also evened up the lane widths. check-in: 856c9565 user: wyoung tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to www/branch06.graphml.

17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    <node id="n0" yfiles.foldertype="group">
      <data key="d6">
        <y:TableNode configuration="YED_TABLE_NODE">
          <y:Geometry height="470.0" width="487.0" x="-208.0" y="-1933.666015625"/>
          <y:Fill color="#ECF5FF" color2="#0042F440" transparent="false"/>
          <y:BorderStyle color="#000000" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="290.259765625" x="98.3701171875" xml:space="preserve" y="4.0">Varying User Views of Fossil Repository</y:NodeLabel>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="42.103515625" x="3.0" xml:space="preserve" y="63.9482421875">User A<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_0" inside="true"/></y:ModelParameter></y:NodeLabel>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="40.7265625" x="3.0" xml:space="preserve" y="174.63671875">User B<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_1" inside="true"/></y:ModelParameter></y:NodeLabel>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="42.126953125" x="3.0" xml:space="preserve" y="283.4365234375">User C<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_2" inside="true"/></y:ModelParameter></y:NodeLabel>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="42.8125" x="3.0" xml:space="preserve" y="393.09375">User D<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_3" inside="true"/></y:ModelParameter></y:NodeLabel>
          <y:StyleProperties>
            <y:Property class="java.awt.Color" name="yed.table.section.color" value="#7192b2"/>
            <y:Property class="java.lang.Double" name="yed.table.header.height" value="24.0"/>
            <y:Property class="java.awt.Color" name="yed.table.lane.color.main" value="#c4d7ed"/>
            <y:Property class="java.awt.Color" name="yed.table.lane.color.alternating" value="#abc8e2"/>
            <y:Property class="java.awt.Color" name="yed.table.header.color.alternating" value="#abc8e2"/>
            <y:Property class="java.lang.String" name="yed.table.lane.style" value="lane.style.rows"/>







|
|
|
|







17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    <node id="n0" yfiles.foldertype="group">
      <data key="d6">
        <y:TableNode configuration="YED_TABLE_NODE">
          <y:Geometry height="470.0" width="487.0" x="-208.0" y="-1933.666015625"/>
          <y:Fill color="#ECF5FF" color2="#0042F440" transparent="false"/>
          <y:BorderStyle color="#000000" type="line" width="1.0"/>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="15" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="21.666015625" horizontalTextPosition="center" iconTextGap="4" modelName="internal" modelPosition="t" textColor="#000000" verticalTextPosition="bottom" visible="true" width="290.259765625" x="98.3701171875" xml:space="preserve" y="4.0">Varying User Views of Fossil Repository</y:NodeLabel>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="29.822265625" x="3.0" xml:space="preserve" y="70.0888671875">Alan<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_0" inside="true"/></y:ModelParameter></y:NodeLabel>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="32.833984375" x="3.0" xml:space="preserve" y="178.5830078125">Betty<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_1" inside="true"/></y:ModelParameter></y:NodeLabel>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="44.91015625" x="3.0" xml:space="preserve" y="282.044921875">Charlie<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_2" inside="true"/></y:ModelParameter></y:NodeLabel>
          <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.1328125" horizontalTextPosition="center" iconTextGap="4" modelName="custom" rotationAngle="270.0" textColor="#000000" verticalTextPosition="bottom" visible="true" width="48.8125" x="3.0" xml:space="preserve" y="390.09375">Darlene<y:LabelModel><y:RowNodeLabelModel offset="3.0"/></y:LabelModel><y:ModelParameter><y:RowNodeLabelModelParameter horizontalPosition="0.0" id="row_3" inside="true"/></y:ModelParameter></y:NodeLabel>
          <y:StyleProperties>
            <y:Property class="java.awt.Color" name="yed.table.section.color" value="#7192b2"/>
            <y:Property class="java.lang.Double" name="yed.table.header.height" value="24.0"/>
            <y:Property class="java.awt.Color" name="yed.table.lane.color.main" value="#c4d7ed"/>
            <y:Property class="java.awt.Color" name="yed.table.lane.color.alternating" value="#abc8e2"/>
            <y:Property class="java.awt.Color" name="yed.table.header.color.alternating" value="#abc8e2"/>
            <y:Property class="java.lang.String" name="yed.table.lane.style" value="lane.style.rows"/>

Changes to www/branch06.svg.

6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
..
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
      <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
        <path d="M0 0 L517 0 L517 501 L0 501 L0 0 Z"/>
      </clipPath>
      <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
        <path d="M-223 -1949 L294 -1949 L294 -1448 L-223 -1448 L-223 -1949 Z"/>
      </clipPath>
      <clipPath clipPathUnits="userSpaceOnUse" id="clipPath3">
        <path d="M121.3857 -18 L121.3857 499 L-379.6143 499 L-379.6143 -18 L121.3857 -18 Z"/>
      </clipPath>
      <clipPath clipPathUnits="userSpaceOnUse" id="clipPath4">
        <path d="M230.6973 -18 L230.6973 499 L-270.3027 499 L-270.3027 -18 L230.6973 -18 Z"/>
      </clipPath>
      <clipPath clipPathUnits="userSpaceOnUse" id="clipPath5">
        <path d="M340.8975 -18 L340.8975 499 L-160.1025 499 L-160.1025 -18 L340.8975 -18 Z"/>
      </clipPath>
      <clipPath clipPathUnits="userSpaceOnUse" id="clipPath6">
        <path d="M451.2402 -18 L451.2402 499 L-49.7598 499 L-49.7598 -18 L451.2402 -18 Z"/>
      </clipPath>
    </defs>
    <g fill="rgb(236,245,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,223,1949)" stroke="rgb(236,245,255)">
      <path d="M-208 -1933.666 L-208 -1903.666 L279 -1903.666 L279 -1933.666 Z" stroke="none" clip-path="url(#clipPath2)"/>
      <rect x="-208" width="487" height="440" y="-1903.666" clip-path="url(#clipPath2)" stroke="none"/>
      <line clip-path="url(#clipPath2)" fill="rgb(113,146,178)" x1="-184" x2="279" y1="-1903.666" y2="-1903.666" stroke="none"/>
      <rect x="-208" y="-1903.666" clip-path="url(#clipPath2)" fill="rgb(196,215,237)" width="24" height="110" stroke="none"/>
................................................................................
      <rect fill="none" x="-208" width="487" height="110" y="-1793.666" clip-path="url(#clipPath2)"/>
      <rect fill="none" x="-208" width="487" height="109" y="-1683.666" clip-path="url(#clipPath2)"/>
      <rect fill="none" x="-208" width="487" height="111" y="-1574.666" clip-path="url(#clipPath2)"/>
    </g>
    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,223,1949)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
      <text x="-107.6299" xml:space="preserve" y="-1913.1641" clip-path="url(#clipPath2)" stroke="none">Varying User Views of Fossil Repository</text>
    </g>
    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(-0,-1,1,-0,18,121.3857)" stroke-linecap="butt">
      <text x="2" xml:space="preserve" y="13.6016" clip-path="url(#clipPath3)" stroke="none">User A</text>
    </g>
    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(-0,-1,1,-0,18,230.6973)" stroke-linecap="butt">
      <text x="2" xml:space="preserve" y="13.6016" clip-path="url(#clipPath4)" stroke="none">User B</text>
    </g>
    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(-0,-1,1,-0,18,340.8975)" stroke-linecap="butt">
      <text x="2" xml:space="preserve" y="13.6016" clip-path="url(#clipPath5)" stroke="none">User C</text>
    </g>
    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(-0,-1,1,-0,18,451.2402)" stroke-linecap="butt">
      <text x="2" xml:space="preserve" y="13.6016" clip-path="url(#clipPath6)" stroke="none">User D</text>
    </g>
    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,223,1949)" stroke="white">
      <circle r="15" clip-path="url(#clipPath2)" cx="-157" cy="-1760.666" stroke="none"/>
    </g>
    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" stroke-width="2" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,223,1949)" stroke-linecap="butt">
      <circle fill="none" r="15" clip-path="url(#clipPath2)" cx="-157" cy="-1760.666"/>
      <text x="-160.7939" y="-1756.1309" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-width="1" xml:space="preserve">1</text>







|


|


|


|







 







|
|

|
|

|
|

|
|







6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
..
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
      <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
        <path d="M0 0 L517 0 L517 501 L0 501 L0 0 Z"/>
      </clipPath>
      <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
        <path d="M-223 -1949 L294 -1949 L294 -1448 L-223 -1448 L-223 -1949 Z"/>
      </clipPath>
      <clipPath clipPathUnits="userSpaceOnUse" id="clipPath3">
        <path d="M115.2451 -18 L115.2451 499 L-385.7549 499 L-385.7549 -18 L115.2451 -18 Z"/>
      </clipPath>
      <clipPath clipPathUnits="userSpaceOnUse" id="clipPath4">
        <path d="M226.751 -18 L226.751 499 L-274.249 499 L-274.249 -18 L226.751 -18 Z"/>
      </clipPath>
      <clipPath clipPathUnits="userSpaceOnUse" id="clipPath5">
        <path d="M342.2891 -18 L342.2891 499 L-158.7109 499 L-158.7109 -18 L342.2891 -18 Z"/>
      </clipPath>
      <clipPath clipPathUnits="userSpaceOnUse" id="clipPath6">
        <path d="M454.2402 -18 L454.2402 499 L-46.7598 499 L-46.7598 -18 L454.2402 -18 Z"/>
      </clipPath>
    </defs>
    <g fill="rgb(236,245,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,223,1949)" stroke="rgb(236,245,255)">
      <path d="M-208 -1933.666 L-208 -1903.666 L279 -1903.666 L279 -1933.666 Z" stroke="none" clip-path="url(#clipPath2)"/>
      <rect x="-208" width="487" height="440" y="-1903.666" clip-path="url(#clipPath2)" stroke="none"/>
      <line clip-path="url(#clipPath2)" fill="rgb(113,146,178)" x1="-184" x2="279" y1="-1903.666" y2="-1903.666" stroke="none"/>
      <rect x="-208" y="-1903.666" clip-path="url(#clipPath2)" fill="rgb(196,215,237)" width="24" height="110" stroke="none"/>
................................................................................
      <rect fill="none" x="-208" width="487" height="110" y="-1793.666" clip-path="url(#clipPath2)"/>
      <rect fill="none" x="-208" width="487" height="109" y="-1683.666" clip-path="url(#clipPath2)"/>
      <rect fill="none" x="-208" width="487" height="111" y="-1574.666" clip-path="url(#clipPath2)"/>
    </g>
    <g font-size="15px" stroke-linecap="butt" transform="matrix(1,0,0,1,223,1949)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
      <text x="-107.6299" xml:space="preserve" y="-1913.1641" clip-path="url(#clipPath2)" stroke="none">Varying User Views of Fossil Repository</text>
    </g>
    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(-0,-1,1,-0,18,115.2451)" stroke-linecap="butt">
      <text x="2" xml:space="preserve" y="13.6016" clip-path="url(#clipPath3)" stroke="none">Alan</text>
    </g>
    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(-0,-1,1,-0,18,226.751)" stroke-linecap="butt">
      <text x="2" xml:space="preserve" y="13.6016" clip-path="url(#clipPath4)" stroke="none">Betty</text>
    </g>
    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(-0,-1,1,-0,18,342.2891)" stroke-linecap="butt">
      <text x="2" xml:space="preserve" y="13.6016" clip-path="url(#clipPath5)" stroke="none">Charlie</text>
    </g>
    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(-0,-1,1,-0,18,454.2402)" stroke-linecap="butt">
      <text x="2" xml:space="preserve" y="13.6016" clip-path="url(#clipPath6)" stroke="none">Darlene</text>
    </g>
    <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,223,1949)" stroke="white">
      <circle r="15" clip-path="url(#clipPath2)" cx="-157" cy="-1760.666" stroke="none"/>
    </g>
    <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" stroke-width="2" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,223,1949)" stroke-linecap="butt">
      <circle fill="none" r="15" clip-path="url(#clipPath2)" cx="-157" cy="-1760.666"/>
      <text x="-160.7939" y="-1756.1309" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none" stroke-width="1" xml:space="preserve">1</text>

Changes to www/branching.wiki.

386
387
388
389
390
391
392
393
394
395
396

397
398
399
400
401
402
403
404
405
406
407
408

409
410
411
412
413
414
415
416

417
418
419


420
421
422
423

424
425
426
427

428
429
430
431
432

433
434
435



436
437
438
439
440
441
442
All users in this diagram start off with the same two checkins at the
tip of the working branch, 1 and 2, and they're all working towards some
indefinite, unified future. This is all happening on some long-lived,
shared working branch, such as trunk, though it could be anything else
that matches those same qualifiers. Each user makes only one check-in,
shaded light gray.

User A sets the stage for this problem by creating a fork from check-in
1 as check-in 3. Whether what happens as a result is User A's fault
depends on why and how that fork occurred. We'll come back to that
point later. For now, you can ignore the how and why of it.


User B is sync'd with the same view of the repository as User A, so her
check-in goes in as a child of the forked check-in 3, that being the
latest check-in on the branch at the time.

Meanwhile, User C went offline after syncing his repo with check-in 2 as
the latest on that branch. When he checks his changes in, it is as a
child of 2, not of 4, because User C doesn't know about 3 & 4 yet. Since
he does this at an absolute wall clock time <i>after</i> Users A and B
made their check-ins, when User C comes back online and pushes his
changes to the master repository — and learns about check-ins 3 and 4 at
the same time, during Fossil sync — User C inadvertently revives the

other side of the fork.

User D sees all of this, because she comes along after Users A thru C
made their check-ins and pushed them to the master repository. Perhaps
User D is switching a working directory to this forked branch, or
perhaps User D is opening a Fossil repo clone into a new working
directory.  Regardless, it happens after User C pushed his check-in 5 to
the master repo, so User D sees that as the latest on the branch,

causing her work to be saved as a child of check-in 5, not of check-in
4, as it would if User C didn't come back online and sync before User D
showed up.



The end result of all of this is that everyone makes only one check-in,
but half of the check-ins are on one side of the fork, and half are on
the other. Some future User E who shows up can end up on either side of

the fork. If User E shows up with the state of the repository as drawn
above, they'll end up on the top side of the fork, because check-in 6 is
the latest, but if User A or B makes a seventh check-in to that branch
first, it will be as a child of check-in 4, and because it's the latest,

User E will end up on the bottom side of the fork instead.

In all of this, realize that neither side of the fork is obviously
"correct." Every participant was doing the right thing by their own
lights at the time they made their lone check-in. We can only blame User

A for creating the fork if they did so on purpose, as by passing
"--allow-fork" when creating a check-in on a shared working branch. If
the fork was created inadvertently, it's no one's fault.




This is why forks on shared working branches are bad, which is why
Fossil tries so hard to avoid them, and why it warns you about it when
they do occur.


<h2>Review Of Terminology</h2>







|
|
|
|
>

|
|


|

|
|
|
|
<
>


|

|
|
|
<
>

|

>
>



|
>
|
|
|
|
>
|



|
>
|

|
>
>
>







386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408

409
410
411
412
413
414
415
416

417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
All users in this diagram start off with the same two checkins at the
tip of the working branch, 1 and 2, and they're all working towards some
indefinite, unified future. This is all happening on some long-lived,
shared working branch, such as trunk, though it could be anything else
that matches those same qualifiers. Each user makes only one check-in,
shaded light gray.

Alan sets the stage for this problem by creating a fork from check-in 1
as check-in 3. This has consequences which will occur regardless of how
that fork was created, so we can ignore the "how" here.  <i>Why</i> that
fork was created will matter in [#post-mortem|the <i>post mortem</i>
below], but we can ignore that for now, too.

Betty is sync'd with the same view of the repository as Alan, so her
check-in goes in as a child of the fork-creating check-in 3, that being the
latest check-in on the branch at the time.

Meanwhile, Charlie went offline after syncing his repo with check-in 2 as
the latest on that branch. When he checks his changes in, it is as a
child of 2, not of 4, because Charlie doesn't know about check-ins 3 & 4 yet.
He does this at an absolute wall clock time <i>after</i> Alan and Betty
made their check-ins, so when Charlie comes back online and pushes his
check-in 5 to the master repository and learns about check-ins 3 and 4

during Fossil sync, Charlie inadvertently revives the
other side of the fork.

Darlene sees all of this, because she comes along after Alan, Betty, and Charlie
made their check-ins and pushed them to the master repository. Perhaps
Darlene is switching a working directory to this forked branch, or
perhaps Darlene is opening a Fossil repo clone into a new working
directory.  Regardless, it happens after Charlie pushed his check-in 5 to

the master repo, so Darlene sees that as the latest on the branch,
causing her work to be saved as a child of check-in 5, not of check-in
4, as it would if Charlie didn't come back online and sync before Darlene
showed up.

<h3 id="post-mortem">Post Mortem</h3>

The end result of all of this is that everyone makes only one check-in,
but half of the check-ins are on one side of the fork, and half are on
the other. A future user — his mother calls him Edward, but please call him Eddie —
can then show up and end up on <i>either</i> side of
the fork. If Eddie shows up with the state of the repository as drawn
above, he'll end up on the top side of the fork, because check-in 6 is
the latest, but if Alan or Betty makes a seventh check-in to that branch
first, it will be as a child of check-in 4 since that's the version in
their local check-out directories. Since that check-in 7 will then be the latest,
Eddie will end up on the bottom side of the fork instead.

In all of this, realize that neither side of the fork is obviously
"correct." Every participant was doing the right thing by their own
lights at the time they made their lone check-in. We can only blame
the consequences of creating the fork on Alan 
if he did so on purpose, as by passing
"--allow-fork" when creating a check-in on a shared working branch. If
the fork was created inadvertently, it's no one's fault. 

(Or, perhaps it is <i>everyone's</i> fault for using a DVCS while having
an unrealistic expectation that forks should never occur.)

This is why forks on shared working branches are bad, which is why
Fossil tries so hard to avoid them, and why it warns you about it when
they do occur.


<h2>Review Of Terminology</h2>