Add a draft introduction to Git from graphs

This commit is contained in:
Dimitri Lozeve 2021-03-01 20:01:38 +01:00
parent 822d0f1ae0
commit f7aae0452f
24 changed files with 2849 additions and 0 deletions

View file

@ -0,0 +1,12 @@
INPUTS=$(wildcard *.m4)
TARGETS=$(INPUTS:.m4=.svg)
.PHONY: all
all: $(TARGETS)
%.svg: %.m4 master.dot merged.dot feature.dot bugfix.dot
m4 $< | dot -Tsvg -o $@
.PHONY: clean
clean:
rm -f $(TARGETS)

View file

@ -0,0 +1,4 @@
digraph bugfix {
node[group=bugfix];
b1 -> b2;
}

View file

@ -0,0 +1,4 @@
digraph feature {
node[group=feature];
f1 -> f2 -> f3;
}

View file

@ -0,0 +1,4 @@
digraph master {
node[group=master];
m1 -> m2 -> m3 -> m4 -> m5 -> m6 -> m7 -> m8 -> m9 -> m10;
}

View file

@ -0,0 +1,4 @@
digraph merged {
node[group=merged];
m2 -> r1 -> r2 -> m5;
}

13
images/git-graphs/repo.m4 Normal file
View file

@ -0,0 +1,13 @@
digraph repo {
rankdir = "LR";
bgcolor = "transparent";
node[width=0.15, height=0.15, shape=point, color=white, fontcolor=white];
edge[weight=2, arrowhead=normal, arrowsize=0.6, color=white];
define(`digraph', `subgraph')
include(`master.dot')
include(`merged.dot')
include(`feature.dot')
include(`bugfix.dot')
m7 -> f1;
m9 -> b1;
}

199
images/git-graphs/repo.svg Normal file
View file

@ -0,0 +1,199 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: repo Pages: 1 -->
<svg width="487pt" height="77pt"
viewBox="0.00 0.00 486.80 76.80" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 72.8)">
<title>repo</title>
<!-- m1 -->
<g id="node1" class="node">
<title>m1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="5.4" cy="-63.4" rx="5.4" ry="5.4"/>
</g>
<!-- m2 -->
<g id="node2" class="node">
<title>m2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="52.2" cy="-63.4" rx="5.4" ry="5.4"/>
</g>
<!-- m1&#45;&gt;m2 -->
<g id="edge1" class="edge">
<title>m1&#45;&gt;m2</title>
<path fill="none" stroke="#ffffff" d="M11.1386,-63.4C18.445,-63.4 31.2437,-63.4 40.6149,-63.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="40.7054,-65.5001 46.7053,-63.4 40.7053,-61.3001 40.7054,-65.5001"/>
</g>
<!-- m3 -->
<g id="node3" class="node">
<title>m3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-63.4" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;m3 -->
<g id="edge2" class="edge">
<title>m2&#45;&gt;m3</title>
<path fill="none" stroke="#ffffff" d="M57.9386,-63.4C65.245,-63.4 78.0437,-63.4 87.4149,-63.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="87.5054,-65.5001 93.5053,-63.4 87.5053,-61.3001 87.5054,-65.5001"/>
</g>
<!-- r1 -->
<g id="node11" class="node">
<title>r1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-34.4" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;r1 -->
<g id="edge10" class="edge">
<title>m2&#45;&gt;r1</title>
<path fill="none" stroke="#ffffff" d="M56.8585,-60.5133C64.3573,-55.8666 79.2669,-46.6278 89.1887,-40.4797"/>
<polygon fill="#ffffff" stroke="#ffffff" points="90.3663,-42.2205 94.3604,-37.275 88.154,-38.6503 90.3663,-42.2205"/>
</g>
<!-- m4 -->
<g id="node4" class="node">
<title>m4</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-63.4" rx="5.4" ry="5.4"/>
</g>
<!-- m3&#45;&gt;m4 -->
<g id="edge3" class="edge">
<title>m3&#45;&gt;m4</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-63.4C112.045,-63.4 124.8437,-63.4 134.2149,-63.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-65.5001 140.3053,-63.4 134.3053,-61.3001 134.3054,-65.5001"/>
</g>
<!-- m5 -->
<g id="node5" class="node">
<title>m5</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="192.6" cy="-63.4" rx="5.4" ry="5.4"/>
</g>
<!-- m4&#45;&gt;m5 -->
<g id="edge4" class="edge">
<title>m4&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M151.5386,-63.4C158.845,-63.4 171.6437,-63.4 181.0149,-63.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.1054,-65.5001 187.1053,-63.4 181.1053,-61.3001 181.1054,-65.5001"/>
</g>
<!-- m6 -->
<g id="node6" class="node">
<title>m6</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="239.4" cy="-63.4" rx="5.4" ry="5.4"/>
</g>
<!-- m5&#45;&gt;m6 -->
<g id="edge5" class="edge">
<title>m5&#45;&gt;m6</title>
<path fill="none" stroke="#ffffff" d="M198.3386,-63.4C205.645,-63.4 218.4437,-63.4 227.8149,-63.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="227.9054,-65.5001 233.9053,-63.4 227.9053,-61.3001 227.9054,-65.5001"/>
</g>
<!-- m7 -->
<g id="node7" class="node">
<title>m7</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="286.2" cy="-63.4" rx="5.4" ry="5.4"/>
</g>
<!-- m6&#45;&gt;m7 -->
<g id="edge6" class="edge">
<title>m6&#45;&gt;m7</title>
<path fill="none" stroke="#ffffff" d="M245.1386,-63.4C252.445,-63.4 265.2437,-63.4 274.6149,-63.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="274.7054,-65.5001 280.7053,-63.4 274.7053,-61.3001 274.7054,-65.5001"/>
</g>
<!-- m8 -->
<g id="node8" class="node">
<title>m8</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-63.4" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;m8 -->
<g id="edge7" class="edge">
<title>m7&#45;&gt;m8</title>
<path fill="none" stroke="#ffffff" d="M291.9386,-63.4C299.245,-63.4 312.0437,-63.4 321.4149,-63.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="321.5054,-65.5001 327.5053,-63.4 321.5053,-61.3001 321.5054,-65.5001"/>
</g>
<!-- f1 -->
<g id="node13" class="node">
<title>f1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-5.4" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;f1 -->
<g id="edge16" class="edge">
<title>m7&#45;&gt;f1</title>
<path fill="none" stroke="#ffffff" d="M289.8723,-58.8488C297.565,-49.3152 315.4978,-27.0908 325.6505,-14.5083"/>
<polygon fill="#ffffff" stroke="#ffffff" points="327.3393,-15.7595 329.4728,-9.7713 324.0707,-13.1221 327.3393,-15.7595"/>
</g>
<!-- m9 -->
<g id="node9" class="node">
<title>m9</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-63.4" rx="5.4" ry="5.4"/>
</g>
<!-- m8&#45;&gt;m9 -->
<g id="edge8" class="edge">
<title>m8&#45;&gt;m9</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-63.4C346.045,-63.4 358.8437,-63.4 368.2149,-63.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-65.5001 374.3053,-63.4 368.3053,-61.3001 368.3054,-65.5001"/>
</g>
<!-- m10 -->
<g id="node10" class="node">
<title>m10</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-63.4" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;m10 -->
<g id="edge9" class="edge">
<title>m9&#45;&gt;m10</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-63.4C392.845,-63.4 405.6437,-63.4 415.0149,-63.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-65.5001 421.1053,-63.4 415.1053,-61.3001 415.1054,-65.5001"/>
</g>
<!-- b1 -->
<g id="node16" class="node">
<title>b1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-34.4" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;b1 -->
<g id="edge17" class="edge">
<title>m9&#45;&gt;b1</title>
<path fill="none" stroke="#ffffff" d="M384.4585,-60.5133C391.9573,-55.8666 406.8669,-46.6278 416.7887,-40.4797"/>
<polygon fill="#ffffff" stroke="#ffffff" points="417.9663,-42.2205 421.9604,-37.275 415.754,-38.6503 417.9663,-42.2205"/>
</g>
<!-- r2 -->
<g id="node12" class="node">
<title>r2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-34.4" rx="5.4" ry="5.4"/>
</g>
<!-- r1&#45;&gt;r2 -->
<g id="edge11" class="edge">
<title>r1&#45;&gt;r2</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-34.4C112.045,-34.4 124.8437,-34.4 134.2149,-34.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-36.5001 140.3053,-34.4 134.3053,-32.3001 134.3054,-36.5001"/>
</g>
<!-- r2&#45;&gt;m5 -->
<g id="edge12" class="edge">
<title>r2&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M150.4585,-37.2867C157.9573,-41.9334 172.8669,-51.1722 182.7887,-57.3203"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.754,-59.1497 187.9604,-60.525 183.9663,-55.5795 181.754,-59.1497"/>
</g>
<!-- f2 -->
<g id="node14" class="node">
<title>f2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-5.4" rx="5.4" ry="5.4"/>
</g>
<!-- f1&#45;&gt;f2 -->
<g id="edge13" class="edge">
<title>f1&#45;&gt;f2</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-5.4C346.045,-5.4 358.8437,-5.4 368.2149,-5.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-7.5001 374.3053,-5.4 368.3053,-3.3001 368.3054,-7.5001"/>
</g>
<!-- f3 -->
<g id="node15" class="node">
<title>f3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-5.4" rx="5.4" ry="5.4"/>
</g>
<!-- f2&#45;&gt;f3 -->
<g id="edge14" class="edge">
<title>f2&#45;&gt;f3</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-5.4C392.845,-5.4 405.6437,-5.4 415.0149,-5.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-7.5001 421.1053,-5.4 415.1053,-3.3001 415.1054,-7.5001"/>
</g>
<!-- b2 -->
<g id="node17" class="node">
<title>b2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="473.4" cy="-34.4" rx="5.4" ry="5.4"/>
</g>
<!-- b1&#45;&gt;b2 -->
<g id="edge15" class="edge">
<title>b1&#45;&gt;b2</title>
<path fill="none" stroke="#ffffff" d="M432.3386,-34.4C439.645,-34.4 452.4437,-34.4 461.8149,-34.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="461.9054,-36.5001 467.9053,-34.4 461.9053,-32.3001 461.9054,-36.5001"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8 KiB

View file

@ -0,0 +1,27 @@
digraph repo_labels {
rankdir = "LR";
bgcolor = "transparent";
node[width=0.15, height=0.15, shape=point, color=white, fontcolor=white];
edge[weight=2, arrowhead=normal, arrowsize=0.6, color=white];
define(`digraph', `subgraph')
include(`master.dot')
include(`merged.dot')
include(`feature.dot')
include(`bugfix.dot')
m7 -> f1;
m9 -> b1;
node[shape=box, fontname="monospace"];
subgraph labels {
rank = "max";
HEAD [style=dashed];
master;
feature;
bugfix;
}
edge[arrowhead=none, style=dashed];
m10 -> HEAD;
m10 -> master;
f3 -> feature;
b2 -> bugfix;
}

View file

@ -0,0 +1,243 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: repo_labels Pages: 1 -->
<svg width="597pt" height="154pt"
viewBox="0.00 0.00 596.80 154.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 150)">
<title>repo_labels</title>
<!-- m1 -->
<g id="node1" class="node">
<title>m1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="5.4" cy="-90.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2 -->
<g id="node2" class="node">
<title>m2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="52.2" cy="-90.5" rx="5.4" ry="5.4"/>
</g>
<!-- m1&#45;&gt;m2 -->
<g id="edge1" class="edge">
<title>m1&#45;&gt;m2</title>
<path fill="none" stroke="#ffffff" d="M11.1386,-90.5C18.445,-90.5 31.2437,-90.5 40.6149,-90.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="40.7054,-92.6001 46.7053,-90.5 40.7053,-88.4001 40.7054,-92.6001"/>
</g>
<!-- m3 -->
<g id="node3" class="node">
<title>m3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-90.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;m3 -->
<g id="edge2" class="edge">
<title>m2&#45;&gt;m3</title>
<path fill="none" stroke="#ffffff" d="M57.9386,-90.5C65.245,-90.5 78.0437,-90.5 87.4149,-90.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="87.5054,-92.6001 93.5053,-90.5 87.5053,-88.4001 87.5054,-92.6001"/>
</g>
<!-- r1 -->
<g id="node11" class="node">
<title>r1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-61.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;r1 -->
<g id="edge10" class="edge">
<title>m2&#45;&gt;r1</title>
<path fill="none" stroke="#ffffff" d="M56.8585,-87.6133C64.3573,-82.9666 79.2669,-73.7278 89.1887,-67.5797"/>
<polygon fill="#ffffff" stroke="#ffffff" points="90.3663,-69.3205 94.3604,-64.375 88.154,-65.7503 90.3663,-69.3205"/>
</g>
<!-- m4 -->
<g id="node4" class="node">
<title>m4</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-90.5" rx="5.4" ry="5.4"/>
</g>
<!-- m3&#45;&gt;m4 -->
<g id="edge3" class="edge">
<title>m3&#45;&gt;m4</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-90.5C112.045,-90.5 124.8437,-90.5 134.2149,-90.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-92.6001 140.3053,-90.5 134.3053,-88.4001 134.3054,-92.6001"/>
</g>
<!-- m5 -->
<g id="node5" class="node">
<title>m5</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="192.6" cy="-90.5" rx="5.4" ry="5.4"/>
</g>
<!-- m4&#45;&gt;m5 -->
<g id="edge4" class="edge">
<title>m4&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M151.5386,-90.5C158.845,-90.5 171.6437,-90.5 181.0149,-90.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.1054,-92.6001 187.1053,-90.5 181.1053,-88.4001 181.1054,-92.6001"/>
</g>
<!-- m6 -->
<g id="node6" class="node">
<title>m6</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="239.4" cy="-90.5" rx="5.4" ry="5.4"/>
</g>
<!-- m5&#45;&gt;m6 -->
<g id="edge5" class="edge">
<title>m5&#45;&gt;m6</title>
<path fill="none" stroke="#ffffff" d="M198.3386,-90.5C205.645,-90.5 218.4437,-90.5 227.8149,-90.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="227.9054,-92.6001 233.9053,-90.5 227.9053,-88.4001 227.9054,-92.6001"/>
</g>
<!-- m7 -->
<g id="node7" class="node">
<title>m7</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="286.2" cy="-90.5" rx="5.4" ry="5.4"/>
</g>
<!-- m6&#45;&gt;m7 -->
<g id="edge6" class="edge">
<title>m6&#45;&gt;m7</title>
<path fill="none" stroke="#ffffff" d="M245.1386,-90.5C252.445,-90.5 265.2437,-90.5 274.6149,-90.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="274.7054,-92.6001 280.7053,-90.5 274.7053,-88.4001 274.7054,-92.6001"/>
</g>
<!-- m8 -->
<g id="node8" class="node">
<title>m8</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-90.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;m8 -->
<g id="edge7" class="edge">
<title>m7&#45;&gt;m8</title>
<path fill="none" stroke="#ffffff" d="M291.9386,-90.5C299.245,-90.5 312.0437,-90.5 321.4149,-90.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="321.5054,-92.6001 327.5053,-90.5 321.5053,-88.4001 321.5054,-92.6001"/>
</g>
<!-- f1 -->
<g id="node13" class="node">
<title>f1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-20.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;f1 -->
<g id="edge16" class="edge">
<title>m7&#45;&gt;f1</title>
<path fill="none" stroke="#ffffff" d="M289.2707,-85.9071C296.7389,-74.7367 315.9921,-45.9392 326.2815,-30.5491"/>
<polygon fill="#ffffff" stroke="#ffffff" points="328.2676,-31.3567 329.8567,-25.2016 324.7761,-29.0223 328.2676,-31.3567"/>
</g>
<!-- m9 -->
<g id="node9" class="node">
<title>m9</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-90.5" rx="5.4" ry="5.4"/>
</g>
<!-- m8&#45;&gt;m9 -->
<g id="edge8" class="edge">
<title>m8&#45;&gt;m9</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-90.5C346.045,-90.5 358.8437,-90.5 368.2149,-90.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-92.6001 374.3053,-90.5 368.3053,-88.4001 368.3054,-92.6001"/>
</g>
<!-- m10 -->
<g id="node10" class="node">
<title>m10</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-90.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;m10 -->
<g id="edge9" class="edge">
<title>m9&#45;&gt;m10</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-90.5C392.845,-90.5 405.6437,-90.5 415.0149,-90.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-92.6001 421.1053,-90.5 415.1053,-88.4001 415.1054,-92.6001"/>
</g>
<!-- b1 -->
<g id="node16" class="node">
<title>b1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-55.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;b1 -->
<g id="edge17" class="edge">
<title>m9&#45;&gt;b1</title>
<path fill="none" stroke="#ffffff" d="M384.4585,-87.0161C392.1054,-81.2972 407.4587,-69.8151 417.3706,-62.4023"/>
<polygon fill="#ffffff" stroke="#ffffff" points="418.6867,-64.0404 422.234,-58.7652 416.1713,-60.6769 418.6867,-64.0404"/>
</g>
<!-- HEAD -->
<g id="node18" class="node">
<title>HEAD</title>
<polygon fill="none" stroke="#ffffff" stroke-dasharray="5,2" points="576.8,-146 526.8,-146 526.8,-123 576.8,-123 576.8,-146"/>
<text text-anchor="middle" x="551.8" y="-130.8" font-family="monospace" font-size="14.00" fill="#ffffff">HEAD</text>
</g>
<!-- m10&#45;&gt;HEAD -->
<g id="edge18" class="edge">
<title>m10&#45;&gt;HEAD</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M431.6703,-92.5468C439.4468,-95.6663 454.8052,-101.7488 468,-106.5 487.6277,-113.5676 510.0515,-121.0282 526.7612,-126.4696"/>
</g>
<!-- master -->
<g id="node19" class="node">
<title>master</title>
<polygon fill="none" stroke="#ffffff" points="584.8,-105 518.8,-105 518.8,-82 584.8,-82 584.8,-105"/>
<text text-anchor="middle" x="551.8" y="-89.8" font-family="monospace" font-size="14.00" fill="#ffffff">master</text>
</g>
<!-- m10&#45;&gt;master -->
<g id="edge19" class="edge">
<title>m10&#45;&gt;master</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M432.3049,-90.6367C447.3259,-90.9966 488.8665,-91.992 518.7491,-92.708"/>
</g>
<!-- r2 -->
<g id="node12" class="node">
<title>r2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-61.5" rx="5.4" ry="5.4"/>
</g>
<!-- r1&#45;&gt;r2 -->
<g id="edge11" class="edge">
<title>r1&#45;&gt;r2</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-61.5C112.045,-61.5 124.8437,-61.5 134.2149,-61.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-63.6001 140.3053,-61.5 134.3053,-59.4001 134.3054,-63.6001"/>
</g>
<!-- r2&#45;&gt;m5 -->
<g id="edge12" class="edge">
<title>r2&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M150.4585,-64.3867C157.9573,-69.0334 172.8669,-78.2722 182.7887,-84.4203"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.754,-86.2497 187.9604,-87.625 183.9663,-82.6795 181.754,-86.2497"/>
</g>
<!-- f2 -->
<g id="node14" class="node">
<title>f2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-20.5" rx="5.4" ry="5.4"/>
</g>
<!-- f1&#45;&gt;f2 -->
<g id="edge13" class="edge">
<title>f1&#45;&gt;f2</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-20.5C346.045,-20.5 358.8437,-20.5 368.2149,-20.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-22.6001 374.3053,-20.5 368.3053,-18.4001 368.3054,-22.6001"/>
</g>
<!-- f3 -->
<g id="node15" class="node">
<title>f3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-20.5" rx="5.4" ry="5.4"/>
</g>
<!-- f2&#45;&gt;f3 -->
<g id="edge14" class="edge">
<title>f2&#45;&gt;f3</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-20.5C392.845,-20.5 405.6437,-20.5 415.0149,-20.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-22.6001 421.1053,-20.5 415.1053,-18.4001 415.1054,-22.6001"/>
</g>
<!-- feature -->
<g id="node20" class="node">
<title>feature</title>
<polygon fill="none" stroke="#ffffff" points="588.8,-23 514.8,-23 514.8,0 588.8,0 588.8,-23"/>
<text text-anchor="middle" x="551.8" y="-7.8" font-family="monospace" font-size="14.00" fill="#ffffff">feature</text>
</g>
<!-- f3&#45;&gt;feature -->
<g id="edge20" class="edge">
<title>f3&#45;&gt;feature</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M432.3049,-20.0899C446.6562,-19.0583 485.2149,-16.2865 514.6859,-14.1679"/>
</g>
<!-- b2 -->
<g id="node17" class="node">
<title>b2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="473.4" cy="-55.5" rx="5.4" ry="5.4"/>
</g>
<!-- b1&#45;&gt;b2 -->
<g id="edge15" class="edge">
<title>b1&#45;&gt;b2</title>
<path fill="none" stroke="#ffffff" d="M432.3386,-55.5C439.645,-55.5 452.4437,-55.5 461.8149,-55.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="461.9054,-57.6001 467.9053,-55.5 461.9053,-53.4001 461.9054,-57.6001"/>
</g>
<!-- bugfix -->
<g id="node21" class="node">
<title>bugfix</title>
<polygon fill="none" stroke="#ffffff" points="584.8,-64 518.8,-64 518.8,-41 584.8,-41 584.8,-64"/>
<text text-anchor="middle" x="551.8" y="-48.8" font-family="monospace" font-size="14.00" fill="#ffffff">bugfix</text>
</g>
<!-- b2&#45;&gt;bugfix -->
<g id="edge21" class="edge">
<title>b2&#45;&gt;bugfix</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M479.0383,-55.2842C487.3946,-54.9645 503.7044,-54.3404 518.7679,-53.764"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,37 @@
digraph repo_labels {
rankdir = "LR";
bgcolor = "transparent";
node[width=0.15, height=0.15, shape=point, color=white, fontcolor=white];
edge[weight=2, arrowhead=normal, arrowsize=0.6, color=white];
define(`digraph', `subgraph')
include(`master.dot')
include(`merged.dot')
include(`bugfix.dot')
m9 -> b1;
include(`feature.dot')
m7 -> f1;
f3 -> f4;
node[color=green];
edge[color=green];
node[group=feature];
bobf1 -> bobf2 -> bobf3 -> bobf4;
m7 -> bobf1;
node[shape=box, color=white, fontname="monospace"];
edge[color=white];
subgraph labels {
rank = "max";
//HEAD [style=dashed];
master;
"bob/feature";
feature;
bugfix;
}
edge[arrowhead=none, style=dashed];
//m10 -> HEAD;
m10 -> master;
bobf4 -> "bob/feature";
f4 -> feature;
b2 -> bugfix;
}

View file

@ -0,0 +1,298 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: repo_labels Pages: 1 -->
<svg width="630pt" height="154pt"
viewBox="0.00 0.00 629.80 154.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 150)">
<title>repo_labels</title>
<!-- m1 -->
<g id="node1" class="node">
<title>m1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="5.4" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2 -->
<g id="node2" class="node">
<title>m2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="52.2" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m1&#45;&gt;m2 -->
<g id="edge1" class="edge">
<title>m1&#45;&gt;m2</title>
<path fill="none" stroke="#ffffff" d="M11.1386,-116.5C18.445,-116.5 31.2437,-116.5 40.6149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="40.7054,-118.6001 46.7053,-116.5 40.7053,-114.4001 40.7054,-118.6001"/>
</g>
<!-- m3 -->
<g id="node3" class="node">
<title>m3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;m3 -->
<g id="edge2" class="edge">
<title>m2&#45;&gt;m3</title>
<path fill="none" stroke="#ffffff" d="M57.9386,-116.5C65.245,-116.5 78.0437,-116.5 87.4149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="87.5054,-118.6001 93.5053,-116.5 87.5053,-114.4001 87.5054,-118.6001"/>
</g>
<!-- r1 -->
<g id="node11" class="node">
<title>r1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-87.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;r1 -->
<g id="edge10" class="edge">
<title>m2&#45;&gt;r1</title>
<path fill="none" stroke="#ffffff" d="M56.8585,-113.6133C64.3573,-108.9666 79.2669,-99.7278 89.1887,-93.5797"/>
<polygon fill="#ffffff" stroke="#ffffff" points="90.3663,-95.3205 94.3604,-90.375 88.154,-91.7503 90.3663,-95.3205"/>
</g>
<!-- m4 -->
<g id="node4" class="node">
<title>m4</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m3&#45;&gt;m4 -->
<g id="edge3" class="edge">
<title>m3&#45;&gt;m4</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-116.5C112.045,-116.5 124.8437,-116.5 134.2149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-118.6001 140.3053,-116.5 134.3053,-114.4001 134.3054,-118.6001"/>
</g>
<!-- m5 -->
<g id="node5" class="node">
<title>m5</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="192.6" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m4&#45;&gt;m5 -->
<g id="edge4" class="edge">
<title>m4&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M151.5386,-116.5C158.845,-116.5 171.6437,-116.5 181.0149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.1054,-118.6001 187.1053,-116.5 181.1053,-114.4001 181.1054,-118.6001"/>
</g>
<!-- m6 -->
<g id="node6" class="node">
<title>m6</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="239.4" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m5&#45;&gt;m6 -->
<g id="edge5" class="edge">
<title>m5&#45;&gt;m6</title>
<path fill="none" stroke="#ffffff" d="M198.3386,-116.5C205.645,-116.5 218.4437,-116.5 227.8149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="227.9054,-118.6001 233.9053,-116.5 227.9053,-114.4001 227.9054,-118.6001"/>
</g>
<!-- m7 -->
<g id="node7" class="node">
<title>m7</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="286.2" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m6&#45;&gt;m7 -->
<g id="edge6" class="edge">
<title>m6&#45;&gt;m7</title>
<path fill="none" stroke="#ffffff" d="M245.1386,-116.5C252.445,-116.5 265.2437,-116.5 274.6149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="274.7054,-118.6001 280.7053,-116.5 274.7053,-114.4001 274.7054,-118.6001"/>
</g>
<!-- m8 -->
<g id="node8" class="node">
<title>m8</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;m8 -->
<g id="edge7" class="edge">
<title>m7&#45;&gt;m8</title>
<path fill="none" stroke="#ffffff" d="M291.9386,-116.5C299.245,-116.5 312.0437,-116.5 321.4149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="321.5054,-118.6001 327.5053,-116.5 321.5053,-114.4001 321.5054,-118.6001"/>
</g>
<!-- f1 -->
<g id="node15" class="node">
<title>f1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-55.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;f1 -->
<g id="edge17" class="edge">
<title>m7&#45;&gt;f1</title>
<path fill="none" stroke="#ffffff" d="M289.5657,-112.113C297.1213,-102.2649 315.57,-78.2185 325.8264,-64.8502"/>
<polygon fill="#ffffff" stroke="#ffffff" points="327.6786,-65.8859 329.6648,-59.8472 324.3464,-63.3293 327.6786,-65.8859"/>
</g>
<!-- bobf1 -->
<g id="node19" class="node">
<title>bobf1</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="333" cy="-11.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;bobf1 -->
<g id="edge22" class="edge">
<title>m7&#45;&gt;bobf1</title>
<path fill="none" stroke="#00ff00" d="M288.4573,-111.4356C295.6672,-95.2595 318.2505,-44.5919 328.2055,-22.257"/>
<polygon fill="#00ff00" stroke="#00ff00" points="330.1305,-23.0961 330.6551,-16.7609 326.2943,-21.3862 330.1305,-23.0961"/>
</g>
<!-- m9 -->
<g id="node9" class="node">
<title>m9</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m8&#45;&gt;m9 -->
<g id="edge8" class="edge">
<title>m8&#45;&gt;m9</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-116.5C346.045,-116.5 358.8437,-116.5 368.2149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-118.6001 374.3053,-116.5 368.3053,-114.4001 368.3054,-118.6001"/>
</g>
<!-- m10 -->
<g id="node10" class="node">
<title>m10</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;m10 -->
<g id="edge9" class="edge">
<title>m9&#45;&gt;m10</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-116.5C392.845,-116.5 405.6437,-116.5 415.0149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-118.6001 421.1053,-116.5 415.1053,-114.4001 415.1054,-118.6001"/>
</g>
<!-- b1 -->
<g id="node13" class="node">
<title>b1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-87.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;b1 -->
<g id="edge14" class="edge">
<title>m9&#45;&gt;b1</title>
<path fill="none" stroke="#ffffff" d="M384.4585,-113.6133C391.9573,-108.9666 406.8669,-99.7278 416.7887,-93.5797"/>
<polygon fill="#ffffff" stroke="#ffffff" points="417.9663,-95.3205 421.9604,-90.375 415.754,-91.7503 417.9663,-95.3205"/>
</g>
<!-- master -->
<g id="node23" class="node">
<title>master</title>
<polygon fill="none" stroke="#ffffff" points="601.3,-146 535.3,-146 535.3,-123 601.3,-123 601.3,-146"/>
<text text-anchor="middle" x="568.3" y="-130.8" font-family="monospace" font-size="14.00" fill="#ffffff">master</text>
</g>
<!-- m10&#45;&gt;master -->
<g id="edge23" class="edge">
<title>m10&#45;&gt;master</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M431.9818,-117.1836C448.6643,-119.3028 500.4714,-125.8838 535.195,-130.2947"/>
</g>
<!-- r2 -->
<g id="node12" class="node">
<title>r2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-87.5" rx="5.4" ry="5.4"/>
</g>
<!-- r1&#45;&gt;r2 -->
<g id="edge11" class="edge">
<title>r1&#45;&gt;r2</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-87.5C112.045,-87.5 124.8437,-87.5 134.2149,-87.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-89.6001 140.3053,-87.5 134.3053,-85.4001 134.3054,-89.6001"/>
</g>
<!-- r2&#45;&gt;m5 -->
<g id="edge12" class="edge">
<title>r2&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M150.4585,-90.3867C157.9573,-95.0334 172.8669,-104.2722 182.7887,-110.4203"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.754,-112.2497 187.9604,-113.625 183.9663,-108.6795 181.754,-112.2497"/>
</g>
<!-- b2 -->
<g id="node14" class="node">
<title>b2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="473.4" cy="-87.5" rx="5.4" ry="5.4"/>
</g>
<!-- b1&#45;&gt;b2 -->
<g id="edge13" class="edge">
<title>b1&#45;&gt;b2</title>
<path fill="none" stroke="#ffffff" d="M432.3386,-87.5C439.645,-87.5 452.4437,-87.5 461.8149,-87.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="461.9054,-89.6001 467.9053,-87.5 461.9053,-85.4001 461.9054,-89.6001"/>
</g>
<!-- bugfix -->
<g id="node26" class="node">
<title>bugfix</title>
<polygon fill="none" stroke="#ffffff" points="601.3,-105 535.3,-105 535.3,-82 601.3,-82 601.3,-105"/>
<text text-anchor="middle" x="568.3" y="-89.8" font-family="monospace" font-size="14.00" fill="#ffffff">bugfix</text>
</g>
<!-- b2&#45;&gt;bugfix -->
<g id="edge26" class="edge">
<title>b2&#45;&gt;bugfix</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M479.0522,-87.8574C489.9058,-88.5436 514.4155,-90.0932 535.0086,-91.3952"/>
</g>
<!-- f2 -->
<g id="node16" class="node">
<title>f2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-55.5" rx="5.4" ry="5.4"/>
</g>
<!-- f1&#45;&gt;f2 -->
<g id="edge15" class="edge">
<title>f1&#45;&gt;f2</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-55.5C346.045,-55.5 358.8437,-55.5 368.2149,-55.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-57.6001 374.3053,-55.5 368.3053,-53.4001 368.3054,-57.6001"/>
</g>
<!-- f3 -->
<g id="node17" class="node">
<title>f3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-55.5" rx="5.4" ry="5.4"/>
</g>
<!-- f2&#45;&gt;f3 -->
<g id="edge16" class="edge">
<title>f2&#45;&gt;f3</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-55.5C392.845,-55.5 405.6437,-55.5 415.0149,-55.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-57.6001 421.1053,-55.5 415.1053,-53.4001 415.1054,-57.6001"/>
</g>
<!-- f4 -->
<g id="node18" class="node">
<title>f4</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="473.4" cy="-53.5" rx="5.4" ry="5.4"/>
</g>
<!-- f3&#45;&gt;f4 -->
<g id="edge18" class="edge">
<title>f3&#45;&gt;f4</title>
<path fill="none" stroke="#ffffff" d="M432.3386,-55.2548C439.645,-54.9425 452.4437,-54.3956 461.8149,-53.9951"/>
<polygon fill="#ffffff" stroke="#ffffff" points="462.0005,-56.0892 467.9053,-53.7348 461.8211,-51.893 462.0005,-56.0892"/>
</g>
<!-- feature -->
<g id="node25" class="node">
<title>feature</title>
<polygon fill="none" stroke="#ffffff" points="605.3,-64 531.3,-64 531.3,-41 605.3,-41 605.3,-64"/>
<text text-anchor="middle" x="568.3" y="-48.8" font-family="monospace" font-size="14.00" fill="#ffffff">feature</text>
</g>
<!-- f4&#45;&gt;feature -->
<g id="edge25" class="edge">
<title>f4&#45;&gt;feature</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M479.0522,-53.4404C489.1875,-53.3336 511.2314,-53.1014 530.8739,-52.8944"/>
</g>
<!-- bobf2 -->
<g id="node20" class="node">
<title>bobf2</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="379.8" cy="-11.5" rx="5.4" ry="5.4"/>
</g>
<!-- bobf1&#45;&gt;bobf2 -->
<g id="edge19" class="edge">
<title>bobf1&#45;&gt;bobf2</title>
<path fill="none" stroke="#00ff00" d="M338.7386,-11.5C346.045,-11.5 358.8437,-11.5 368.2149,-11.5"/>
<polygon fill="#00ff00" stroke="#00ff00" points="368.3054,-13.6001 374.3053,-11.5 368.3053,-9.4001 368.3054,-13.6001"/>
</g>
<!-- bobf3 -->
<g id="node21" class="node">
<title>bobf3</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="426.6" cy="-11.5" rx="5.4" ry="5.4"/>
</g>
<!-- bobf2&#45;&gt;bobf3 -->
<g id="edge20" class="edge">
<title>bobf2&#45;&gt;bobf3</title>
<path fill="none" stroke="#00ff00" d="M385.5386,-11.5C392.845,-11.5 405.6437,-11.5 415.0149,-11.5"/>
<polygon fill="#00ff00" stroke="#00ff00" points="415.1054,-13.6001 421.1053,-11.5 415.1053,-9.4001 415.1054,-13.6001"/>
</g>
<!-- bobf4 -->
<g id="node22" class="node">
<title>bobf4</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="473.4" cy="-11.5" rx="5.4" ry="5.4"/>
</g>
<!-- bobf3&#45;&gt;bobf4 -->
<g id="edge21" class="edge">
<title>bobf3&#45;&gt;bobf4</title>
<path fill="none" stroke="#00ff00" d="M432.3386,-11.5C439.645,-11.5 452.4437,-11.5 461.8149,-11.5"/>
<polygon fill="#00ff00" stroke="#00ff00" points="461.9054,-13.6001 467.9053,-11.5 461.9053,-9.4001 461.9054,-13.6001"/>
</g>
<!-- bob/feature -->
<g id="node24" class="node">
<title>bob/feature</title>
<polygon fill="none" stroke="#ffffff" points="621.8,-23 514.8,-23 514.8,0 621.8,0 621.8,-23"/>
<text text-anchor="middle" x="568.3" y="-7.8" font-family="monospace" font-size="14.00" fill="#ffffff">bob/feature</text>
</g>
<!-- bobf4&#45;&gt;bob/feature -->
<g id="edge24" class="edge">
<title>bobf4&#45;&gt;bob/feature</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M479.0522,-11.5C486.3943,-11.5 499.9857,-11.5 514.3864,-11.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,30 @@
digraph repo_labels {
rankdir = "LR";
bgcolor = "transparent";
node[width=0.15, height=0.15, shape=point, color=white, fontcolor=white];
edge[weight=2, arrowhead=normal, arrowsize=0.6, color=white];
define(`digraph', `subgraph')
include(`master.dot')
include(`merged.dot')
include(`bugfix.dot')
m9 -> b1;
node[color=green];
edge[color=green];
include(`feature.dot')
m7 -> f1;
node[shape=box, color=white, fontname="monospace"];
edge[color=white];
subgraph labels {
rank = "max";
//HEAD [style=dashed];
master;
"alice/feature";
bugfix;
}
edge[arrowhead=none, style=dashed];
//m10 -> HEAD;
m10 -> master;
f3 -> "alice/feature";
b2 -> bugfix;
}

View file

@ -0,0 +1,232 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: repo_labels Pages: 1 -->
<svg width="647pt" height="113pt"
viewBox="0.00 0.00 646.80 113.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 109)">
<title>repo_labels</title>
<!-- m1 -->
<g id="node1" class="node">
<title>m1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="5.4" cy="-81.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2 -->
<g id="node2" class="node">
<title>m2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="52.2" cy="-81.5" rx="5.4" ry="5.4"/>
</g>
<!-- m1&#45;&gt;m2 -->
<g id="edge1" class="edge">
<title>m1&#45;&gt;m2</title>
<path fill="none" stroke="#ffffff" d="M11.1386,-81.5C18.445,-81.5 31.2437,-81.5 40.6149,-81.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="40.7054,-83.6001 46.7053,-81.5 40.7053,-79.4001 40.7054,-83.6001"/>
</g>
<!-- m3 -->
<g id="node3" class="node">
<title>m3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-81.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;m3 -->
<g id="edge2" class="edge">
<title>m2&#45;&gt;m3</title>
<path fill="none" stroke="#ffffff" d="M57.9386,-81.5C65.245,-81.5 78.0437,-81.5 87.4149,-81.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="87.5054,-83.6001 93.5053,-81.5 87.5053,-79.4001 87.5054,-83.6001"/>
</g>
<!-- r1 -->
<g id="node11" class="node">
<title>r1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;r1 -->
<g id="edge10" class="edge">
<title>m2&#45;&gt;r1</title>
<path fill="none" stroke="#ffffff" d="M56.8585,-78.6133C64.3573,-73.9666 79.2669,-64.7278 89.1887,-58.5797"/>
<polygon fill="#ffffff" stroke="#ffffff" points="90.3663,-60.3205 94.3604,-55.375 88.154,-56.7503 90.3663,-60.3205"/>
</g>
<!-- m4 -->
<g id="node4" class="node">
<title>m4</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-81.5" rx="5.4" ry="5.4"/>
</g>
<!-- m3&#45;&gt;m4 -->
<g id="edge3" class="edge">
<title>m3&#45;&gt;m4</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-81.5C112.045,-81.5 124.8437,-81.5 134.2149,-81.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-83.6001 140.3053,-81.5 134.3053,-79.4001 134.3054,-83.6001"/>
</g>
<!-- m5 -->
<g id="node5" class="node">
<title>m5</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="192.6" cy="-81.5" rx="5.4" ry="5.4"/>
</g>
<!-- m4&#45;&gt;m5 -->
<g id="edge4" class="edge">
<title>m4&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M151.5386,-81.5C158.845,-81.5 171.6437,-81.5 181.0149,-81.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.1054,-83.6001 187.1053,-81.5 181.1053,-79.4001 181.1054,-83.6001"/>
</g>
<!-- m6 -->
<g id="node6" class="node">
<title>m6</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="239.4" cy="-81.5" rx="5.4" ry="5.4"/>
</g>
<!-- m5&#45;&gt;m6 -->
<g id="edge5" class="edge">
<title>m5&#45;&gt;m6</title>
<path fill="none" stroke="#ffffff" d="M198.3386,-81.5C205.645,-81.5 218.4437,-81.5 227.8149,-81.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="227.9054,-83.6001 233.9053,-81.5 227.9053,-79.4001 227.9054,-83.6001"/>
</g>
<!-- m7 -->
<g id="node7" class="node">
<title>m7</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="286.2" cy="-81.5" rx="5.4" ry="5.4"/>
</g>
<!-- m6&#45;&gt;m7 -->
<g id="edge6" class="edge">
<title>m6&#45;&gt;m7</title>
<path fill="none" stroke="#ffffff" d="M245.1386,-81.5C252.445,-81.5 265.2437,-81.5 274.6149,-81.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="274.7054,-83.6001 280.7053,-81.5 274.7053,-79.4001 274.7054,-83.6001"/>
</g>
<!-- m8 -->
<g id="node8" class="node">
<title>m8</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-81.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;m8 -->
<g id="edge7" class="edge">
<title>m7&#45;&gt;m8</title>
<path fill="none" stroke="#ffffff" d="M291.9386,-81.5C299.245,-81.5 312.0437,-81.5 321.4149,-81.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="321.5054,-83.6001 327.5053,-81.5 321.5053,-79.4001 321.5054,-83.6001"/>
</g>
<!-- f1 -->
<g id="node15" class="node">
<title>f1</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="333" cy="-17.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;f1 -->
<g id="edge17" class="edge">
<title>m7&#45;&gt;f1</title>
<path fill="none" stroke="#00ff00" d="M289.5657,-76.8973C297.1888,-66.4726 315.9003,-40.8841 326.0991,-26.9371"/>
<polygon fill="#00ff00" stroke="#00ff00" points="327.8182,-28.1439 329.6648,-22.061 324.428,-25.6647 327.8182,-28.1439"/>
</g>
<!-- m9 -->
<g id="node9" class="node">
<title>m9</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-81.5" rx="5.4" ry="5.4"/>
</g>
<!-- m8&#45;&gt;m9 -->
<g id="edge8" class="edge">
<title>m8&#45;&gt;m9</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-81.5C346.045,-81.5 358.8437,-81.5 368.2149,-81.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-83.6001 374.3053,-81.5 368.3053,-79.4001 368.3054,-83.6001"/>
</g>
<!-- m10 -->
<g id="node10" class="node">
<title>m10</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-81.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;m10 -->
<g id="edge9" class="edge">
<title>m9&#45;&gt;m10</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-81.5C392.845,-81.5 405.6437,-81.5 415.0149,-81.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-83.6001 421.1053,-81.5 415.1053,-79.4001 415.1054,-83.6001"/>
</g>
<!-- b1 -->
<g id="node13" class="node">
<title>b1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;b1 -->
<g id="edge14" class="edge">
<title>m9&#45;&gt;b1</title>
<path fill="none" stroke="#ffffff" d="M384.4585,-78.6133C391.9573,-73.9666 406.8669,-64.7278 416.7887,-58.5797"/>
<polygon fill="#ffffff" stroke="#ffffff" points="417.9663,-60.3205 421.9604,-55.375 415.754,-56.7503 417.9663,-60.3205"/>
</g>
<!-- master -->
<g id="node18" class="node">
<title>master</title>
<polygon fill="none" stroke="#ffffff" points="609.8,-105 543.8,-105 543.8,-82 609.8,-82 609.8,-105"/>
<text text-anchor="middle" x="576.8" y="-89.8" font-family="monospace" font-size="14.00" fill="#ffffff">master</text>
</g>
<!-- m10&#45;&gt;master -->
<g id="edge18" class="edge">
<title>m10&#45;&gt;master</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M432.3046,-81.9558C450.3094,-83.3942 506.9119,-87.9164 543.6985,-90.8554"/>
</g>
<!-- r2 -->
<g id="node12" class="node">
<title>r2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- r1&#45;&gt;r2 -->
<g id="edge11" class="edge">
<title>r1&#45;&gt;r2</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-52.5C112.045,-52.5 124.8437,-52.5 134.2149,-52.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-54.6001 140.3053,-52.5 134.3053,-50.4001 134.3054,-54.6001"/>
</g>
<!-- r2&#45;&gt;m5 -->
<g id="edge12" class="edge">
<title>r2&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M150.4585,-55.3867C157.9573,-60.0334 172.8669,-69.2722 182.7887,-75.4203"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.754,-77.2497 187.9604,-78.625 183.9663,-73.6795 181.754,-77.2497"/>
</g>
<!-- b2 -->
<g id="node14" class="node">
<title>b2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="473.4" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- b1&#45;&gt;b2 -->
<g id="edge13" class="edge">
<title>b1&#45;&gt;b2</title>
<path fill="none" stroke="#ffffff" d="M432.3386,-52.5C439.645,-52.5 452.4437,-52.5 461.8149,-52.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="461.9054,-54.6001 467.9053,-52.5 461.9053,-50.4001 461.9054,-54.6001"/>
</g>
<!-- bugfix -->
<g id="node20" class="node">
<title>bugfix</title>
<polygon fill="none" stroke="#ffffff" points="609.8,-64 543.8,-64 543.8,-41 609.8,-41 609.8,-64"/>
<text text-anchor="middle" x="576.8" y="-48.8" font-family="monospace" font-size="14.00" fill="#ffffff">bugfix</text>
</g>
<!-- b2&#45;&gt;bugfix -->
<g id="edge20" class="edge">
<title>b2&#45;&gt;bugfix</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M478.9592,-52.5C490.9563,-52.5 520.0793,-52.5 543.452,-52.5"/>
</g>
<!-- f2 -->
<g id="node16" class="node">
<title>f2</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="379.8" cy="-17.5" rx="5.4" ry="5.4"/>
</g>
<!-- f1&#45;&gt;f2 -->
<g id="edge15" class="edge">
<title>f1&#45;&gt;f2</title>
<path fill="none" stroke="#00ff00" d="M338.7386,-17.5C346.045,-17.5 358.8437,-17.5 368.2149,-17.5"/>
<polygon fill="#00ff00" stroke="#00ff00" points="368.3054,-19.6001 374.3053,-17.5 368.3053,-15.4001 368.3054,-19.6001"/>
</g>
<!-- f3 -->
<g id="node17" class="node">
<title>f3</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="426.6" cy="-17.5" rx="5.4" ry="5.4"/>
</g>
<!-- f2&#45;&gt;f3 -->
<g id="edge16" class="edge">
<title>f2&#45;&gt;f3</title>
<path fill="none" stroke="#00ff00" d="M385.5386,-17.5C392.845,-17.5 405.6437,-17.5 415.0149,-17.5"/>
<polygon fill="#00ff00" stroke="#00ff00" points="415.1054,-19.6001 421.1053,-17.5 415.1053,-15.4001 415.1054,-19.6001"/>
</g>
<!-- alice/feature -->
<g id="node19" class="node">
<title>alice/feature</title>
<polygon fill="none" stroke="#ffffff" points="638.8,-23 514.8,-23 514.8,0 638.8,0 638.8,-23"/>
<text text-anchor="middle" x="576.8" y="-7.8" font-family="monospace" font-size="14.00" fill="#ffffff">alice/feature</text>
</g>
<!-- f3&#45;&gt;alice/feature -->
<g id="edge19" class="edge">
<title>f3&#45;&gt;alice/feature</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M432.3046,-17.2721C445.9689,-16.7263 481.8645,-15.2924 514.4574,-13.9904"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.6 KiB

View file

@ -0,0 +1,39 @@
digraph repo_labels {
rankdir = "LR";
bgcolor = "transparent";
node[width=0.15, height=0.15, shape=point, color=white, fontcolor=white];
edge[weight=2, arrowhead=normal, arrowsize=0.6, color=white];
define(`digraph', `subgraph')
include(`master.dot')
include(`merged.dot')
include(`bugfix.dot')
m9 -> b1;
include(`feature.dot')
m7 -> f1;
node[color=red];
edge[color=red];
f3 -> f4;
node[color=green];
edge[color=green];
node[group=feature];
alicef1 -> alicef2 -> alicef3;
m7 -> alicef1;
node[shape=box, color=white, fontname="monospace"];
edge[color=white];
subgraph labels {
rank = "max";
//HEAD [style=dashed];
master;
"alice/feature";
feature;
bugfix;
}
edge[arrowhead=none, style=dashed];
//m10 -> HEAD;
m10 -> master;
alicef3 -> "alice/feature";
f4 -> feature;
b2 -> bugfix;
}

View file

@ -0,0 +1,287 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: repo_labels Pages: 1 -->
<svg width="647pt" height="154pt"
viewBox="0.00 0.00 646.80 154.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 150)">
<title>repo_labels</title>
<!-- m1 -->
<g id="node1" class="node">
<title>m1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="5.4" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2 -->
<g id="node2" class="node">
<title>m2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="52.2" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m1&#45;&gt;m2 -->
<g id="edge1" class="edge">
<title>m1&#45;&gt;m2</title>
<path fill="none" stroke="#ffffff" d="M11.1386,-116.5C18.445,-116.5 31.2437,-116.5 40.6149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="40.7054,-118.6001 46.7053,-116.5 40.7053,-114.4001 40.7054,-118.6001"/>
</g>
<!-- m3 -->
<g id="node3" class="node">
<title>m3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;m3 -->
<g id="edge2" class="edge">
<title>m2&#45;&gt;m3</title>
<path fill="none" stroke="#ffffff" d="M57.9386,-116.5C65.245,-116.5 78.0437,-116.5 87.4149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="87.5054,-118.6001 93.5053,-116.5 87.5053,-114.4001 87.5054,-118.6001"/>
</g>
<!-- r1 -->
<g id="node11" class="node">
<title>r1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-87.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;r1 -->
<g id="edge10" class="edge">
<title>m2&#45;&gt;r1</title>
<path fill="none" stroke="#ffffff" d="M56.8585,-113.6133C64.3573,-108.9666 79.2669,-99.7278 89.1887,-93.5797"/>
<polygon fill="#ffffff" stroke="#ffffff" points="90.3663,-95.3205 94.3604,-90.375 88.154,-91.7503 90.3663,-95.3205"/>
</g>
<!-- m4 -->
<g id="node4" class="node">
<title>m4</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m3&#45;&gt;m4 -->
<g id="edge3" class="edge">
<title>m3&#45;&gt;m4</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-116.5C112.045,-116.5 124.8437,-116.5 134.2149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-118.6001 140.3053,-116.5 134.3053,-114.4001 134.3054,-118.6001"/>
</g>
<!-- m5 -->
<g id="node5" class="node">
<title>m5</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="192.6" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m4&#45;&gt;m5 -->
<g id="edge4" class="edge">
<title>m4&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M151.5386,-116.5C158.845,-116.5 171.6437,-116.5 181.0149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.1054,-118.6001 187.1053,-116.5 181.1053,-114.4001 181.1054,-118.6001"/>
</g>
<!-- m6 -->
<g id="node6" class="node">
<title>m6</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="239.4" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m5&#45;&gt;m6 -->
<g id="edge5" class="edge">
<title>m5&#45;&gt;m6</title>
<path fill="none" stroke="#ffffff" d="M198.3386,-116.5C205.645,-116.5 218.4437,-116.5 227.8149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="227.9054,-118.6001 233.9053,-116.5 227.9053,-114.4001 227.9054,-118.6001"/>
</g>
<!-- m7 -->
<g id="node7" class="node">
<title>m7</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="286.2" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m6&#45;&gt;m7 -->
<g id="edge6" class="edge">
<title>m6&#45;&gt;m7</title>
<path fill="none" stroke="#ffffff" d="M245.1386,-116.5C252.445,-116.5 265.2437,-116.5 274.6149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="274.7054,-118.6001 280.7053,-116.5 274.7053,-114.4001 274.7054,-118.6001"/>
</g>
<!-- m8 -->
<g id="node8" class="node">
<title>m8</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;m8 -->
<g id="edge7" class="edge">
<title>m7&#45;&gt;m8</title>
<path fill="none" stroke="#ffffff" d="M291.9386,-116.5C299.245,-116.5 312.0437,-116.5 321.4149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="321.5054,-118.6001 327.5053,-116.5 321.5053,-114.4001 321.5054,-118.6001"/>
</g>
<!-- f1 -->
<g id="node15" class="node">
<title>f1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-55.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;f1 -->
<g id="edge17" class="edge">
<title>m7&#45;&gt;f1</title>
<path fill="none" stroke="#ffffff" d="M289.5657,-112.113C297.1213,-102.2649 315.57,-78.2185 325.8264,-64.8502"/>
<polygon fill="#ffffff" stroke="#ffffff" points="327.6786,-65.8859 329.6648,-59.8472 324.3464,-63.3293 327.6786,-65.8859"/>
</g>
<!-- alicef1 -->
<g id="node19" class="node">
<title>alicef1</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="379.8" cy="-11.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;alicef1 -->
<g id="edge21" class="edge">
<title>m7&#45;&gt;alicef1</title>
<path fill="none" stroke="#00ff00" d="M287.9979,-111.1521C292.6703,-97.9163 306.3317,-63.1382 327.6,-41.5 339.5935,-29.2979 357.591,-20.4348 369.011,-15.6295"/>
<polygon fill="#00ff00" stroke="#00ff00" points="369.8161,-17.5692 374.599,-13.3819 368.2487,-13.6726 369.8161,-17.5692"/>
</g>
<!-- m9 -->
<g id="node9" class="node">
<title>m9</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m8&#45;&gt;m9 -->
<g id="edge8" class="edge">
<title>m8&#45;&gt;m9</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-116.5C346.045,-116.5 358.8437,-116.5 368.2149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-118.6001 374.3053,-116.5 368.3053,-114.4001 368.3054,-118.6001"/>
</g>
<!-- m10 -->
<g id="node10" class="node">
<title>m10</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-116.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;m10 -->
<g id="edge9" class="edge">
<title>m9&#45;&gt;m10</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-116.5C392.845,-116.5 405.6437,-116.5 415.0149,-116.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-118.6001 421.1053,-116.5 415.1053,-114.4001 415.1054,-118.6001"/>
</g>
<!-- b1 -->
<g id="node13" class="node">
<title>b1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-87.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;b1 -->
<g id="edge14" class="edge">
<title>m9&#45;&gt;b1</title>
<path fill="none" stroke="#ffffff" d="M384.4585,-113.6133C391.9573,-108.9666 406.8669,-99.7278 416.7887,-93.5797"/>
<polygon fill="#ffffff" stroke="#ffffff" points="417.9663,-95.3205 421.9604,-90.375 415.754,-91.7503 417.9663,-95.3205"/>
</g>
<!-- master -->
<g id="node22" class="node">
<title>master</title>
<polygon fill="none" stroke="#ffffff" points="609.8,-146 543.8,-146 543.8,-123 609.8,-123 609.8,-146"/>
<text text-anchor="middle" x="576.8" y="-130.8" font-family="monospace" font-size="14.00" fill="#ffffff">master</text>
</g>
<!-- m10&#45;&gt;master -->
<g id="edge22" class="edge">
<title>m10&#45;&gt;master</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M432.3046,-117.1836C450.3094,-119.3413 506.9119,-126.1246 543.6985,-130.5331"/>
</g>
<!-- r2 -->
<g id="node12" class="node">
<title>r2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-87.5" rx="5.4" ry="5.4"/>
</g>
<!-- r1&#45;&gt;r2 -->
<g id="edge11" class="edge">
<title>r1&#45;&gt;r2</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-87.5C112.045,-87.5 124.8437,-87.5 134.2149,-87.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-89.6001 140.3053,-87.5 134.3053,-85.4001 134.3054,-89.6001"/>
</g>
<!-- r2&#45;&gt;m5 -->
<g id="edge12" class="edge">
<title>r2&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M150.4585,-90.3867C157.9573,-95.0334 172.8669,-104.2722 182.7887,-110.4203"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.754,-112.2497 187.9604,-113.625 183.9663,-108.6795 181.754,-112.2497"/>
</g>
<!-- b2 -->
<g id="node14" class="node">
<title>b2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="473.4" cy="-87.5" rx="5.4" ry="5.4"/>
</g>
<!-- b1&#45;&gt;b2 -->
<g id="edge13" class="edge">
<title>b1&#45;&gt;b2</title>
<path fill="none" stroke="#ffffff" d="M432.3386,-87.5C439.645,-87.5 452.4437,-87.5 461.8149,-87.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="461.9054,-89.6001 467.9053,-87.5 461.9053,-85.4001 461.9054,-89.6001"/>
</g>
<!-- bugfix -->
<g id="node25" class="node">
<title>bugfix</title>
<polygon fill="none" stroke="#ffffff" points="609.8,-105 543.8,-105 543.8,-82 609.8,-82 609.8,-105"/>
<text text-anchor="middle" x="576.8" y="-89.8" font-family="monospace" font-size="14.00" fill="#ffffff">bugfix</text>
</g>
<!-- b2&#45;&gt;bugfix -->
<g id="edge25" class="edge">
<title>b2&#45;&gt;bugfix</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M478.9592,-87.8226C490.9563,-88.5187 520.0793,-90.2087 543.452,-91.5649"/>
</g>
<!-- f2 -->
<g id="node16" class="node">
<title>f2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-55.5" rx="5.4" ry="5.4"/>
</g>
<!-- f1&#45;&gt;f2 -->
<g id="edge15" class="edge">
<title>f1&#45;&gt;f2</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-55.5C346.045,-55.5 358.8437,-55.5 368.2149,-55.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-57.6001 374.3053,-55.5 368.3053,-53.4001 368.3054,-57.6001"/>
</g>
<!-- f3 -->
<g id="node17" class="node">
<title>f3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-55.5" rx="5.4" ry="5.4"/>
</g>
<!-- f2&#45;&gt;f3 -->
<g id="edge16" class="edge">
<title>f2&#45;&gt;f3</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-55.5C392.845,-55.5 405.6437,-55.5 415.0149,-55.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-57.6001 421.1053,-55.5 415.1053,-53.4001 415.1054,-57.6001"/>
</g>
<!-- f4 -->
<g id="node18" class="node">
<title>f4</title>
<ellipse fill="#ff0000" stroke="#ff0000" cx="473.4" cy="-53.5" rx="5.4" ry="5.4"/>
</g>
<!-- f3&#45;&gt;f4 -->
<g id="edge18" class="edge">
<title>f3&#45;&gt;f4</title>
<path fill="none" stroke="#ff0000" d="M432.3386,-55.2548C439.645,-54.9425 452.4437,-54.3956 461.8149,-53.9951"/>
<polygon fill="#ff0000" stroke="#ff0000" points="462.0005,-56.0892 467.9053,-53.7348 461.8211,-51.893 462.0005,-56.0892"/>
</g>
<!-- feature -->
<g id="node24" class="node">
<title>feature</title>
<polygon fill="none" stroke="#ffffff" points="613.8,-64 539.8,-64 539.8,-41 613.8,-41 613.8,-64"/>
<text text-anchor="middle" x="576.8" y="-48.8" font-family="monospace" font-size="14.00" fill="#ffffff">feature</text>
</g>
<!-- f4&#45;&gt;feature -->
<g id="edge24" class="edge">
<title>f4&#45;&gt;feature</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M478.9592,-53.4462C490.3271,-53.3363 517.0716,-53.0776 539.7304,-52.8585"/>
</g>
<!-- alicef2 -->
<g id="node20" class="node">
<title>alicef2</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="426.6" cy="-11.5" rx="5.4" ry="5.4"/>
</g>
<!-- alicef1&#45;&gt;alicef2 -->
<g id="edge19" class="edge">
<title>alicef1&#45;&gt;alicef2</title>
<path fill="none" stroke="#00ff00" d="M385.5386,-11.5C392.845,-11.5 405.6437,-11.5 415.0149,-11.5"/>
<polygon fill="#00ff00" stroke="#00ff00" points="415.1054,-13.6001 421.1053,-11.5 415.1053,-9.4001 415.1054,-13.6001"/>
</g>
<!-- alicef3 -->
<g id="node21" class="node">
<title>alicef3</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="473.4" cy="-11.5" rx="5.4" ry="5.4"/>
</g>
<!-- alicef2&#45;&gt;alicef3 -->
<g id="edge20" class="edge">
<title>alicef2&#45;&gt;alicef3</title>
<path fill="none" stroke="#00ff00" d="M432.3386,-11.5C439.645,-11.5 452.4437,-11.5 461.8149,-11.5"/>
<polygon fill="#00ff00" stroke="#00ff00" points="461.9054,-13.6001 467.9053,-11.5 461.9053,-9.4001 461.9054,-13.6001"/>
</g>
<!-- alice/feature -->
<g id="node23" class="node">
<title>alice/feature</title>
<polygon fill="none" stroke="#ffffff" points="638.8,-23 514.8,-23 514.8,0 638.8,0 638.8,-23"/>
<text text-anchor="middle" x="576.8" y="-7.8" font-family="monospace" font-size="14.00" fill="#ffffff">alice/feature</text>
</g>
<!-- alicef3&#45;&gt;alice/feature -->
<g id="edge23" class="edge">
<title>alicef3&#45;&gt;alice/feature</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M478.9592,-11.5C486.2581,-11.5 499.8961,-11.5 514.7215,-11.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,31 @@
digraph repo_labels {
rankdir = "LR";
bgcolor = "transparent";
node[width=0.15, height=0.15, shape=point, color=white, fontcolor=white];
edge[weight=2, arrowhead=normal, arrowsize=0.6, color=white];
define(`digraph', `subgraph')
include(`master.dot')
include(`merged.dot')
include(`feature.dot')
include(`bugfix.dot')
m7 -> f1;
m9 -> b1;
node[group=master, color=green];
edge[color=green];
m10 -> m11;
node[shape=box, color=white, fontname="monospace"];
edge[color=white];
subgraph labels {
rank = "max";
HEAD [style=dashed];
master;
feature;
bugfix;
}
edge[arrowhead=none, style=dashed];
m11 -> HEAD;
m11 -> master;
f3 -> feature;
b2 -> bugfix;
}

View file

@ -0,0 +1,254 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: repo_labels Pages: 1 -->
<svg width="597pt" height="154pt"
viewBox="0.00 0.00 596.80 154.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 150)">
<title>repo_labels</title>
<!-- m1 -->
<g id="node1" class="node">
<title>m1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="5.4" cy="-93.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2 -->
<g id="node2" class="node">
<title>m2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="52.2" cy="-93.5" rx="5.4" ry="5.4"/>
</g>
<!-- m1&#45;&gt;m2 -->
<g id="edge1" class="edge">
<title>m1&#45;&gt;m2</title>
<path fill="none" stroke="#ffffff" d="M11.1386,-93.5C18.445,-93.5 31.2437,-93.5 40.6149,-93.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="40.7054,-95.6001 46.7053,-93.5 40.7053,-91.4001 40.7054,-95.6001"/>
</g>
<!-- m3 -->
<g id="node3" class="node">
<title>m3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-93.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;m3 -->
<g id="edge2" class="edge">
<title>m2&#45;&gt;m3</title>
<path fill="none" stroke="#ffffff" d="M57.9386,-93.5C65.245,-93.5 78.0437,-93.5 87.4149,-93.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="87.5054,-95.6001 93.5053,-93.5 87.5053,-91.4001 87.5054,-95.6001"/>
</g>
<!-- r1 -->
<g id="node11" class="node">
<title>r1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-64.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;r1 -->
<g id="edge10" class="edge">
<title>m2&#45;&gt;r1</title>
<path fill="none" stroke="#ffffff" d="M56.8585,-90.6133C64.3573,-85.9666 79.2669,-76.7278 89.1887,-70.5797"/>
<polygon fill="#ffffff" stroke="#ffffff" points="90.3663,-72.3205 94.3604,-67.375 88.154,-68.7503 90.3663,-72.3205"/>
</g>
<!-- m4 -->
<g id="node4" class="node">
<title>m4</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-93.5" rx="5.4" ry="5.4"/>
</g>
<!-- m3&#45;&gt;m4 -->
<g id="edge3" class="edge">
<title>m3&#45;&gt;m4</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-93.5C112.045,-93.5 124.8437,-93.5 134.2149,-93.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-95.6001 140.3053,-93.5 134.3053,-91.4001 134.3054,-95.6001"/>
</g>
<!-- m5 -->
<g id="node5" class="node">
<title>m5</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="192.6" cy="-93.5" rx="5.4" ry="5.4"/>
</g>
<!-- m4&#45;&gt;m5 -->
<g id="edge4" class="edge">
<title>m4&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M151.5386,-93.5C158.845,-93.5 171.6437,-93.5 181.0149,-93.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.1054,-95.6001 187.1053,-93.5 181.1053,-91.4001 181.1054,-95.6001"/>
</g>
<!-- m6 -->
<g id="node6" class="node">
<title>m6</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="239.4" cy="-93.5" rx="5.4" ry="5.4"/>
</g>
<!-- m5&#45;&gt;m6 -->
<g id="edge5" class="edge">
<title>m5&#45;&gt;m6</title>
<path fill="none" stroke="#ffffff" d="M198.3386,-93.5C205.645,-93.5 218.4437,-93.5 227.8149,-93.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="227.9054,-95.6001 233.9053,-93.5 227.9053,-91.4001 227.9054,-95.6001"/>
</g>
<!-- m7 -->
<g id="node7" class="node">
<title>m7</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="286.2" cy="-93.5" rx="5.4" ry="5.4"/>
</g>
<!-- m6&#45;&gt;m7 -->
<g id="edge6" class="edge">
<title>m6&#45;&gt;m7</title>
<path fill="none" stroke="#ffffff" d="M245.1386,-93.5C252.445,-93.5 265.2437,-93.5 274.6149,-93.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="274.7054,-95.6001 280.7053,-93.5 274.7053,-91.4001 274.7054,-95.6001"/>
</g>
<!-- m8 -->
<g id="node8" class="node">
<title>m8</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-93.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;m8 -->
<g id="edge7" class="edge">
<title>m7&#45;&gt;m8</title>
<path fill="none" stroke="#ffffff" d="M291.9386,-93.5C299.245,-93.5 312.0437,-93.5 321.4149,-93.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="321.5054,-95.6001 327.5053,-93.5 321.5053,-91.4001 321.5054,-95.6001"/>
</g>
<!-- f1 -->
<g id="node13" class="node">
<title>f1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-20.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;f1 -->
<g id="edge16" class="edge">
<title>m7&#45;&gt;f1</title>
<path fill="none" stroke="#ffffff" d="M289.2707,-88.7103C296.805,-76.9581 316.3337,-46.4965 326.5525,-30.557"/>
<polygon fill="#ffffff" stroke="#ffffff" points="328.3863,-31.5876 329.8567,-25.4031 324.8505,-29.3208 328.3863,-31.5876"/>
</g>
<!-- m9 -->
<g id="node9" class="node">
<title>m9</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-93.5" rx="5.4" ry="5.4"/>
</g>
<!-- m8&#45;&gt;m9 -->
<g id="edge8" class="edge">
<title>m8&#45;&gt;m9</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-93.5C346.045,-93.5 358.8437,-93.5 368.2149,-93.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-95.6001 374.3053,-93.5 368.3053,-91.4001 368.3054,-95.6001"/>
</g>
<!-- m10 -->
<g id="node10" class="node">
<title>m10</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-93.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;m10 -->
<g id="edge9" class="edge">
<title>m9&#45;&gt;m10</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-93.5C392.845,-93.5 405.6437,-93.5 415.0149,-93.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-95.6001 421.1053,-93.5 415.1053,-91.4001 415.1054,-95.6001"/>
</g>
<!-- b1 -->
<g id="node16" class="node">
<title>b1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-58.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;b1 -->
<g id="edge17" class="edge">
<title>m9&#45;&gt;b1</title>
<path fill="none" stroke="#ffffff" d="M384.4585,-90.0161C392.1054,-84.2972 407.4587,-72.8151 417.3706,-65.4023"/>
<polygon fill="#ffffff" stroke="#ffffff" points="418.6867,-67.0404 422.234,-61.7652 416.1713,-63.6769 418.6867,-67.0404"/>
</g>
<!-- m11 -->
<g id="node18" class="node">
<title>m11</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="473.4" cy="-93.5" rx="5.4" ry="5.4"/>
</g>
<!-- m10&#45;&gt;m11 -->
<g id="edge18" class="edge">
<title>m10&#45;&gt;m11</title>
<path fill="none" stroke="#00ff00" d="M432.3386,-93.5C439.645,-93.5 452.4437,-93.5 461.8149,-93.5"/>
<polygon fill="#00ff00" stroke="#00ff00" points="461.9054,-95.6001 467.9053,-93.5 461.9053,-91.4001 461.9054,-95.6001"/>
</g>
<!-- r2 -->
<g id="node12" class="node">
<title>r2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-64.5" rx="5.4" ry="5.4"/>
</g>
<!-- r1&#45;&gt;r2 -->
<g id="edge11" class="edge">
<title>r1&#45;&gt;r2</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-64.5C112.045,-64.5 124.8437,-64.5 134.2149,-64.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-66.6001 140.3053,-64.5 134.3053,-62.4001 134.3054,-66.6001"/>
</g>
<!-- r2&#45;&gt;m5 -->
<g id="edge12" class="edge">
<title>r2&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M150.4585,-67.3867C157.9573,-72.0334 172.8669,-81.2722 182.7887,-87.4203"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.754,-89.2497 187.9604,-90.625 183.9663,-85.6795 181.754,-89.2497"/>
</g>
<!-- f2 -->
<g id="node14" class="node">
<title>f2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-20.5" rx="5.4" ry="5.4"/>
</g>
<!-- f1&#45;&gt;f2 -->
<g id="edge13" class="edge">
<title>f1&#45;&gt;f2</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-20.5C346.045,-20.5 358.8437,-20.5 368.2149,-20.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-22.6001 374.3053,-20.5 368.3053,-18.4001 368.3054,-22.6001"/>
</g>
<!-- f3 -->
<g id="node15" class="node">
<title>f3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-20.5" rx="5.4" ry="5.4"/>
</g>
<!-- f2&#45;&gt;f3 -->
<g id="edge14" class="edge">
<title>f2&#45;&gt;f3</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-20.5C392.845,-20.5 405.6437,-20.5 415.0149,-20.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-22.6001 421.1053,-20.5 415.1053,-18.4001 415.1054,-22.6001"/>
</g>
<!-- feature -->
<g id="node21" class="node">
<title>feature</title>
<polygon fill="none" stroke="#ffffff" points="588.8,-23 514.8,-23 514.8,0 588.8,0 588.8,-23"/>
<text text-anchor="middle" x="551.8" y="-7.8" font-family="monospace" font-size="14.00" fill="#ffffff">feature</text>
</g>
<!-- f3&#45;&gt;feature -->
<g id="edge21" class="edge">
<title>f3&#45;&gt;feature</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M432.3049,-20.0899C446.6562,-19.0583 485.2149,-16.2865 514.6859,-14.1679"/>
</g>
<!-- b2 -->
<g id="node17" class="node">
<title>b2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="473.4" cy="-58.5" rx="5.4" ry="5.4"/>
</g>
<!-- b1&#45;&gt;b2 -->
<g id="edge15" class="edge">
<title>b1&#45;&gt;b2</title>
<path fill="none" stroke="#ffffff" d="M432.3386,-58.5C439.645,-58.5 452.4437,-58.5 461.8149,-58.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="461.9054,-60.6001 467.9053,-58.5 461.9053,-56.4001 461.9054,-60.6001"/>
</g>
<!-- bugfix -->
<g id="node22" class="node">
<title>bugfix</title>
<polygon fill="none" stroke="#ffffff" points="584.8,-64 518.8,-64 518.8,-41 584.8,-41 584.8,-64"/>
<text text-anchor="middle" x="551.8" y="-48.8" font-family="monospace" font-size="14.00" fill="#ffffff">bugfix</text>
</g>
<!-- b2&#45;&gt;bugfix -->
<g id="edge22" class="edge">
<title>b2&#45;&gt;bugfix</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M478.7887,-58.0876C487.0224,-57.4575 503.3776,-56.2058 518.5247,-55.0466"/>
</g>
<!-- HEAD -->
<g id="node19" class="node">
<title>HEAD</title>
<polygon fill="none" stroke="#ffffff" stroke-dasharray="5,2" points="576.8,-146 526.8,-146 526.8,-123 576.8,-123 576.8,-146"/>
<text text-anchor="middle" x="551.8" y="-130.8" font-family="monospace" font-size="14.00" fill="#ffffff">HEAD</text>
</g>
<!-- m11&#45;&gt;HEAD -->
<g id="edge19" class="edge">
<title>m11&#45;&gt;HEAD</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M478.544,-96.1901C488.7639,-101.5347 512.1578,-113.7687 529.7787,-122.9838"/>
</g>
<!-- master -->
<g id="node20" class="node">
<title>master</title>
<polygon fill="none" stroke="#ffffff" points="584.8,-105 518.8,-105 518.8,-82 584.8,-82 584.8,-105"/>
<text text-anchor="middle" x="551.8" y="-89.8" font-family="monospace" font-size="14.00" fill="#ffffff">master</text>
</g>
<!-- m11&#45;&gt;master -->
<g id="edge20" class="edge">
<title>m11&#45;&gt;master</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M479.0383,-93.5C487.3946,-93.5 503.7044,-93.5 518.7679,-93.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -0,0 +1,30 @@
digraph repo_labels {
rankdir = "LR";
bgcolor = "transparent";
node[width=0.15, height=0.15, shape=point, color=white, fontcolor=white];
edge[weight=2, arrowhead=normal, arrowsize=0.6, color=white];
define(`digraph', `subgraph')
include(`master.dot')
include(`merged.dot')
include(`bugfix.dot')
m9 -> b1;
node[color=green];
edge[color=green];
include(`feature.dot')
m10 -> f1;
node[shape=box, color=white, fontname="monospace"];
edge[color=white];
subgraph labels {
rank = "max";
HEAD [style=dashed];
master;
feature;
bugfix;
}
edge[arrowhead=none, style=dashed];
f3 -> HEAD;
f3 -> master;
f3 -> feature;
b2 -> bugfix;
}

View file

@ -0,0 +1,243 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: repo_labels Pages: 1 -->
<svg width="690pt" height="154pt"
viewBox="0.00 0.00 690.40 154.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 150)">
<title>repo_labels</title>
<!-- m1 -->
<g id="node1" class="node">
<title>m1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="5.4" cy="-69.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2 -->
<g id="node2" class="node">
<title>m2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="52.2" cy="-69.5" rx="5.4" ry="5.4"/>
</g>
<!-- m1&#45;&gt;m2 -->
<g id="edge1" class="edge">
<title>m1&#45;&gt;m2</title>
<path fill="none" stroke="#ffffff" d="M11.1386,-69.5C18.445,-69.5 31.2437,-69.5 40.6149,-69.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="40.7054,-71.6001 46.7053,-69.5 40.7053,-67.4001 40.7054,-71.6001"/>
</g>
<!-- m3 -->
<g id="node3" class="node">
<title>m3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-69.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;m3 -->
<g id="edge2" class="edge">
<title>m2&#45;&gt;m3</title>
<path fill="none" stroke="#ffffff" d="M57.9386,-69.5C65.245,-69.5 78.0437,-69.5 87.4149,-69.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="87.5054,-71.6001 93.5053,-69.5 87.5053,-67.4001 87.5054,-71.6001"/>
</g>
<!-- r1 -->
<g id="node11" class="node">
<title>r1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-40.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;r1 -->
<g id="edge10" class="edge">
<title>m2&#45;&gt;r1</title>
<path fill="none" stroke="#ffffff" d="M56.8585,-66.6133C64.3573,-61.9666 79.2669,-52.7278 89.1887,-46.5797"/>
<polygon fill="#ffffff" stroke="#ffffff" points="90.3663,-48.3205 94.3604,-43.375 88.154,-44.7503 90.3663,-48.3205"/>
</g>
<!-- m4 -->
<g id="node4" class="node">
<title>m4</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-69.5" rx="5.4" ry="5.4"/>
</g>
<!-- m3&#45;&gt;m4 -->
<g id="edge3" class="edge">
<title>m3&#45;&gt;m4</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-69.5C112.045,-69.5 124.8437,-69.5 134.2149,-69.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-71.6001 140.3053,-69.5 134.3053,-67.4001 134.3054,-71.6001"/>
</g>
<!-- m5 -->
<g id="node5" class="node">
<title>m5</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="192.6" cy="-69.5" rx="5.4" ry="5.4"/>
</g>
<!-- m4&#45;&gt;m5 -->
<g id="edge4" class="edge">
<title>m4&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M151.5386,-69.5C158.845,-69.5 171.6437,-69.5 181.0149,-69.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.1054,-71.6001 187.1053,-69.5 181.1053,-67.4001 181.1054,-71.6001"/>
</g>
<!-- m6 -->
<g id="node6" class="node">
<title>m6</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="239.4" cy="-69.5" rx="5.4" ry="5.4"/>
</g>
<!-- m5&#45;&gt;m6 -->
<g id="edge5" class="edge">
<title>m5&#45;&gt;m6</title>
<path fill="none" stroke="#ffffff" d="M198.3386,-69.5C205.645,-69.5 218.4437,-69.5 227.8149,-69.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="227.9054,-71.6001 233.9053,-69.5 227.9053,-67.4001 227.9054,-71.6001"/>
</g>
<!-- m7 -->
<g id="node7" class="node">
<title>m7</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="286.2" cy="-69.5" rx="5.4" ry="5.4"/>
</g>
<!-- m6&#45;&gt;m7 -->
<g id="edge6" class="edge">
<title>m6&#45;&gt;m7</title>
<path fill="none" stroke="#ffffff" d="M245.1386,-69.5C252.445,-69.5 265.2437,-69.5 274.6149,-69.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="274.7054,-71.6001 280.7053,-69.5 274.7053,-67.4001 274.7054,-71.6001"/>
</g>
<!-- m8 -->
<g id="node8" class="node">
<title>m8</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-69.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;m8 -->
<g id="edge7" class="edge">
<title>m7&#45;&gt;m8</title>
<path fill="none" stroke="#ffffff" d="M291.9386,-69.5C299.245,-69.5 312.0437,-69.5 321.4149,-69.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="321.5054,-71.6001 327.5053,-69.5 321.5053,-67.4001 321.5054,-71.6001"/>
</g>
<!-- m9 -->
<g id="node9" class="node">
<title>m9</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-69.5" rx="5.4" ry="5.4"/>
</g>
<!-- m8&#45;&gt;m9 -->
<g id="edge8" class="edge">
<title>m8&#45;&gt;m9</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-69.5C346.045,-69.5 358.8437,-69.5 368.2149,-69.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-71.6001 374.3053,-69.5 368.3053,-67.4001 368.3054,-71.6001"/>
</g>
<!-- m10 -->
<g id="node10" class="node">
<title>m10</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-69.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;m10 -->
<g id="edge9" class="edge">
<title>m9&#45;&gt;m10</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-69.5C392.845,-69.5 405.6437,-69.5 415.0149,-69.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-71.6001 421.1053,-69.5 415.1053,-67.4001 415.1054,-71.6001"/>
</g>
<!-- b1 -->
<g id="node13" class="node">
<title>b1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-37.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;b1 -->
<g id="edge14" class="edge">
<title>m9&#45;&gt;b1</title>
<path fill="none" stroke="#ffffff" d="M384.4585,-66.3147C391.9573,-61.1873 406.8669,-50.9928 416.7887,-44.2086"/>
<polygon fill="#ffffff" stroke="#ffffff" points="418.1928,-45.7925 421.9604,-40.6724 415.8222,-42.3255 418.1928,-45.7925"/>
</g>
<!-- f1 -->
<g id="node15" class="node">
<title>f1</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="473.4" cy="-72.5" rx="5.4" ry="5.4"/>
</g>
<!-- m10&#45;&gt;f1 -->
<g id="edge17" class="edge">
<title>m10&#45;&gt;f1</title>
<path fill="none" stroke="#00ff00" d="M432.3386,-69.8679C439.645,-70.3362 452.4437,-71.1566 461.8149,-71.7574"/>
<polygon fill="#00ff00" stroke="#00ff00" points="461.7833,-73.8596 467.9053,-72.1478 462.052,-69.6682 461.7833,-73.8596"/>
</g>
<!-- r2 -->
<g id="node12" class="node">
<title>r2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-40.5" rx="5.4" ry="5.4"/>
</g>
<!-- r1&#45;&gt;r2 -->
<g id="edge11" class="edge">
<title>r1&#45;&gt;r2</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-40.5C112.045,-40.5 124.8437,-40.5 134.2149,-40.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-42.6001 140.3053,-40.5 134.3053,-38.4001 134.3054,-42.6001"/>
</g>
<!-- r2&#45;&gt;m5 -->
<g id="edge12" class="edge">
<title>r2&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M150.4585,-43.3867C157.9573,-48.0334 172.8669,-57.2722 182.7887,-63.4203"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.754,-65.2497 187.9604,-66.625 183.9663,-61.6795 181.754,-65.2497"/>
</g>
<!-- b2 -->
<g id="node14" class="node">
<title>b2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="473.4" cy="-37.5" rx="5.4" ry="5.4"/>
</g>
<!-- b1&#45;&gt;b2 -->
<g id="edge13" class="edge">
<title>b1&#45;&gt;b2</title>
<path fill="none" stroke="#ffffff" d="M432.3386,-37.5C439.645,-37.5 452.4437,-37.5 461.8149,-37.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="461.9054,-39.6001 467.9053,-37.5 461.9053,-35.4001 461.9054,-39.6001"/>
</g>
<!-- bugfix -->
<g id="node21" class="node">
<title>bugfix</title>
<polygon fill="none" stroke="#ffffff" points="678.4,-23 612.4,-23 612.4,0 678.4,0 678.4,-23"/>
<text text-anchor="middle" x="645.4" y="-7.8" font-family="monospace" font-size="14.00" fill="#ffffff">bugfix</text>
</g>
<!-- b2&#45;&gt;bugfix -->
<g id="edge21" class="edge">
<title>b2&#45;&gt;bugfix</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M479.1227,-36.6349C499.5244,-33.551 569.7346,-22.9378 612.122,-16.5304"/>
</g>
<!-- f2 -->
<g id="node16" class="node">
<title>f2</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="520.2" cy="-72.5" rx="5.4" ry="5.4"/>
</g>
<!-- f1&#45;&gt;f2 -->
<g id="edge15" class="edge">
<title>f1&#45;&gt;f2</title>
<path fill="none" stroke="#00ff00" d="M479.1386,-72.5C486.445,-72.5 499.2437,-72.5 508.6149,-72.5"/>
<polygon fill="#00ff00" stroke="#00ff00" points="508.7054,-74.6001 514.7053,-72.5 508.7053,-70.4001 508.7054,-74.6001"/>
</g>
<!-- f3 -->
<g id="node17" class="node">
<title>f3</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="567" cy="-72.5" rx="5.4" ry="5.4"/>
</g>
<!-- f2&#45;&gt;f3 -->
<g id="edge16" class="edge">
<title>f2&#45;&gt;f3</title>
<path fill="none" stroke="#00ff00" d="M525.9386,-72.5C533.245,-72.5 546.0437,-72.5 555.4149,-72.5"/>
<polygon fill="#00ff00" stroke="#00ff00" points="555.5054,-74.6001 561.5053,-72.5 555.5053,-70.4001 555.5054,-74.6001"/>
</g>
<!-- HEAD -->
<g id="node18" class="node">
<title>HEAD</title>
<polygon fill="none" stroke="#ffffff" stroke-dasharray="5,2" points="670.4,-146 620.4,-146 620.4,-123 670.4,-123 670.4,-146"/>
<text text-anchor="middle" x="645.4" y="-130.8" font-family="monospace" font-size="14.00" fill="#ffffff">HEAD</text>
</g>
<!-- f3&#45;&gt;HEAD -->
<g id="edge18" class="edge">
<title>f3&#45;&gt;HEAD</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M570.5213,-76.8493C577.2526,-84.9731 592.6803,-102.6962 608.4,-114.5 612.3706,-117.4815 616.8424,-120.2902 621.269,-122.8075"/>
</g>
<!-- master -->
<g id="node19" class="node">
<title>master</title>
<polygon fill="none" stroke="#ffffff" points="678.4,-105 612.4,-105 612.4,-82 678.4,-82 678.4,-105"/>
<text text-anchor="middle" x="645.4" y="-89.8" font-family="monospace" font-size="14.00" fill="#ffffff">master</text>
</g>
<!-- f3&#45;&gt;master -->
<g id="edge19" class="edge">
<title>f3&#45;&gt;master</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M572.3887,-73.9434C580.6224,-76.1489 596.9776,-80.5297 612.1247,-84.587"/>
</g>
<!-- feature -->
<g id="node20" class="node">
<title>feature</title>
<polygon fill="none" stroke="#ffffff" points="682.4,-64 608.4,-64 608.4,-41 682.4,-41 682.4,-64"/>
<text text-anchor="middle" x="645.4" y="-48.8" font-family="monospace" font-size="14.00" fill="#ffffff">feature</text>
</g>
<!-- f3&#45;&gt;feature -->
<g id="edge20" class="edge">
<title>f3&#45;&gt;feature</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M572.3887,-71.1253C579.9305,-69.2014 594.2862,-65.5392 608.286,-61.9678"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,36 @@
digraph repo_labels {
rankdir = "LR";
bgcolor = "transparent";
node[width=0.15, height=0.15, shape=point, color=white, fontcolor=white];
edge[weight=2, arrowhead=normal, arrowsize=0.6, color=white];
define(`digraph', `subgraph')
include(`master.dot')
include(`merged.dot')
include(`bugfix.dot')
m9 -> b1;
node[group=featurebefore, color=red];
edge[color=red];
fb1 -> fb2 -> fb3;
m7 -> fb1;
node[group=feature, color=green];
edge[color=green];
f1 -> f2 -> f3;
m10 -> f1;
node[shape=box, color=white, fontname="monospace"];
edge[color=white];
subgraph labels {
rank = "max";
HEAD [style=dashed];
master;
feature;
bugfix;
}
edge[arrowhead=none, style=dashed];
f3 -> HEAD;
m10 -> master;
f3 -> feature;
b2 -> bugfix;
}

View file

@ -0,0 +1,276 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: repo_labels Pages: 1 -->
<svg width="690pt" height="169pt"
viewBox="0.00 0.00 690.40 168.90" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 164.9)">
<title>repo_labels</title>
<!-- m1 -->
<g id="node1" class="node">
<title>m1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="5.4" cy="-65.4" rx="5.4" ry="5.4"/>
</g>
<!-- m2 -->
<g id="node2" class="node">
<title>m2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="52.2" cy="-65.4" rx="5.4" ry="5.4"/>
</g>
<!-- m1&#45;&gt;m2 -->
<g id="edge1" class="edge">
<title>m1&#45;&gt;m2</title>
<path fill="none" stroke="#ffffff" d="M11.1386,-65.4C18.445,-65.4 31.2437,-65.4 40.6149,-65.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="40.7054,-67.5001 46.7053,-65.4 40.7053,-63.3001 40.7054,-67.5001"/>
</g>
<!-- m3 -->
<g id="node3" class="node">
<title>m3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-65.4" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;m3 -->
<g id="edge2" class="edge">
<title>m2&#45;&gt;m3</title>
<path fill="none" stroke="#ffffff" d="M57.9386,-65.4C65.245,-65.4 78.0437,-65.4 87.4149,-65.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="87.5054,-67.5001 93.5053,-65.4 87.5053,-63.3001 87.5054,-67.5001"/>
</g>
<!-- r1 -->
<g id="node11" class="node">
<title>r1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-36.4" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;r1 -->
<g id="edge10" class="edge">
<title>m2&#45;&gt;r1</title>
<path fill="none" stroke="#ffffff" d="M56.8585,-62.5133C64.3573,-57.8666 79.2669,-48.6278 89.1887,-42.4797"/>
<polygon fill="#ffffff" stroke="#ffffff" points="90.3663,-44.2205 94.3604,-39.275 88.154,-40.6503 90.3663,-44.2205"/>
</g>
<!-- m4 -->
<g id="node4" class="node">
<title>m4</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-65.4" rx="5.4" ry="5.4"/>
</g>
<!-- m3&#45;&gt;m4 -->
<g id="edge3" class="edge">
<title>m3&#45;&gt;m4</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-65.4C112.045,-65.4 124.8437,-65.4 134.2149,-65.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-67.5001 140.3053,-65.4 134.3053,-63.3001 134.3054,-67.5001"/>
</g>
<!-- m5 -->
<g id="node5" class="node">
<title>m5</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="192.6" cy="-65.4" rx="5.4" ry="5.4"/>
</g>
<!-- m4&#45;&gt;m5 -->
<g id="edge4" class="edge">
<title>m4&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M151.5386,-65.4C158.845,-65.4 171.6437,-65.4 181.0149,-65.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.1054,-67.5001 187.1053,-65.4 181.1053,-63.3001 181.1054,-67.5001"/>
</g>
<!-- m6 -->
<g id="node6" class="node">
<title>m6</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="239.4" cy="-65.4" rx="5.4" ry="5.4"/>
</g>
<!-- m5&#45;&gt;m6 -->
<g id="edge5" class="edge">
<title>m5&#45;&gt;m6</title>
<path fill="none" stroke="#ffffff" d="M198.3386,-65.4C205.645,-65.4 218.4437,-65.4 227.8149,-65.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="227.9054,-67.5001 233.9053,-65.4 227.9053,-63.3001 227.9054,-67.5001"/>
</g>
<!-- m7 -->
<g id="node7" class="node">
<title>m7</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="286.2" cy="-65.4" rx="5.4" ry="5.4"/>
</g>
<!-- m6&#45;&gt;m7 -->
<g id="edge6" class="edge">
<title>m6&#45;&gt;m7</title>
<path fill="none" stroke="#ffffff" d="M245.1386,-65.4C252.445,-65.4 265.2437,-65.4 274.6149,-65.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="274.7054,-67.5001 280.7053,-65.4 274.7053,-63.3001 274.7054,-67.5001"/>
</g>
<!-- m8 -->
<g id="node8" class="node">
<title>m8</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-65.4" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;m8 -->
<g id="edge7" class="edge">
<title>m7&#45;&gt;m8</title>
<path fill="none" stroke="#ffffff" d="M291.9386,-65.4C299.245,-65.4 312.0437,-65.4 321.4149,-65.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="321.5054,-67.5001 327.5053,-65.4 321.5053,-63.3001 321.5054,-67.5001"/>
</g>
<!-- fb1 -->
<g id="node15" class="node">
<title>fb1</title>
<ellipse fill="#ff0000" stroke="#ff0000" cx="333" cy="-5.4" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;fb1 -->
<g id="edge17" class="edge">
<title>m7&#45;&gt;fb1</title>
<path fill="none" stroke="#ff0000" d="M289.5657,-61.0849C297.1213,-51.3983 315.57,-27.7461 325.8264,-14.5969"/>
<polygon fill="#ff0000" stroke="#ff0000" points="327.6304,-15.6986 329.6648,-9.676 324.3187,-13.1154 327.6304,-15.6986"/>
</g>
<!-- m9 -->
<g id="node9" class="node">
<title>m9</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-65.4" rx="5.4" ry="5.4"/>
</g>
<!-- m8&#45;&gt;m9 -->
<g id="edge8" class="edge">
<title>m8&#45;&gt;m9</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-65.4C346.045,-65.4 358.8437,-65.4 368.2149,-65.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-67.5001 374.3053,-65.4 368.3053,-63.3001 368.3054,-67.5001"/>
</g>
<!-- m10 -->
<g id="node10" class="node">
<title>m10</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-65.4" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;m10 -->
<g id="edge9" class="edge">
<title>m9&#45;&gt;m10</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-65.4C392.845,-65.4 405.6437,-65.4 415.0149,-65.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-67.5001 421.1053,-65.4 415.1053,-63.3001 415.1054,-67.5001"/>
</g>
<!-- b1 -->
<g id="node13" class="node">
<title>b1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-34.4" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;b1 -->
<g id="edge14" class="edge">
<title>m9&#45;&gt;b1</title>
<path fill="none" stroke="#ffffff" d="M384.4585,-62.3143C391.9573,-57.3471 406.8669,-47.4711 416.7887,-40.899"/>
<polygon fill="#ffffff" stroke="#ffffff" points="418.1179,-42.5374 421.9604,-37.4733 415.7985,-39.0359 418.1179,-42.5374"/>
</g>
<!-- f1 -->
<g id="node18" class="node">
<title>f1</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="473.4" cy="-108.4" rx="5.4" ry="5.4"/>
</g>
<!-- m10&#45;&gt;f1 -->
<g id="edge20" class="edge">
<title>m10&#45;&gt;f1</title>
<path fill="none" stroke="#00ff00" d="M430.5901,-69.0662C438.1195,-75.9842 454.5783,-91.1065 464.7528,-100.4549"/>
<polygon fill="#00ff00" stroke="#00ff00" points="463.5809,-102.23 469.42,-104.7431 466.4225,-99.1372 463.5809,-102.23"/>
</g>
<!-- master -->
<g id="node22" class="node">
<title>master</title>
<polygon fill="none" stroke="#ffffff" points="678.4,-78.9 612.4,-78.9 612.4,-55.9 678.4,-55.9 678.4,-78.9"/>
<text text-anchor="middle" x="645.4" y="-63.7" font-family="monospace" font-size="14.00" fill="#ffffff">master</text>
</g>
<!-- m10&#45;&gt;master -->
<g id="edge22" class="edge">
<title>m10&#45;&gt;master</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M432.0086,-65.4494C456.5547,-65.6738 558.5907,-66.6065 612.1839,-67.0964"/>
</g>
<!-- r2 -->
<g id="node12" class="node">
<title>r2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-36.4" rx="5.4" ry="5.4"/>
</g>
<!-- r1&#45;&gt;r2 -->
<g id="edge11" class="edge">
<title>r1&#45;&gt;r2</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-36.4C112.045,-36.4 124.8437,-36.4 134.2149,-36.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-38.5001 140.3053,-36.4 134.3053,-34.3001 134.3054,-38.5001"/>
</g>
<!-- r2&#45;&gt;m5 -->
<g id="edge12" class="edge">
<title>r2&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M150.4585,-39.2867C157.9573,-43.9334 172.8669,-53.1722 182.7887,-59.3203"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.754,-61.1497 187.9604,-62.525 183.9663,-57.5795 181.754,-61.1497"/>
</g>
<!-- b2 -->
<g id="node14" class="node">
<title>b2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="473.4" cy="-34.4" rx="5.4" ry="5.4"/>
</g>
<!-- b1&#45;&gt;b2 -->
<g id="edge13" class="edge">
<title>b1&#45;&gt;b2</title>
<path fill="none" stroke="#ffffff" d="M432.3386,-34.4C439.645,-34.4 452.4437,-34.4 461.8149,-34.4"/>
<polygon fill="#ffffff" stroke="#ffffff" points="461.9054,-36.5001 467.9053,-34.4 461.9053,-32.3001 461.9054,-36.5001"/>
</g>
<!-- bugfix -->
<g id="node24" class="node">
<title>bugfix</title>
<polygon fill="none" stroke="#ffffff" points="678.4,-37.9 612.4,-37.9 612.4,-14.9 678.4,-14.9 678.4,-37.9"/>
<text text-anchor="middle" x="645.4" y="-22.7" font-family="monospace" font-size="14.00" fill="#ffffff">bugfix</text>
</g>
<!-- b2&#45;&gt;bugfix -->
<g id="edge24" class="edge">
<title>b2&#45;&gt;bugfix</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M479.1227,-34.1338C499.5244,-33.1849 569.7346,-29.9193 612.122,-27.9478"/>
</g>
<!-- fb2 -->
<g id="node16" class="node">
<title>fb2</title>
<ellipse fill="#ff0000" stroke="#ff0000" cx="379.8" cy="-5.4" rx="5.4" ry="5.4"/>
</g>
<!-- fb1&#45;&gt;fb2 -->
<g id="edge15" class="edge">
<title>fb1&#45;&gt;fb2</title>
<path fill="none" stroke="#ff0000" d="M338.7386,-5.4C346.045,-5.4 358.8437,-5.4 368.2149,-5.4"/>
<polygon fill="#ff0000" stroke="#ff0000" points="368.3054,-7.5001 374.3053,-5.4 368.3053,-3.3001 368.3054,-7.5001"/>
</g>
<!-- fb3 -->
<g id="node17" class="node">
<title>fb3</title>
<ellipse fill="#ff0000" stroke="#ff0000" cx="426.6" cy="-5.4" rx="5.4" ry="5.4"/>
</g>
<!-- fb2&#45;&gt;fb3 -->
<g id="edge16" class="edge">
<title>fb2&#45;&gt;fb3</title>
<path fill="none" stroke="#ff0000" d="M385.5386,-5.4C392.845,-5.4 405.6437,-5.4 415.0149,-5.4"/>
<polygon fill="#ff0000" stroke="#ff0000" points="415.1054,-7.5001 421.1053,-5.4 415.1053,-3.3001 415.1054,-7.5001"/>
</g>
<!-- f2 -->
<g id="node19" class="node">
<title>f2</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="520.2" cy="-108.4" rx="5.4" ry="5.4"/>
</g>
<!-- f1&#45;&gt;f2 -->
<g id="edge18" class="edge">
<title>f1&#45;&gt;f2</title>
<path fill="none" stroke="#00ff00" d="M479.1386,-108.4C486.445,-108.4 499.2437,-108.4 508.6149,-108.4"/>
<polygon fill="#00ff00" stroke="#00ff00" points="508.7054,-110.5001 514.7053,-108.4 508.7053,-106.3001 508.7054,-110.5001"/>
</g>
<!-- f3 -->
<g id="node20" class="node">
<title>f3</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="567" cy="-108.4" rx="5.4" ry="5.4"/>
</g>
<!-- f2&#45;&gt;f3 -->
<g id="edge19" class="edge">
<title>f2&#45;&gt;f3</title>
<path fill="none" stroke="#00ff00" d="M525.9386,-108.4C533.245,-108.4 546.0437,-108.4 555.4149,-108.4"/>
<polygon fill="#00ff00" stroke="#00ff00" points="555.5054,-110.5001 561.5053,-108.4 555.5053,-106.3001 555.5054,-110.5001"/>
</g>
<!-- HEAD -->
<g id="node21" class="node">
<title>HEAD</title>
<polygon fill="none" stroke="#ffffff" stroke-dasharray="5,2" points="670.4,-160.9 620.4,-160.9 620.4,-137.9 670.4,-137.9 670.4,-160.9"/>
<text text-anchor="middle" x="645.4" y="-145.7" font-family="monospace" font-size="14.00" fill="#ffffff">HEAD</text>
</g>
<!-- f3&#45;&gt;HEAD -->
<g id="edge21" class="edge">
<title>f3&#45;&gt;HEAD</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M572.144,-111.0901C582.3639,-116.4347 605.7578,-128.6687 623.3787,-137.8838"/>
</g>
<!-- feature -->
<g id="node23" class="node">
<title>feature</title>
<polygon fill="none" stroke="#ffffff" points="682.4,-119.9 608.4,-119.9 608.4,-96.9 682.4,-96.9 682.4,-119.9"/>
<text text-anchor="middle" x="645.4" y="-104.7" font-family="monospace" font-size="14.00" fill="#ffffff">feature</text>
</g>
<!-- f3&#45;&gt;feature -->
<g id="edge23" class="edge">
<title>f3&#45;&gt;feature</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M572.6383,-108.4C580.2221,-108.4 594.3571,-108.4 608.166,-108.4"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,30 @@
digraph repo_labels {
rankdir = "LR";
bgcolor = "transparent";
node[width=0.15, height=0.15, shape=point, color=white, fontcolor=white];
edge[weight=2, arrowhead=normal, arrowsize=0.6, color=white];
define(`digraph', `subgraph')
include(`master.dot')
include(`merged.dot')
include(`bugfix.dot')
m9 -> b1;
node[group=feature, color=green];
edge[color=green];
m10 -> f3;
node[shape=box, color=white, fontname="monospace"];
edge[color=white];
subgraph labels {
rank = "max";
HEAD [style=dashed];
master;
feature;
bugfix;
}
edge[arrowhead=none, style=dashed];
f3 -> HEAD;
m10 -> master;
f3 -> feature;
b2 -> bugfix;
}

View file

@ -0,0 +1,221 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.40.1 (20161225.0304)
-->
<!-- Title: repo_labels Pages: 1 -->
<svg width="597pt" height="154pt"
viewBox="0.00 0.00 596.80 154.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 150)">
<title>repo_labels</title>
<!-- m1 -->
<g id="node1" class="node">
<title>m1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="5.4" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2 -->
<g id="node2" class="node">
<title>m2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="52.2" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- m1&#45;&gt;m2 -->
<g id="edge1" class="edge">
<title>m1&#45;&gt;m2</title>
<path fill="none" stroke="#ffffff" d="M11.1386,-52.5C18.445,-52.5 31.2437,-52.5 40.6149,-52.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="40.7054,-54.6001 46.7053,-52.5 40.7053,-50.4001 40.7054,-54.6001"/>
</g>
<!-- m3 -->
<g id="node3" class="node">
<title>m3</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;m3 -->
<g id="edge2" class="edge">
<title>m2&#45;&gt;m3</title>
<path fill="none" stroke="#ffffff" d="M57.9386,-52.5C65.245,-52.5 78.0437,-52.5 87.4149,-52.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="87.5054,-54.6001 93.5053,-52.5 87.5053,-50.4001 87.5054,-54.6001"/>
</g>
<!-- r1 -->
<g id="node11" class="node">
<title>r1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="99" cy="-23.5" rx="5.4" ry="5.4"/>
</g>
<!-- m2&#45;&gt;r1 -->
<g id="edge10" class="edge">
<title>m2&#45;&gt;r1</title>
<path fill="none" stroke="#ffffff" d="M56.8585,-49.6133C64.3573,-44.9666 79.2669,-35.7278 89.1887,-29.5797"/>
<polygon fill="#ffffff" stroke="#ffffff" points="90.3663,-31.3205 94.3604,-26.375 88.154,-27.7503 90.3663,-31.3205"/>
</g>
<!-- m4 -->
<g id="node4" class="node">
<title>m4</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- m3&#45;&gt;m4 -->
<g id="edge3" class="edge">
<title>m3&#45;&gt;m4</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-52.5C112.045,-52.5 124.8437,-52.5 134.2149,-52.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-54.6001 140.3053,-52.5 134.3053,-50.4001 134.3054,-54.6001"/>
</g>
<!-- m5 -->
<g id="node5" class="node">
<title>m5</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="192.6" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- m4&#45;&gt;m5 -->
<g id="edge4" class="edge">
<title>m4&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M151.5386,-52.5C158.845,-52.5 171.6437,-52.5 181.0149,-52.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.1054,-54.6001 187.1053,-52.5 181.1053,-50.4001 181.1054,-54.6001"/>
</g>
<!-- m6 -->
<g id="node6" class="node">
<title>m6</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="239.4" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- m5&#45;&gt;m6 -->
<g id="edge5" class="edge">
<title>m5&#45;&gt;m6</title>
<path fill="none" stroke="#ffffff" d="M198.3386,-52.5C205.645,-52.5 218.4437,-52.5 227.8149,-52.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="227.9054,-54.6001 233.9053,-52.5 227.9053,-50.4001 227.9054,-54.6001"/>
</g>
<!-- m7 -->
<g id="node7" class="node">
<title>m7</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="286.2" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- m6&#45;&gt;m7 -->
<g id="edge6" class="edge">
<title>m6&#45;&gt;m7</title>
<path fill="none" stroke="#ffffff" d="M245.1386,-52.5C252.445,-52.5 265.2437,-52.5 274.6149,-52.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="274.7054,-54.6001 280.7053,-52.5 274.7053,-50.4001 274.7054,-54.6001"/>
</g>
<!-- m8 -->
<g id="node8" class="node">
<title>m8</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="333" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- m7&#45;&gt;m8 -->
<g id="edge7" class="edge">
<title>m7&#45;&gt;m8</title>
<path fill="none" stroke="#ffffff" d="M291.9386,-52.5C299.245,-52.5 312.0437,-52.5 321.4149,-52.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="321.5054,-54.6001 327.5053,-52.5 321.5053,-50.4001 321.5054,-54.6001"/>
</g>
<!-- m9 -->
<g id="node9" class="node">
<title>m9</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="379.8" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- m8&#45;&gt;m9 -->
<g id="edge8" class="edge">
<title>m8&#45;&gt;m9</title>
<path fill="none" stroke="#ffffff" d="M338.7386,-52.5C346.045,-52.5 358.8437,-52.5 368.2149,-52.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="368.3054,-54.6001 374.3053,-52.5 368.3053,-50.4001 368.3054,-54.6001"/>
</g>
<!-- m10 -->
<g id="node10" class="node">
<title>m10</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-52.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;m10 -->
<g id="edge9" class="edge">
<title>m9&#45;&gt;m10</title>
<path fill="none" stroke="#ffffff" d="M385.5386,-52.5C392.845,-52.5 405.6437,-52.5 415.0149,-52.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="415.1054,-54.6001 421.1053,-52.5 415.1053,-50.4001 415.1054,-54.6001"/>
</g>
<!-- b1 -->
<g id="node13" class="node">
<title>b1</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="426.6" cy="-15.5" rx="5.4" ry="5.4"/>
</g>
<!-- m9&#45;&gt;b1 -->
<g id="edge14" class="edge">
<title>m9&#45;&gt;b1</title>
<path fill="none" stroke="#ffffff" d="M384.1189,-49.0854C391.6033,-43.1683 407.1457,-30.8805 417.212,-22.9222"/>
<polygon fill="#ffffff" stroke="#ffffff" points="418.7506,-24.3827 422.155,-19.0142 416.1458,-21.088 418.7506,-24.3827"/>
</g>
<!-- f3 -->
<g id="node15" class="node">
<title>f3</title>
<ellipse fill="#00ff00" stroke="#00ff00" cx="473.4" cy="-93.5" rx="5.4" ry="5.4"/>
</g>
<!-- m10&#45;&gt;f3 -->
<g id="edge15" class="edge">
<title>m10&#45;&gt;f3</title>
<path fill="none" stroke="#00ff00" d="M430.9189,-56.2837C438.5497,-62.9687 454.5568,-76.992 464.5962,-85.7873"/>
<polygon fill="#00ff00" stroke="#00ff00" points="463.3293,-87.4693 469.2262,-89.8435 466.097,-84.3101 463.3293,-87.4693"/>
</g>
<!-- master -->
<g id="node17" class="node">
<title>master</title>
<polygon fill="none" stroke="#ffffff" points="584.8,-64 518.8,-64 518.8,-41 584.8,-41 584.8,-64"/>
<text text-anchor="middle" x="551.8" y="-48.8" font-family="monospace" font-size="14.00" fill="#ffffff">master</text>
</g>
<!-- m10&#45;&gt;master -->
<g id="edge17" class="edge">
<title>m10&#45;&gt;master</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M432.3049,-52.5C447.3259,-52.5 488.8665,-52.5 518.7491,-52.5"/>
</g>
<!-- r2 -->
<g id="node12" class="node">
<title>r2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="145.8" cy="-23.5" rx="5.4" ry="5.4"/>
</g>
<!-- r1&#45;&gt;r2 -->
<g id="edge11" class="edge">
<title>r1&#45;&gt;r2</title>
<path fill="none" stroke="#ffffff" d="M104.7386,-23.5C112.045,-23.5 124.8437,-23.5 134.2149,-23.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="134.3054,-25.6001 140.3053,-23.5 134.3053,-21.4001 134.3054,-25.6001"/>
</g>
<!-- r2&#45;&gt;m5 -->
<g id="edge12" class="edge">
<title>r2&#45;&gt;m5</title>
<path fill="none" stroke="#ffffff" d="M150.4585,-26.3867C157.9573,-31.0334 172.8669,-40.2722 182.7887,-46.4203"/>
<polygon fill="#ffffff" stroke="#ffffff" points="181.754,-48.2497 187.9604,-49.625 183.9663,-44.6795 181.754,-48.2497"/>
</g>
<!-- b2 -->
<g id="node14" class="node">
<title>b2</title>
<ellipse fill="#ffffff" stroke="#ffffff" cx="473.4" cy="-15.5" rx="5.4" ry="5.4"/>
</g>
<!-- b1&#45;&gt;b2 -->
<g id="edge13" class="edge">
<title>b1&#45;&gt;b2</title>
<path fill="none" stroke="#ffffff" d="M432.3386,-15.5C439.645,-15.5 452.4437,-15.5 461.8149,-15.5"/>
<polygon fill="#ffffff" stroke="#ffffff" points="461.9054,-17.6001 467.9053,-15.5 461.9053,-13.4001 461.9054,-17.6001"/>
</g>
<!-- bugfix -->
<g id="node19" class="node">
<title>bugfix</title>
<polygon fill="none" stroke="#ffffff" points="584.8,-23 518.8,-23 518.8,0 584.8,0 584.8,-23"/>
<text text-anchor="middle" x="551.8" y="-7.8" font-family="monospace" font-size="14.00" fill="#ffffff">bugfix</text>
</g>
<!-- b2&#45;&gt;bugfix -->
<g id="edge19" class="edge">
<title>b2&#45;&gt;bugfix</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M479.0383,-15.2123C487.3946,-14.786 503.7044,-13.9539 518.7679,-13.1853"/>
</g>
<!-- HEAD -->
<g id="node16" class="node">
<title>HEAD</title>
<polygon fill="none" stroke="#ffffff" stroke-dasharray="5,2" points="576.8,-146 526.8,-146 526.8,-123 576.8,-123 576.8,-146"/>
<text text-anchor="middle" x="551.8" y="-130.8" font-family="monospace" font-size="14.00" fill="#ffffff">HEAD</text>
</g>
<!-- f3&#45;&gt;HEAD -->
<g id="edge16" class="edge">
<title>f3&#45;&gt;HEAD</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M478.544,-96.1901C488.7639,-101.5347 512.1578,-113.7687 529.7787,-122.9838"/>
</g>
<!-- feature -->
<g id="node18" class="node">
<title>feature</title>
<polygon fill="none" stroke="#ffffff" points="588.8,-105 514.8,-105 514.8,-82 588.8,-82 588.8,-105"/>
<text text-anchor="middle" x="551.8" y="-89.8" font-family="monospace" font-size="14.00" fill="#ffffff">feature</text>
</g>
<!-- f3&#45;&gt;feature -->
<g id="edge18" class="edge">
<title>f3&#45;&gt;feature</title>
<path fill="none" stroke="#ffffff" stroke-dasharray="5,2" d="M479.0383,-93.5C486.6221,-93.5 500.7571,-93.5 514.566,-93.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,295 @@
---
title: "From graphs to Git"
date: 2021-03-01
tags: git
toc: true
---
* Introduction
This is an introduction to Git from a graph theory point of view. In
my view, most introductions to Git focus on the actual commands or on
Git internals. In my day-to-day work, I realized that I consistently
rely on an internal model of the repository as a directed acyclic
graph. This is not something very original, many people have said the
same thing, to the point that it is a running joke (TODO: insert links
here). However, I have not seen a comprehensive introduction to Git
from this point of view.
How to actually use the command line is not the topic of this article,
you can refer to the man pages or the excellent [[https://git-scm.com/book/en/v2][/Pro Git/]] book. I will
reference the relevant Git commands as margin notes.
My target audience is basically myself a few years ago: background in
maths and computer science, but no direct experience of large-scale
codebases in Git. I also assume that we are curious about the internal
model of Git: if you only want a quick fix for your latest mistake but
don't care about understanding what's going on, this post is not for
you.
This post is also highly opinionated about what I consider important
when working on production codebases in a professional setting. Of
course, this is highly coloured by my personal experience, and your
needs may vary. If there is something essential that you think is
missing here, please don't hesitate to [[../contact.html][contact me]]!
* Concepts: understanding the graph
** Repository
The basic object in Git is the /commit/. It is constituted of three
things: a set of parent commits (at least one, except for the initial
commit), a diff representing changes (some lines are removed, some are
added), and a commit message. It also has a name[fn:hash], so that we
can refer to it if needed.
[fn:hash] Actually, each commit gets a SHA-1 hash that identifies it
uniquely. The hash is computed from the parents, the messages, and the
diff.
A /repository/ is fundamentally just a directed acyclic graph
(DAG)[fn:graph], where nodes are commits and links are parent-child
relationships. A DAG means that two essential properties are verified
at all time by the graph:
- it is /oriented/, and the direction always go from parent to child,
- it is /acyclic/, otherwise a commit could end up being an ancestor
of itself.
As you can see, these make perfect sense in the context of a
version-tracking system.
[fn:graph] {-} You can visualize the graph of a repo, or just a subset
of it, using [[https://git-scm.com/docs/git-log][=git log=]].
Here is an example of a repo:
[[file:/images/git-graphs/repo.svg]]
In this representation, each commit points to its children, and they
were organized from left to right as in a timeline. The /initial
commit/ is the first one, the root of the graph, on the far left.
Note that a commit can have multiple children, and multiple parents
(we'll come back to these specific commits later).
The entirety of Git operations can be understood in terms of
manipulations of the graph. In the following sections, we'll list the
different actions we can take to modify the graph.
** Naming things: branches and tags
Some commits can be annotated: they can have a named label attached to
them, that reference a specific commit.
For instance, =HEAD= references the current commit: your current
position in the graph[fn:checkout]. This is just a convenient name for
the current commit.[fn::Much like how =.= is a shorthand for the
current directory when you're navigating the filesystem.]
[fn:checkout] {-} Move around the graph (i.e. move the =HEAD=
pointer), using [[https://git-scm.com/docs/git-checkout][=git checkout=]]. You can give it commit hashes, branch
names, tag names, or relative positions like =HEAD~3= for the
great-grandparent of the current commit.
/Branches/ are other labels like this. Each of them has a
name and acts a simple pointer to a commit. Once again, this is simply
an alias, in order to have meaningful names when navigating the graph.
[[file:/images/git-graphs/repo_labels.svg]]
In this example, we have three branches: =master=, =feature=, and
=bugfix=[fn::Do not name your real branches like this! Find a
meaningful name describing what changes you are making.].
/Tags/[fn:branch-tag] are another kind of label, once again pointing to a particular
commit. The main difference with branches is that branches may move
(you can change the commit they point to if you want), whereas tags
are fixed forever.
[fn:branch-tag] {-} Create branches and tags with the
appropriately-named [[https://git-scm.com/docs/git-branch][=git branch=]] and [[https://git-scm.com/docs/git-tag][=git tag=]].
** Making changes: creating new commits
When you make some changes in your files, you will then record them in
the repo by committing them[fn:commit]. The action creates a new
commit, whose parent will be the current commit. For instance, in the
previous case where you were on =master=, the new repo after
committing will be (the new commit is in green):
[fn:commit] {-} To the surprise of absolutely no one, this is done
with [[https://git-scm.com/docs/git-commit][=git commit=]].
[[file:/images/git-graphs/repo_labels_commit.svg]]
Two significant things happened here:
- Your position on the graph changed: =HEAD= points to the new commit
you just created.
- More importantly: =master= moved as well. This is the main property
of branches: instead of being "dumb" labels pointing to commits,
they will automatically move when you add new commits on top of
them. (Note that this won't be the case with tags, which always
point to the same commit no matter what.)
If you can add commits, you can also remove them (if they don't have
any children, obviously). However, very often it is better to add a
commit that will /revert/[fn:revert] the changes of another commit
(i.e. apply the opposite changes). This way, you keep track of what's
been done to the repository structure, and you do not lose the
reverted changes (should you need to re-apply them in the future).
[fn:revert] {-} Create a revert commit with [[https://git-scm.com/docs/git-revert][=git revert=]], and remove a
commit with [[https://git-scm.com/docs/git-reset][=git reset=]] *(destructive!)*.
** Merging
There is a special type of commits: /merge commits/, which have more
than one parent (for example, the fifth commit from the left in the
graph above).[fn:merge:{-} As can be expected, the command is [[https://git-scm.com/docs/git-merge][=git
merge=]].]
At this point, we need to talk about /conflicts/. Until now, every
action was simple: we can move around, add names, and add some
changes. But now we are trying to reconcile two different versions
into a single one. These two versions can be incompatible, and in this
case the merge commit will have to choose which lines of each version
to keep. If however, there is no conflict, the merge commit will be
empty: it will have two parents, but will not contain any changes
itself.
** Moving commits: rebasing and squashing
Until now, all the actions we've seen were append-only. We were only
adding stuff, and it would be easy to just remove a node from the
graph, and to move the various labels accordingly, to return to the
previous state.
But sometimes, we want to do more complex manipulation of the graph:
moving a commit and all its descendants to another location in the
graph. This is called a /rebase/.[fn:rebase:{-} That you can perform
with [[https://git-scm.com/docs/git-rebase][=git rebase=]] *(destructive!)*.]
[[file:/images/git-graphs/repo_labels_rebase.svg]]
In this case, we moved the branch =feature= from its old position (in
red) to a new one on top of =master= (in green).
When I say "move the branch =feature=", I actually mean something
slightly different than before. Here, we don't just move the label
=feature=, but also the entire chain of commits starting from the one
pointed by =feature= up to the common ancestor of =feature= and its
base branch (here =master=).
In practice, what we have done is deleted three commits, and added
three brand new commits. Git actually helps us here by creating
commits with the exact same changes. Sometimes, it is not possible to
apply the same changes exactly because the original version is not the
same. For instance, if one of the commits changed a line that no
longer exist in the new base, there will be a conflict. When rebasing,
you may have to manually resolve these conflicts, similarly to a
merge.
It is often interesting to rebase before merging, because then we can
avoid merge commits entirely. Since =feature= has been rebased on top
of =master=, when merging =feature= onto =master=, we can just
/fast-forward/ =master=, in effect just moving the =master= label
where =feature= is:[fn:fastforward]
[fn:fastforward] {-} You can control whether or not =git merge= does a
fast-forward with the =--ff-only= and =--no-ff= flags.
[[file:/images/git-graphs/repo_labels_ff.svg]]
Another manipulation that we can do on the graph is /squashing/,
i.e. lumping several commits together in a single one.[fn:squash:{-}
Use [[https://git-scm.com/docs/git-squash][=git squash=]] *(destructive!)*.]
[[file:/images/git-graphs/repo_labels_squash.svg]]
Here, the three commits of the =feature= branch have been condensed
into a single one. No conflict can happen, but we lose the history of
the changes. Squashing may be useful to clean up a complex history.
Squashing and rebasing, taken together, can be extremely powerful
tools to entirely rewrite the history of a repo. With them, you can
reorder commits, squash them together, moving them elsewhere, and so
on. However, these commands are also extremely dangerous: since you
overwrite the history, there is a lot of potential for conflicts and
general mistakes. By contrast, merges are very safe: even if there are
conflicts and you have messed them up, you can always remove the merge
commit and go back to the previous state. But when you rebase a set of
commits and mess up the conflict resolution, there is no going back:
the history has been lost forever, and you generally cannot recover
the original state of the repository.
* Remotes: sharing your work with others
You can use Git as a simple version tracking system for your own
projects, on your own computer. But most of the time, Git is used to
collaborate with other people. For this reason, Git has an elaborate
system for sharing changes with others. The good news is: everything
is still represented in the graph! There is nothing fundamentally
different to understand.
When two different people work on the same project, each will have a
version of the repository locally. Let's say that Alice and Bob are
both working on our project.
Alice has made a significant improvement to the project, and has
created several commits, that are tracked in the =feature= branch she
has created locally. The graph above (after rebasing) represents
Alice's repository. Bob, meanwhile, has the same repository but
without the =feature= branch. How can they share their work? Alice can
send the commits from =feature= to the common ancestor of =master= and
=feature= to Bob. Bob will see this branch as part of a /remote/
graph, that will be superimposed on his graph: [fn:remote]
[fn:remote] {-} You can add, remove, rename, and generally manage
remotes with [[https://git-scm.com/docs/git-remote][=git remote=]]. To transfer data between you and a remote,
use [[https://git-scm.com/docs/git-fetch][=git fetch=]], [[https://git-scm.com/docs/git-pull][=git pull=]] (which fetches and merges in your local
branch automatically), and [[https://git-scm.com/docs/git-push][=git push=]].
[[file:/images/git-graphs/repo_labels_bob.svg]]
The branch name he just got from Alice is prefixed by the name of the
remote, in this case =alice=. These are just ordinary commits, and an
ordinary branch (i.e. just a label on a specific commit).
Now Bob can see Alice's work, and has some idea to improve on it. So
he wants to make a new commit on top of Alice's changes. But the
=alice/feature= branch is here to track the state of Alice's
repository, so he just creates a new branch just for him named
=feature=, where he add a commit:
[[file:/images/git-graphs/repo_labels_bob2.svg]]
Similarly, Alice can now retrieve Bob's work, and will have a new
branch =bob/feature= with the additional commit. If she wants, she can
now incorporate the new commit to her own branch =feature=, making her
branches =feature= and =bob/feature= identical:
[[file:/images/git-graphs/repo_labels_alice.svg]]
As you can see, sharing work in Git is just a matter of having
additional branches that represent the graph of other people. Some
branches are shared among different people, and in this case you will
have several branches, each prefixed with the name of the
remote. Everything is still represented simply in a single graph.
* Additional concepts
Unfortunately, some things are not captured in the graph
directly. Most notably, the [[https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository][staging area]] used for selecting changes
for committing, [[https://git-scm.com/book/en/v2/Git-Tools-Stashing-and-Cleaning][stashing]], and [[https://git-scm.com/book/en/v2/Git-Tools-Submodules][submodules]] greatly extend the
capabilities of Git beyond simple graph manipulations. You can read
about all of these in /Pro Git/.
* Internals
* References