This commit is contained in:
Julien Castiaux
2023-06-05 17:00:35 +02:00
parent 4bbcf65b50
commit e03e38fb64
4 changed files with 349 additions and 6 deletions

View File

@@ -110,7 +110,7 @@ Reading all those informations we learn that this commit was the one at released
We can also study the history of other versions, like to list all commits that modified this ``odoo/release.py`` but this time inside of the 15.0 version
.. code-block:: test
.. code-block:: text
:caption: all commits (revisions) in the history of the 15.0 version for the ``odoo/release.py`` file, one per line
$ git log 15.0 --oneline odoo/release.py
@@ -270,14 +270,16 @@ Contrary to ``git log`` that can list all commits that modified to a single file
Understand the branching model
==============================
The last section was about discovering git, discovering what the history and commits are for, it was also about understanding that multiple versions co-exist. This section is about going deeper in this notion of co-existing versions, called *branches* in git jargon. What's the difference between the various branches out there, namely the differences between *master*, stable and development branches.
The last section was about discovering git, discovering what the history and commits are for, it was also about understanding that multiple versions co-exist. This section is about going deeper in this notion of co-existing versions, called *branches* in git jargon. What's the difference between the various branches out there, namely the differences between stable, *master* and development branches.
Stable branches
---------------
Stable branches are branches that are deployed on Odoo Online for customers to use. Those branches are labelled *stable* because developers try to not add new features and instead focus on fixing bugs as they are discovered by customers.
Stable branches are branches that are deployed on Odoo Online and that are used by customers for their business. Those branches are labelled *stable* because developers don't try anything new on those branches, the list of features is frozen at the moment of the release and developers focus on fixing bugs.
.. note::
The stable branches all reside in the official odoo/odoo github repository, they are the versions named "xx.0" and "saas-xx.y". The "xx.0" versions (e.g. 14.0, 15.0, 16.0, ...) are released every year during the Odoo Experience, most customers and partners use those versions. The "saas-xx.y" versions (saas-15.2, saas-16.1, ...) are released every two/three months and while available for all are generally only used by customers on Odoo Online.
.. example::
Since its release in late 2020, there have been more than 6.000 new commits on the 14.0 branch, of them 84% are bug fixes and 7% are feature improvement.
@@ -288,14 +290,55 @@ Stable branches are branches that are deployed on Odoo Online for customers to u
Master branch
-------------
The master branch is the branch where all new features are integrated once ready, tested and validated. This branch is halfway stable and halfway development, it is expected to always work bug-free but this assumption often fails because programming is hard and integrating many applications together is even more so. Because it is not that stable, the master branch is never deployed.
The master branch is split every two/three months and the new branch becomes the new stable release. The new branch isn't immediately deployed on Odoo Online, it first undergoes a stabilization process where the applications are extensively tested. Usually the new branch is made available to customers on Odoo Online after a few weeks.
The master branch is also hosted in the official odoo/odoo github repository.
.. note::
Since the release of the 14.0, there have been more than 18.000 new commits on the master branch,
of them 58% are bug fixes, 32% are features and 5% are refactors.
Because new features will be rarely added on the new stable branch, the process of splitting master in two is known at Odoo as the *freeze* even though bugfix commits will still be added.
.. example::
Since late 2020, there have been more than 18.000 new commits on the master branch, of them 58% are bug fixes, 32% are features and 5% are refactors.
.. image:: git/plot-commits-master.png
:alt: Plot of the various [IMP] and [FIX] commits in the master branch indexed per month in the period Sept 2022 - March 2023
Development branches
--------------------
The development branches are the branches were new features are being imagined, developed and tested. They are usually based on the latest revision of one of the official branches (stables or master) in which they will be ultimately integrated (if validated).
Contrary to the official branches, development branches are not hosted on the official odoo/odoo GitHub repository. All companies all individuals that contributes to Odoo work on their own *fork* (copy) of the official odoo/odoo repository, by example Odoo employees host their development branches on odoo-dev/odoo.
The integration is done via pull-requests (PR) on GitHub, a pull-request is a place where the developers publish their work for others to review and test. Reviews are mandatory at Odoo, all works must be validated by someone with "r+ rights" (a senior Odoo developer). Tests are mandatory too, every pull-request is ran against an extensible automated test suite that will block the pull-request in case of failure.
.. important::
The operation to integrate the work done in a development branch into an official one is known as *merging the branch into master/16.0/...*. This can be misleading as development branches are usually not integrated using a merge commit but are instead rebased and fast-forwaded, more on that later. Still "merge" is somewhat the de-facto way of designing this operation.
Branching model visualized
--------------------------
.. image:: git/odoo-workflow.drawio.png
:alt: Graph of the git workflow at Odoo
The graph shows a summary of the branching model inside the odoo/odoo (top half) and odoo-dev/odoo (bottom half) repositories. The graph features 8 branches: 2 stable branches (15.0 and 16.0), the master branch and 5 unammed development branches.
Each solid circle is a commit, blue for a new feature, greed for a release, yellow for a bugfix. Each callout poinThe callouts point to the last commit of their branch. the solid arrows show the order of the commits. The first commit of the master branch (top-left blue one) is present in all branches, the second commit of the master branch (second blue one) is present in 16.0, master and 4 of the unammed developemnt branches.
When a commit has two next commits it means that the branch was split. When the new branch is hosted in odoo/odoo, it means that there has been a new release, hence the green [REL] commits. When the new branch is hosted in odoo-dev/odoo (or in any other company or individual fork) it means that a new development has started.
New features are usually reserved for the master branch, the graph reflects that situation as once released stable branches only receive bugfixes.
Most features and bugfix can generally be grouped into a single comprehensive commit but sometime it is welcome to have multiple commits inside of a single branch, e.g. to fix a pre-existing bug that is revealed by a new feature. The development branches reflect that, most of them hold a single commit, except for the branch based on the latest master that hold multiple commits.
Not all development branches are ready for review, some features require several days/weeks to be completed but the branch is still saved on GitHub for the sake of saving it somewhere. The third unamed branch on the graph reflects that. That branch is also based on an outdated revision of the 16.0 official branch, the new commits from 16.0 should be integrated in the development branch via a *rebase*, more on that later.
Modify files
============

View File

@@ -0,0 +1,19 @@
The *drawio* graphes have been generated thanks to [diagrams.net].
To modify the graphes, open the web-app, import one of the `drawio` files and make your changes.
To save your modification, click *save* from the *file* menu and download the file (as XML).
To render a new PNG image, select everything with ctrl-a, click *export as PNG* from the *file*
menu and enter the following settings:
* Zoom 200%
* Border Width: 5
* [x] Selection Only
* Size: Diagram
* [ ] Transparent Background
* [ ] Shadow
* [ ] Grid
* [ ] Include a copy of my diagram
[diagrams.net]: https://app.diagrams.net/?src=about

View File

@@ -0,0 +1,281 @@
<mxfile host="app.diagrams.net" modified="2023-06-05T14:59:34.748Z" agent="Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0" etag="CL9WIreMFmtxhxDaCxs9" version="21.3.0" type="device">
<diagram id="eDTlZYB63iw13qqHwxX-" name="Page-1">
<mxGraphModel dx="398" dy="213" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="_4l3IvHe-3uS5yegyjGe-203" value="odoo-dev/odoo" style="rounded=0;whiteSpace=wrap;html=1;fontSize=11;verticalAlign=bottom;fontStyle=1" parent="1" vertex="1">
<mxGeometry x="70" y="550" width="370" height="60" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-202" value="odoo/odoo" style="rounded=0;whiteSpace=wrap;html=1;fontSize=11;verticalAlign=top;fontStyle=1" parent="1" vertex="1">
<mxGeometry x="70" y="360" width="370" height="190" as="geometry" />
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-22" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=classic;endFill=1;" parent="1" source="_4l3IvHe-3uS5yegyjGe-63" target="UUBjyu-xDhq7s3pnQ-3j-14" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="203" y="517" as="sourcePoint" />
<mxPoint x="160" y="630" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-24" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=classic;endFill=1;" parent="1" source="_4l3IvHe-3uS5yegyjGe-67" target="_4l3IvHe-3uS5yegyjGe-170" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="203" y="517" as="sourcePoint" />
<mxPoint x="130" y="600" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-25" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=classic;endFill=1;" parent="1" source="_4l3IvHe-3uS5yegyjGe-69" target="_4l3IvHe-3uS5yegyjGe-168" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="293" y="487" as="sourcePoint" />
<mxPoint x="250" y="600" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-30" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=classic;endFill=1;" parent="1" source="_4l3IvHe-3uS5yegyjGe-40" target="_4l3IvHe-3uS5yegyjGe-162" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="360" y="430" as="sourcePoint" />
<mxPoint x="360" y="640" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-39" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="_4l3IvHe-3uS5yegyjGe-52" target="_4l3IvHe-3uS5yegyjGe-50" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="320" y="410" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-40" value="F" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="340" y="400" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-42" value="I" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=Verdana;" parent="1" vertex="1">
<mxGeometry x="300" y="400" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-44" value="I" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=Verdana;" parent="1" vertex="1">
<mxGeometry x="260" y="400" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-46" value="F" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="220" y="400" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-48" value="I" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=Verdana;" parent="1" vertex="1">
<mxGeometry x="180" y="400" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-50" value="I" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=Verdana;" parent="1" vertex="1">
<mxGeometry x="140" y="400" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-51" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=none;endFill=0;dashed=1;dashPattern=1 4;" parent="1" source="_4l3IvHe-3uS5yegyjGe-52" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="80" y="410" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-52" value="I" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=Verdana;" parent="1" vertex="1">
<mxGeometry x="100" y="400" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-59" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;endArrow=classic;endFill=1;" parent="1" source="_4l3IvHe-3uS5yegyjGe-57" target="_4l3IvHe-3uS5yegyjGe-61" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-57" value="R" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
<mxGeometry x="130" y="430" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-61" value="F" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="160" y="460" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-63" value="F" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="190" y="490" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-67" value="R" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1">
<mxGeometry x="250" y="430" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-69" value="F" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="280" y="460" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-87" value="15.0" style="shape=callout;whiteSpace=wrap;html=1;perimeter=calloutPerimeter;fontSize=11;size=5;position=0.25;position2=0;" parent="1" vertex="1">
<mxGeometry x="200" y="465" width="40" height="25" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-88" value="16.0" style="shape=callout;whiteSpace=wrap;html=1;perimeter=calloutPerimeter;fontSize=11;size=5;position=0.25;position2=0;" parent="1" vertex="1">
<mxGeometry x="290" y="435" width="40" height="25" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-90" value="master" style="shape=callout;whiteSpace=wrap;html=1;perimeter=calloutPerimeter;fontSize=11;size=5;position=0.25;position2=0;" parent="1" vertex="1">
<mxGeometry x="350" y="375" width="40" height="25" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-160" value="F" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="150" y="570" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-162" value="F" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="330" y="570" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-163" value="I" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=Verdana;" parent="1" vertex="1">
<mxGeometry x="370" y="570" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-168" value="F" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="270" y="570" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-170" value="F" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="230" y="570" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-1" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="180" y="410" as="targetPoint" />
<mxPoint x="160" y="410" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="220" y="410" as="targetPoint" />
<mxPoint x="200" y="410" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="260" y="410" as="targetPoint" />
<mxPoint x="240" y="410" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-4" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="300" y="410" as="targetPoint" />
<mxPoint x="280" y="410" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-5" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="340" y="410" as="targetPoint" />
<mxPoint x="320" y="410" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-6" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;endArrow=classic;endFill=1;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="177" y="477" as="sourcePoint" />
<mxPoint x="193" y="493" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-7" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;endArrow=classic;endFill=1;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="117" y="417" as="sourcePoint" />
<mxPoint x="133" y="433" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-8" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;endArrow=classic;endFill=1;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="237" y="417" as="sourcePoint" />
<mxPoint x="253" y="433" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-9" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;endArrow=classic;endFill=1;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="267" y="447" as="sourcePoint" />
<mxPoint x="283" y="463" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-10" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;endArrow=block;endFill=0;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="207" y="507" as="sourcePoint" />
<mxPoint x="223" y="523" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-11" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;dashed=1;" parent="1" vertex="1">
<mxGeometry x="220" y="520" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-12" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;endArrow=block;endFill=0;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="297" y="477" as="sourcePoint" />
<mxPoint x="313" y="493" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-13" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;dashed=1;" parent="1" vertex="1">
<mxGeometry x="310" y="490" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-14" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=block;endFill=0;" parent="1" source="_4l3IvHe-3uS5yegyjGe-40" target="d4MCrwgoJ-HxTQabZ7jv-15" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="367" y="407" as="sourcePoint" />
<mxPoint x="383" y="423" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="d4MCrwgoJ-HxTQabZ7jv-15" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;dashed=1;" parent="1" vertex="1">
<mxGeometry x="380" y="400" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-193" value="" style="shape=callout;whiteSpace=wrap;html=1;perimeter=calloutPerimeter;fontSize=11;size=10;position=0;position2=0.5;base=10;" parent="1" vertex="1">
<mxGeometry x="260" y="560" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-194" value="" style="shape=callout;whiteSpace=wrap;html=1;perimeter=calloutPerimeter;fontSize=11;size=10;position=0;position2=0.5;base=10;" parent="1" vertex="1">
<mxGeometry x="220" y="560" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-199" value="" style="shape=callout;whiteSpace=wrap;html=1;perimeter=calloutPerimeter;fontSize=11;size=10;position=0;position2=0.5;base=10;" parent="1" vertex="1">
<mxGeometry x="360" y="560" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-179" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=11;startArrow=none;startFill=0;endArrow=classic;endFill=1;dashed=1;" parent="1" source="_4l3IvHe-3uS5yegyjGe-160" target="d4MCrwgoJ-HxTQabZ7jv-11" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="230" y="540" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-188" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=11;startArrow=none;startFill=0;endArrow=classic;endFill=1;dashed=1;" parent="1" source="_4l3IvHe-3uS5yegyjGe-163" edge="1" target="d4MCrwgoJ-HxTQabZ7jv-15">
<mxGeometry relative="1" as="geometry">
<mxPoint x="390" y="420" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-182" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=11;startArrow=none;startFill=0;endArrow=classic;endFill=1;dashed=1;" parent="1" source="_4l3IvHe-3uS5yegyjGe-168" target="d4MCrwgoJ-HxTQabZ7jv-13" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="313" y="507" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-1" value="Branch" style="shape=callout;whiteSpace=wrap;html=1;perimeter=calloutPerimeter;fontSize=12;size=10;position=0;position2=0.5;base=10;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacing=4;" vertex="1" parent="1">
<mxGeometry x="450" y="490" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-2" value="[FIX]" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#fff2cc;strokeColor=#d6b656;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacing=4;" vertex="1" parent="1">
<mxGeometry x="450" y="400" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-3" value="[IMP]" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#dae8fc;strokeColor=#6c8ebf;fontFamily=Helvetica;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacing=4;" vertex="1" parent="1">
<mxGeometry x="450" y="430" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-4" value="[REL]" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#d5e8d4;strokeColor=#82b366;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacing=4;" vertex="1" parent="1">
<mxGeometry x="450" y="460" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-5" value="Next commit" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=classic;endFill=1;fontSize=12;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacing=14;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="450" y="520" as="sourcePoint" />
<mxPoint x="470" y="540" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-8" value="Commit" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;spacing=4;" vertex="1" parent="1">
<mxGeometry x="450" y="370" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-9" value="Repository" style="whiteSpace=wrap;html=1;aspect=fixed;spacing=4;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;" vertex="1" parent="1">
<mxGeometry x="450" y="580" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-13" value="Pull-Request" style="group;spacing=4;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;" vertex="1" connectable="0" parent="1">
<mxGeometry x="450" y="550" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-12" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;dashed=1;" vertex="1" parent="UUBjyu-xDhq7s3pnQ-3j-13">
<mxGeometry x="10" y="10" width="10" height="10" as="geometry" />
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-6" value="" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=12;startArrow=none;startFill=0;endArrow=classic;endFill=1;dashed=1;spacing=14;labelPosition=right;verticalLabelPosition=middle;align=left;verticalAlign=middle;endSize=4;" edge="1" parent="UUBjyu-xDhq7s3pnQ-3j-13" target="UUBjyu-xDhq7s3pnQ-3j-12">
<mxGeometry relative="1" as="geometry">
<mxPoint x="10" y="10" as="targetPoint" />
<mxPoint as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-14" value="F" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
<mxGeometry x="100" y="570" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-16" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=classic;endFill=1;" edge="1" parent="1" source="_4l3IvHe-3uS5yegyjGe-63" target="_4l3IvHe-3uS5yegyjGe-160">
<mxGeometry relative="1" as="geometry">
<mxPoint x="203" y="517" as="sourcePoint" />
<mxPoint x="127" y="583" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-17" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fontSize=11;startArrow=none;startFill=0;endArrow=classic;endFill=1;dashed=1;" edge="1" parent="1" source="UUBjyu-xDhq7s3pnQ-3j-14" target="d4MCrwgoJ-HxTQabZ7jv-11">
<mxGeometry relative="1" as="geometry">
<mxPoint x="232" y="546" as="targetPoint" />
<mxPoint x="178" y="584" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="_4l3IvHe-3uS5yegyjGe-192" value="" style="shape=callout;whiteSpace=wrap;html=1;perimeter=calloutPerimeter;fontSize=11;size=10;position=0;position2=0.5;base=10;" parent="1" vertex="1">
<mxGeometry x="140" y="560" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-18" style="rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=classic;endFill=1;" edge="1" parent="1" source="_4l3IvHe-3uS5yegyjGe-162" target="_4l3IvHe-3uS5yegyjGe-163">
<mxGeometry relative="1" as="geometry">
<mxPoint x="299" y="490" as="sourcePoint" />
<mxPoint x="291" y="580" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="UUBjyu-xDhq7s3pnQ-3j-19" value="" style="shape=callout;whiteSpace=wrap;html=1;perimeter=calloutPerimeter;fontSize=11;size=10;position=0;position2=0.5;base=10;" vertex="1" parent="1">
<mxGeometry x="90" y="560" width="20" height="20" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB