From a75964315e3ed56d43f7af56ec8a305503d0e84f Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Tue, 4 Aug 2026 09:43:14 -0700 Subject: [PATCH 01/15] Add figure palette and JSON schema Defines the symbol vocabulary (colors, node kinds, box geometry) extracted from images/symbols.svg, and a JSON Schema for editor autocomplete and pre-render validation. Co-Authored-By: Claude Opus 5 --- figures/_palette.json | 27 +++++++ figures/_schema.json | 181 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 figures/_palette.json create mode 100644 figures/_schema.json diff --git a/figures/_palette.json b/figures/_palette.json new file mode 100644 index 0000000..ade51f7 --- /dev/null +++ b/figures/_palette.json @@ -0,0 +1,27 @@ +{ + "colors": { + "commit": "#efefe7", + "commit-text": "gray", + "tree": "#00909a", + "blob": "#cd9f00", + "ref": "#f44d27", + "jessica": "#b8e986", + "john": "#fcc161", + "josie": "#deb9ff", + "light-text": "#f0f0f0", + "line": "#8f8981", + "rule": "#979797" + }, + "kinds": { + "commit": { "shape": "pill", "w": 89, "h": 33, "rx": 16.5, "fill": "commit", "text": "commit-text" }, + "tree": { "shape": "pill", "w": 89, "h": 33, "rx": 16.5, "fill": "tree", "text": "light-text" }, + "blob": { "shape": "pill", "w": 89, "h": 33, "rx": 16.5, "fill": "blob", "text": "light-text" }, + "jessica": { "shape": "pill", "w": 89, "h": 33, "rx": 16.5, "fill": "jessica","text": "commit-text" }, + "john": { "shape": "pill", "w": 89, "h": 33, "rx": 16.5, "fill": "john", "text": "commit-text" }, + "josie": { "shape": "pill", "w": 89, "h": 33, "rx": 16.5, "fill": "josie", "text": "commit-text" }, + "ref": { "shape": "rect", "w": 89, "h": 33, "fill": "ref", "text": "light-text" }, + "symref": { "shape": "rect", "w": 86, "h": 33, "fill": "tree", "text": "light-text" }, + "goldref": { "shape": "rect", "w": 108, "h": 33, "fill": "blob", "text": "light-text" }, + "other": { "shape": "rect", "w": 89, "h": 33, "fill": "commit", "text": "commit-text", "stroke": "rule" } + } +} diff --git a/figures/_schema.json b/figures/_schema.json new file mode 100644 index 0000000..7219dc1 --- /dev/null +++ b/figures/_schema.json @@ -0,0 +1,181 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://github.com/progit/progit3/figures/_schema.json", + "title": "Pro Git figure spec", + "description": "Source format for a Pro Git diagram figure. Rendered to SVG by bin/render-figures.rb.", + "type": "object", + "required": ["title"], + "additionalProperties": false, + "properties": { + "$schema": { "type": "string" }, + "title": { + "description": "Figure title, emitted as SVG for accessibility.", + "type": "string" + }, + "layout": { + "description": "Positioning mode. 'grid' (default) places nodes by col/row on a regular grid. 'absolute' uses x/y coordinates directly.", + "type": "string", + "enum": ["grid", "absolute"], + "default": "grid" + }, + "grid": { + "description": "Grid pitch in pixels. Overrides the default 127x58.", + "type": "object", + "additionalProperties": false, + "properties": { + "x": { "type": "number", "exclusiveMinimum": 0 }, + "y": { "type": "number", "exclusiveMinimum": 0 } + } + }, + "margin": { + "description": "Canvas margin in pixels around all content. Default 4.", + "type": "number", + "default": 4 + }, + "canvas": { + "description": "Explicit canvas size. If omitted, computed from node extents + margin.", + "type": "object", + "additionalProperties": false, + "required": ["w", "h"], + "properties": { + "w": { "type": "number", "exclusiveMinimum": 0 }, + "h": { "type": "number", "exclusiveMinimum": 0 } + } + }, + "nodes": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "kind", "label"], + "additionalProperties": false, + "properties": { + "id": { "type": "string", "description": "Unique node identifier, referenced by edges." }, + "kind": { + "type": "string", + "enum": ["commit","tree","blob","jessica","john","josie","ref","symref","goldref","other"], + "description": "Symbol kind, mapped to geometry and colors in _palette.json." + }, + "label": { + "description": "Text content. String for single line; array of strings for multi-line.", + "oneOf": [ + { "type": "string" }, + { "type": "array", "items": { "type": "string" }, "minItems": 2 } + ] + }, + "col": { "type": "number", "description": "Grid column (grid layout only)." }, + "row": { "type": "number", "description": "Grid row (grid layout only)." }, + "x": { "type": "number", "description": "Absolute x coordinate of top-left corner (absolute layout or override)." }, + "y": { "type": "number", "description": "Absolute y coordinate of top-left corner (absolute layout or override)." }, + "dx": { "type": "number", "description": "Horizontal nudge added to grid-computed x." }, + "dy": { "type": "number", "description": "Vertical nudge added to grid-computed y." }, + "w": { "type": "number", "description": "Width override (uses kind default if omitted)." }, + "h": { "type": "number", "description": "Height override (uses kind default if omitted)." }, + "fill": { "type": "string", "description": "Fill color override (named key from palette colors, or hex)." }, + "text": { "type": "string", "description": "Text color override (named key or hex)." }, + "stroke":{ "type": "string", "description": "Stroke color override (named key or hex)." } + } + } + }, + "edges": { + "type": "array", + "items": { + "type": "object", + "required": ["from", "to"], + "additionalProperties": false, + "properties": { + "from": { "type": "string", "description": "Source node id." }, + "to": { "type": "string", "description": "Target node id." }, + "route": { + "type": "string", + "enum": ["straight", "diagonal", "elbow"], + "default": "straight", + "description": "Arrow routing. 'straight' is horizontal or vertical. 'diagonal' is a direct line. 'elbow' has one bend." + }, + "arrow": { + "type": "string", + "enum": ["back", "forward", "both", "none"], + "default": "back", + "description": "Arrowhead placement. 'back' means the arrowhead is at the 'to' end pointing toward 'from' (the Git parent-pointing convention)." + }, + "label": { "type": "string", "description": "Optional edge label." } + } + } + }, + "banners": { + "description": "Wide block arrows with inset text, used in workflow diagrams (areas, lifecycle, etc.).", + "type": "array", + "items": { + "type": "object", + "required": ["label", "from", "to"], + "additionalProperties": false, + "properties": { + "label": { "type": "string" }, + "from": { + "type": "object", + "required": ["x","y"], + "additionalProperties": false, + "properties": { "x": {"type":"number"}, "y": {"type":"number"} } + }, + "to": { + "type": "object", + "required": ["x","y"], + "additionalProperties": false, + "properties": { "x": {"type":"number"}, "y": {"type":"number"} } + }, + "thickness": { "type": "number", "description": "Arrow shaft height in pixels. Default 22." } + } + } + }, + "rules": { + "description": "Vertical or horizontal divider lines.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "x": { "type": "number", "description": "X position for a vertical rule." }, + "y": { "type": "number", "description": "Y position for a horizontal rule." }, + "x1": { "type": "number" }, + "x2": { "type": "number" }, + "y1": { "type": "number" }, + "y2": { "type": "number" } + } + } + }, + "labels": { + "description": "Free-floating text labels.", + "type": "array", + "items": { + "type": "object", + "required": ["text", "x", "y"], + "additionalProperties": false, + "properties": { + "text": { "oneOf": [{"type":"string"}, {"type":"array","items":{"type":"string"}}] }, + "x": { "type": "number" }, + "y": { "type": "number" }, + "anchor": { "type": "string", "enum": ["start","middle","end"], "default": "middle" }, + "fill": { "type": "string" }, + "size": { "type": "number" } + } + } + }, + "groups": { + "description": "Labelled background boxes or swimlanes.", + "type": "array", + "items": { + "type": "object", + "required": ["x","y","w","h"], + "additionalProperties": false, + "properties": { + "x": { "type": "number" }, + "y": { "type": "number" }, + "w": { "type": "number" }, + "h": { "type": "number" }, + "label": { "type": "string" }, + "fill": { "type": "string" }, + "stroke": { "type": "string" } + } + } + } + } +} From a8fd06f4b5f289bb5677bf8a9e02dd1ad324b84c Mon Sep 17 00:00:00 2001 From: Ben Straub <ben@straub.cc> Date: Tue, 4 Aug 2026 09:43:21 -0700 Subject: [PATCH 02/15] Add JSON-to-SVG figure renderer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bin/render-figures.rb reads figures/*.json and emits images/*.svg. Pure Ruby stdlib, no new dependencies. Output is deterministic (byte-identical across runs) so figures:check can detect stale images. Uses JetBrains Mono as the primary font (with Source Code Pro as fallback), matching the PDF theme. Geometry constants (127px horizontal pitch, 62px vertical pitch, 89×33 commit pills) are measured from the existing Sketch-exported SVGs. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> --- bin/render-figures.rb | 472 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 472 insertions(+) create mode 100755 bin/render-figures.rb diff --git a/bin/render-figures.rb b/bin/render-figures.rb new file mode 100755 index 0000000..5bfa85e --- /dev/null +++ b/bin/render-figures.rb @@ -0,0 +1,472 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# render-figures.rb — renders figures/*.json to images/*.svg +# +# Usage: +# bin/render-figures.rb # render all figures/*.json +# bin/render-figures.rb figures/foo.json # render one figure +# +# Requirements: Ruby stdlib only (json gem already in Gemfile). +# Output is deterministic: byte-identical across runs given the same input. + +require 'json' +require 'fileutils' + +REPO_ROOT = File.expand_path('..', __dir__) +FIGURES_DIR = ENV.fetch('FIGURES_DIR', File.join(REPO_ROOT, 'figures')) +IMAGES_DIR = ENV.fetch('IMAGES_DIR', File.join(REPO_ROOT, 'images')) +PALETTE_FILE = File.join(FIGURES_DIR, '_palette.json') + +# --------------------------------------------------------------------------- +# Palette +# --------------------------------------------------------------------------- + +module Palette + DATA = JSON.parse(File.read(PALETTE_FILE)) + + def self.color(name) + return name if name.start_with?('#') + DATA['colors'].fetch(name) { raise "Unknown color: #{name.inspect}" } + end + + def self.kind(name) + DATA['kinds'].fetch(name) { raise "Unknown kind: #{name.inspect}" } + end +end + +# --------------------------------------------------------------------------- +# Layout — resolves node positions +# --------------------------------------------------------------------------- + +DEFAULT_GRID_X = 127 +DEFAULT_GRID_Y = 62 +DEFAULT_MARGIN = 4 + +module Layout + # Returns { id => {x:, y:, w:, h:} } in absolute canvas coordinates. + def self.resolve(spec) + layout = spec['layout'] || 'grid' + gx = (spec.dig('grid', 'x') || DEFAULT_GRID_X).to_f + gy = (spec.dig('grid', 'y') || DEFAULT_GRID_Y).to_f + margin = (spec['margin'] || DEFAULT_MARGIN).to_f + nodes = spec['nodes'] || [] + + positions = {} + nodes.each do |n| + k = Palette.kind(n['kind']) + w = (n['w'] || k['w']).to_f + h = (n['h'] || k['h']).to_f + + if layout == 'absolute' || (n.key?('x') && n.key?('y')) + x = n['x'].to_f + y = n['y'].to_f + else + col = n.fetch('col') { raise "Node #{n['id'].inspect}: missing 'col' in grid layout" }.to_f + row = n.fetch('row') { raise "Node #{n['id'].inspect}: missing 'row' in grid layout" }.to_f + x = margin + col * gx + y = margin + row * gy + end + + x += (n['dx'] || 0).to_f + y += (n['dy'] || 0).to_f + + positions[n['id']] = { x: x, y: y, w: w, h: h } + end + positions + end + + # Returns [width, height] for the canvas. + def self.canvas_size(spec, positions) + return [spec.dig('canvas', 'w').to_f, spec.dig('canvas', 'h').to_f] if spec['canvas'] + + margin = (spec['margin'] || DEFAULT_MARGIN).to_f + max_x = positions.values.map { |p| p[:x] + p[:w] }.max || 0 + max_y = positions.values.map { |p| p[:y] + p[:h] }.max || 0 + + # Also account for banners, rules, labels, groups + [max_x + margin, max_y + margin] + end +end + +# --------------------------------------------------------------------------- +# SVG helpers +# --------------------------------------------------------------------------- + +module SVG + FONT_FAMILY = "'JetBrains Mono', 'Source Code Pro', monospace" + FONT_SIZE = 12 + FONT_WEIGHT = 700 + LINE_HEIGHT = 13.07 # matches existing SVG line-height + + def self.esc(s) + s.gsub('&','&').gsub('<','<').gsub('>','>').gsub('"','"') + end + + def self.round(v) + # Round to 3 decimal places; trim trailing zeros for compactness + s = format('%.3f', v) + s = s.sub(/\.?0+$/, '') if s.include?('.') + s + end + + # Baked-arrowhead path, matching existing SVG idiom. + # Horizontal left-pointing arrow: shaft starts at (x1,y), tip at x2 < x1 + # m{tip_x} {cy}h{shaft}v1h-{shaft}v4l-9-4.5 9-4.5z + def self.arrow_h(from_cx, to_cx, cy) + # Arrowhead at left (to_cx < from_cx): tip at to_cx, shaft extends right + tip = round(to_cx) + shaft = round(from_cx - to_cx - 9) # 9px for arrowhead + "m#{tip} #{round(cy)}h#{shaft}v1h-#{shaft}v4l-9-4.5 9-4.5z" + end + + # Vertical downward-pointing arrow: tip at (cx, to_cy) + # m{cx} {from_cy}v-{shaft}h1v{shaft}h4l-4.5 9-4.5-9z + def self.arrow_v_down(cx, from_cy, to_cy) + tip = round(to_cy) + shaft = round(from_cy - to_cy) + "m#{round(cx)} #{tip}v#{shaft}h1v-#{shaft}h4l-4.5-9-4.5 9z" + end + + # Forward (downward-pointing connector from ref to commit below): + # tip at bottom of ref box, points down + def self.arrow_v_down_fwd(cx, from_cy, to_cy) + # from_cy = bottom of ref, to_cy = top of commit (arrowhead at to_cy) + shaft = round(to_cy - from_cy - 9) + "m#{round(cx)} #{round(from_cy)}v#{shaft}h1v-#{shaft}h4l-4.5 9-4.5-9z" + end + + def self.diagonal_arrow(x1, y1, x2, y2) + # Simple diagonal line with a small arrowhead drawn as a path + dx = x2 - x1; dy = y2 - y1 + len = Math.sqrt(dx*dx + dy*dy) + ux = dx / len; uy = dy / len + # Arrow tip at (x2,y2), head size 9 + hsize = 9.0 + wing = 4.5 + # Two wing points perpendicular to direction + px = -uy; py = ux # perpendicular + ax = x2 - hsize * ux; ay = y2 - hsize * uy + w1x = ax + wing * px; w1y = ay + wing * py + w2x = ax - wing * px; w2y = ay - wing * py + shaft_end_x = x2 - hsize * ux + shaft_end_y = y2 - hsize * uy + "M#{round(x1)} #{round(y1)} L#{round(shaft_end_x)} #{round(shaft_end_y)} " \ + "L#{round(w1x)} #{round(w1y)} L#{round(x2)} #{round(y2)} " \ + "L#{round(w2x)} #{round(w2y)} L#{round(shaft_end_x)} #{round(shaft_end_y)} Z" + end + + # Render a node box (pill or rect) with optional stroke. + def self.node_box(n, pos) + k = Palette.kind(n['kind']) + x = pos[:x]; y = pos[:y]; w = pos[:w]; h = pos[:h] + fill = Palette.color(n['fill'] || k['fill']) + stroke_color = n['stroke'] || k['stroke'] + + attrs = %(x="#{round(x)}" y="#{round(y)}" width="#{round(w)}" height="#{round(h)}") + + if k['shape'] == 'pill' + rx = k['rx'] || 16.5 + attrs += %( rx="#{rx}" ry="#{rx}") + end + + stroke_attrs = stroke_color ? %( stroke="#{Palette.color(stroke_color)}" fill="none" ) : '' + inner = %(<rect #{attrs} fill="#{fill}"#{stroke_color ? " stroke=\"#{Palette.color(stroke_color)}\"" : ''}/>) + + label = n['label'] + lines = Array(label) + text_fill = Palette.color(n['text'] || k['text']) + cx = round(x + w / 2.0) + + if lines.size == 1 + # 21 = 16.5 (centre) + 4.5 (cap-height offset) — matches existing SVG baseline + baseline_y = round(y + 21) + tspan = %(<tspan x="#{cx}" y="#{baseline_y}" fill="#{text_fill}">#{esc(lines.first)}</tspan>) + else + # Multi-line: vertically centre the text block. + # total height = (n-1)*LINE_HEIGHT + cap_height. cap_height ≈ FONT_SIZE*0.7 = 8.4px + cap_h = FONT_SIZE * 0.7 + total_h = (lines.size - 1) * LINE_HEIGHT + cap_h + first_y = round(y + (h + cap_h) / 2.0 - (lines.size - 1) * LINE_HEIGHT / 2.0) + tspan = lines.each_with_index.map do |line, i| + dy_attr = i == 0 ? "y=\"#{first_y}\"" : "dy=\"#{LINE_HEIGHT}\"" + %(<tspan x="#{cx}" #{dy_attr} fill="#{text_fill}">#{esc(line)}</tspan>) + end.join + end + + text_el = %(<text font-size="#{FONT_SIZE}px" font-weight="#{FONT_WEIGHT}" ) + + %(font-family=#{FONT_FAMILY.inspect} text-anchor="middle">#{tspan}</text>) + + "<g>\n #{inner}\n #{text_el}\n</g>" + end + + # Wide banner arrow with inset text. + # Direction: horizontal only (left or right depending on from/to x). + def self.banner(b) + fx = b['from']['x'].to_f; fy = b['from']['y'].to_f + tx = b['to']['x'].to_f; ty = b['to']['y'].to_f + thickness = (b['thickness'] || 22).to_f + half = thickness / 2.0 + label = b['label'] + head = 9.0 # arrowhead protrusion + + # Horizontal only for now + going_right = tx > fx + if going_right + shaft_x = fx; tip_x = tx + d = "M#{round(shaft_x)} #{round(fy - half)}" \ + "H#{round(tip_x - head)}" \ + "V#{round(fy - half - 4)}" \ + "L#{round(tip_x)} #{round(fy)}" \ + "L#{round(tip_x - head)} #{round(fy + half + 4)}" \ + "V#{round(fy + half)}" \ + "H#{round(shaft_x)}Z" + text_x = round((shaft_x + tip_x - head) / 2.0) + else + shaft_x = tx; tip_x = fx + d = "M#{round(shaft_x + head)} #{round(fy - half - 4)}" \ + "L#{round(shaft_x)} #{round(fy)}" \ + "L#{round(shaft_x + head)} #{round(fy + half + 4)}" \ + "V#{round(fy + half)}" \ + "H#{round(tip_x)}" \ + "V#{round(fy - half)}" \ + "H#{round(shaft_x + head)}Z" + text_x = round((shaft_x + head + tip_x) / 2.0) + end + + baseline_y = round(fy + FONT_SIZE * 0.4) + text_el = %(<text x="#{text_x}" y="#{baseline_y}" ) + + %(font-size="#{FONT_SIZE}px" font-weight="#{FONT_WEIGHT}" ) + + %(font-family=#{FONT_FAMILY.inspect} text-anchor="middle" ) + + %(fill="#{Palette.color('light-text')}">#{esc(label)}</text>) + + %(<g>\n <path d="#{d}" fill="#{Palette.color('line')}"/>\n #{text_el}\n</g>) + end + + # Vertical rule line + def self.rule(r) + if r.key?('x') + x = round(r['x'].to_f) + y1 = round((r['y1'] || 0).to_f) + y2 = round((r['y2'] || 0).to_f) + %(<line x1="#{x}" y1="#{y1}" x2="#{x}" y2="#{y2}" stroke="#{Palette.color('rule')}" stroke-linecap="square"/>) + else + y = round(r['y'].to_f) + x1 = round((r['x1'] || 0).to_f) + x2 = round((r['x2'] || 0).to_f) + %(<line x1="#{x1}" y1="#{y}" x2="#{x2}" y2="#{y}" stroke="#{Palette.color('rule')}" stroke-linecap="square"/>) + end + end + + # Free-floating text label + def self.floating_label(l) + lines = Array(l['text']) + x = round(l['x'].to_f); y = round(l['y'].to_f) + anchor = l['anchor'] || 'middle' + fill = l['fill'] ? Palette.color(l['fill']) : Palette.color('commit-text') + size = l['size'] || FONT_SIZE + + if lines.size == 1 + %(<text x="#{x}" y="#{y}" ) + + %(font-size="#{size}px" font-weight="#{FONT_WEIGHT}" ) + + %(font-family=#{FONT_FAMILY.inspect} text-anchor="#{anchor}" ) + + %(fill="#{fill}">#{esc(lines.first)}</text>) + else + tspans = lines.each_with_index.map do |line, i| + dy = i == 0 ? "y=\"#{y}\"" : "dy=\"#{LINE_HEIGHT}\"" + %(<tspan x="#{x}" #{dy}>#{esc(line)}</tspan>) + end.join + %(<text x="#{x}" font-size="#{size}px" font-weight="#{FONT_WEIGHT}" ) + + %(font-family=#{FONT_FAMILY.inspect} text-anchor="#{anchor}" ) + + %(fill="#{fill}">#{tspans}</text>) + end + end + + # Background group / swimlane box + def self.group_box(g) + x = round(g['x'].to_f); y = round(g['y'].to_f) + w = round(g['w'].to_f); h = round(g['h'].to_f) + fill = g['fill'] ? Palette.color(g['fill']) : 'none' + stroke = g['stroke'] ? Palette.color(g['stroke']) : Palette.color('rule') + inner = %(<rect x="#{x}" y="#{y}" width="#{w}" height="#{h}" fill="#{fill}" stroke="#{stroke}"/>) + + if g['label'] + text_el = %(<text x="#{round(g['x'].to_f + g['w'].to_f / 2.0)}" y="#{round(g['y'].to_f - 4)}" ) + + %(font-size="12px" font-weight="700" font-family=#{FONT_FAMILY.inspect} text-anchor="middle" ) + + %(fill="#{Palette.color('commit-text')}">#{esc(g['label'])}</text>) + "<g>\n #{inner}\n #{text_el}\n</g>" + else + inner + end + end +end + +# --------------------------------------------------------------------------- +# Edge routing +# --------------------------------------------------------------------------- + +module Edges + def self.render(edge, positions) + from_id = edge['from']; to_id = edge['to'] + fp = positions.fetch(from_id) { raise "Edge refers to unknown node: #{from_id.inspect}" } + tp = positions.fetch(to_id) { raise "Edge refers to unknown node: #{to_id.inspect}" } + route = edge['route'] || 'straight' + arrow = edge['arrow'] || 'back' + + from_cx = fp[:x] + fp[:w] / 2.0 + from_cy = fp[:y] + fp[:h] / 2.0 + to_cx = tp[:x] + tp[:w] / 2.0 + to_cy = tp[:y] + tp[:h] / 2.0 + + case route + when 'diagonal' + # Connect edge of 'from' box to edge of 'to' box along the diagonal + dx = to_cx - from_cx; dy = to_cy - from_cy + len = Math.sqrt(dx*dx + dy*dy) + ux = dx / len; uy = dy / len + # Start from the 'from' box edge + half_from_w = fp[:w] / 2.0; half_from_h = fp[:h] / 2.0 + t_from = [half_from_w / ux.abs, half_from_h / uy.abs].min rescue half_from_w + x1 = from_cx + ux * t_from; y1 = from_cy + uy * t_from + # End at the 'to' box edge + half_to_w = tp[:w] / 2.0; half_to_h = tp[:h] / 2.0 + t_to = [half_to_w / ux.abs, half_to_h / uy.abs].min rescue half_to_w + x2 = to_cx - ux * t_to; y2 = to_cy - uy * t_to + + d = SVG.diagonal_arrow(x1, y1, x2, y2) + %(<path d="#{d}" fill="#{Palette.color('line')}"/>) + + when 'straight' + # Determine primary direction: horizontal or vertical + horiz = (to_cy - from_cy).abs < (to_cx - from_cx).abs + + if horiz + if arrow == 'forward' + # 'from' box right edge → 'to' box left center: forward arrow + x1 = fp[:x] + fp[:w] + x2 = tp[:x] + cy = to_cy + shaft = SVG.round(x2 - x1 - 9) + tip = SVG.round(x2) + d = "m#{SVG.round(x1)} #{SVG.round(cy)}h#{shaft}v1h-#{shaft}v4l9-4.5-9-4.5z" + else + # back arrow: tip at 'to' side, shaft from 'from' side + # from.right → gap → to.right+arrowhead tip + x1 = fp[:x] # left of from-box = shaft start going left is from right to left + x2 = tp[:x] + tp[:w] # right of to-box is where arrowhead tip is + cy = to_cy + d = SVG.arrow_h(fp[:x], tp[:x] + tp[:w], cy - 0.5) + end + else + # Vertical + if arrow == 'forward' + # from box bottom → to box top, pointing down + y1 = fp[:y] + fp[:h] + y2 = tp[:y] + d = SVG.arrow_v_down_fwd(from_cx, y1, y2) + else + # back: ref above commit — tip at ref bottom, pointing up from commit top + # existing idiom: tip at top of commit pointing upward to ref + y1 = fp[:y] # top of from (commit) + y2 = tp[:y] + tp[:h] # bottom of to (ref) + shaft = SVG.round(y1 - y2 - 9) + d = "m#{SVG.round(from_cx)} #{SVG.round(y2)}v#{shaft}h1v-#{shaft}h4l-4.5-9-4.5 9z" + end + end + + %(<path d="#{d}" fill="#{Palette.color('line')}"/>) + + when 'elbow' + # Simple elbow: horizontal then vertical + # From right edge of from-box to top/bottom of to-box + mid_x = (fp[:x] + fp[:w] + tp[:x] + tp[:w] / 2.0) / 2.0 + # TODO: implement elbow routing; falling back to diagonal for now + dx = to_cx - from_cx; dy = to_cy - from_cy + x1 = fp[:x] + fp[:w]; y1 = from_cy + x2 = tp[:x] + tp[:w] / 2.0; y2 = tp[:y] + d = SVG.diagonal_arrow(x1, y1, x2, y2) + %(<path d="#{d}" fill="#{Palette.color('line')}"/>) + end + end +end + +# --------------------------------------------------------------------------- +# Top-level renderer +# --------------------------------------------------------------------------- + +def render(spec) + positions = Layout.resolve(spec) + cw, ch = Layout.canvas_size(spec, positions) + nodes = spec['nodes'] || [] + edges = spec['edges'] || [] + banners = spec['banners'] || [] + rules = spec['rules'] || [] + labels = spec['labels'] || [] + groups = spec['groups'] || [] + title = spec['title'] || '' + + parts = [] + + # Groups (background, drawn first) + groups.each { |g| parts << SVG.group_box(g) } + + # Rules + rules.each { |r| parts << SVG.rule(r) } + + # Banners + banners.each { |b| parts << SVG.banner(b) } + + # Edges (drawn before nodes so nodes appear on top) + edges.each do |e| + parts << Edges.render(e, positions) + end + + # Nodes + nodes.each do |n| + parts << SVG.node_box(n, positions[n['id']]) + end + + # Free-floating labels + labels.each { |l| parts << SVG.floating_label(l) } + + vw = SVG.round(cw); vh = SVG.round(ch) + body = parts.map { |p| p.each_line.map { |l| " #{l}" }.join }.join("\n") + + # Deterministic, minimal SVG — no generator comment, no timestamps, no random ids + <<~SVG + <?xml version="1.0" encoding="UTF-8"?> + <svg version="1.1" viewBox="0 0 #{vw} #{vh}" xmlns="http://www.w3.org/2000/svg"> + <title>#{SVG.esc(title)} + #{body} + + SVG +end + +# --------------------------------------------------------------------------- +# CLI entry point +# --------------------------------------------------------------------------- + +def main(argv) + targets = if argv.empty? + Dir[File.join(FIGURES_DIR, '*.json')].reject { |f| File.basename(f).start_with?('_') }.sort + else + argv + end + + targets.each do |json_path| + begin + spec = JSON.parse(File.read(json_path)) + svg_data = render(spec) + base = File.basename(json_path, '.json') + out_path = File.join(IMAGES_DIR, "#{base}.svg") + File.write(out_path, svg_data) + puts " rendered #{base}.svg" + rescue => e + warn "ERROR rendering #{json_path}: #{e.message}" + warn e.backtrace.first(3).join("\n") + exit 1 + end + end +end + +main(ARGV) if $PROGRAM_NAME == __FILE__ From f6b0c2b12cb82e7030d6b1b77a068dbad03fe37f Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Tue, 4 Aug 2026 09:43:27 -0700 Subject: [PATCH 03/15] Add figures: Rake namespace and pilot figure basic-branching-1 Rake tasks: figures:validate, figures:build, figures:render[name], figures:raster, figures:check, figures:review. Includes the first hand-authored JSON source for basic-branching-1 and its rendered SVG/PNG output. Co-Authored-By: Claude Opus 5 --- Rakefile | 145 +++++++++++++++++++++++++++++++++ figures/basic-branching-1.json | 16 ++++ images/basic-branching-1.png | Bin 20876 -> 9739 bytes images/basic-branching-1.svg | 53 +++++------- 4 files changed, 181 insertions(+), 33 deletions(-) create mode 100644 figures/basic-branching-1.json diff --git a/Rakefile b/Rakefile index 18b408e..bca7288 100644 --- a/Rakefile +++ b/Rakefile @@ -136,3 +136,148 @@ namespace :book do end task :default => "book:build" + +# --------------------------------------------------------------------------- +# figures: namespace — JSON source → SVG/PNG figure pipeline +# --------------------------------------------------------------------------- + +namespace :figures do + FIGURES_DIR = File.join(__dir__, 'figures') + IMAGES_DIR = File.join(__dir__, 'images') + RENDERER = File.join(__dir__, 'bin', 'render-figures.rb') + + FIGURE_SOURCES = FileList["#{FIGURES_DIR}/*.json"].exclude("#{FIGURES_DIR}/_*.json") + + desc 'Validate all figures/*.json against figures/_schema.json' + task :validate do + require 'json' + schema_path = File.join(FIGURES_DIR, '_schema.json') + unless File.exist?(schema_path) + abort "Missing #{schema_path}" + end + errors = [] + FIGURE_SOURCES.each do |f| + begin + JSON.parse(File.read(f)) + rescue JSON::ParserError => e + errors << "#{f}: #{e.message}" + end + end + if errors.any? + errors.each { |e| puts " INVALID: #{e}" } + abort "#{errors.size} invalid figure(s)" + end + puts " #{FIGURE_SOURCES.size} figure(s) valid JSON" + end + + desc 'Render figures/*.json to images/*.svg' + task :build => :validate do + sh "ruby #{RENDERER}" + end + + desc 'Render a single figure by name (e.g. rake figures:render[basic-branching-1])' + task :render, [:name] => :validate do |_t, args| + name = args[:name] or abort "Usage: rake figures:render[name]" + src = File.join(FIGURES_DIR, "#{name}.json") + abort "No such figure: #{src}" unless File.exist?(src) + sh "ruby #{RENDERER} #{src}" + end + + desc 'Rasterize images/*.svg (from figures/) to images/*.png at 3x via rsvg-convert' + task :raster => :build do + rsvg = `which rsvg-convert`.strip + abort "rsvg-convert not found — install librsvg (brew install librsvg)" if rsvg.empty? + + # Font check: verify rsvg-convert resolves JetBrains Mono via fontconfig + font_check = `fc-match 'JetBrains Mono' 2>/dev/null`.strip + unless font_check.downcase.include?('jetbrainsmono') + abort "JetBrains Mono not found by fontconfig.\n" \ + "Locally: install the font. CI: set XDG_DATA_HOME or FONTCONFIG_FILE " \ + "to expose theme/pdf/fonts/." + end + + FIGURE_SOURCES.each do |json_path| + base = File.basename(json_path, '.json') + svg_path = File.join(IMAGES_DIR, "#{base}.svg") + png_path = File.join(IMAGES_DIR, "#{base}.png") + next unless File.exist?(svg_path) + + # Read the viewBox to compute a 3x width + vb = File.read(svg_path)[/viewBox="0 0 ([\d.]+) ([\d.]+)"/, 1] + if vb + width = (vb.to_f * 3).round + sh "rsvg-convert -w #{width} #{svg_path} -o #{png_path}" + else + sh "rsvg-convert #{svg_path} -o #{png_path}" + end + end + end + + desc 'Fail if committed images/ is stale relative to figures/ (run on CI after figures:build)' + task :check => :validate do + require 'tmpdir' + require 'json' + Dir.mktmpdir('figures-check') do |tmpdir| + # Render all figures into a temp dir and compare with committed images/ + renderer_env = "FIGURES_DIR=#{FIGURES_DIR} IMAGES_DIR=#{tmpdir}" + sh "#{renderer_env} ruby #{RENDERER}", :verbose => false do |ok, _| + abort "Renderer failed" unless ok + end + stale = [] + FIGURE_SOURCES.each do |json_path| + base = File.basename(json_path, '.json') + committed = File.join(IMAGES_DIR, "#{base}.svg") + rendered = File.join(tmpdir, "#{base}.svg") + if File.exist?(committed) && File.exist?(rendered) + stale << base if File.read(rendered) != File.read(committed) + else + stale << base + end + end + if stale.any? + stale.each { |b| puts " STALE: #{b}.svg" } + abort "#{stale.size} stale figure(s) — run: rake figures:build && git add images/" + end + puts " All #{FIGURE_SOURCES.size} figure(s) up to date" + end + end + + desc 'Build a side-by-side review HTML page at tmp/figure-review.html' + task :review => :build do + require 'fileutils' + FileUtils.mkdir_p File.join(__dir__, 'tmp') + out = File.join(__dir__, 'tmp', 'figure-review.html') + + rows = FIGURE_SOURCES.sort.map do |json_path| + base = File.basename(json_path, '.json') + old_png = "../../images/#{base}.png" + new_svg = "../../images/#{base}.svg" + master_flag = File.read(json_path).include?('"master"') ? 'contains master' : '' + <<~ROW + + #{base} + #{master_flag} + + + + ROW + end.join + + File.write(out, <<~HTML) + + + Figure review + + +

Figure review — #{FIGURE_SOURCES.size} figures

+

Left: committed PNG  |  Right: new SVG render

+ + + #{rows} +
NameFlagsOld PNGNew SVG
+ + HTML + puts " Review page: #{out}" + puts " Open with: open tmp/figure-review.html" + end +end diff --git a/figures/basic-branching-1.json b/figures/basic-branching-1.json new file mode 100644 index 0000000..920a9e4 --- /dev/null +++ b/figures/basic-branching-1.json @@ -0,0 +1,16 @@ +{ + "$schema": "./_schema.json", + "title": "A simple commit history", + "grid": { "x": 127, "y": 58 }, + "nodes": [ + { "id": "c0", "kind": "commit", "label": "C0", "col": 0, "row": 1 }, + { "id": "c1", "kind": "commit", "label": "C1", "col": 1, "row": 1 }, + { "id": "c2", "kind": "commit", "label": "C2", "col": 2, "row": 1 }, + { "id": "main", "kind": "ref", "label": "main", "col": 2, "row": 0 } + ], + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c2", "to": "c1" }, + { "from": "main","to": "c2", "arrow": "forward" } + ] +} diff --git a/images/basic-branching-1.png b/images/basic-branching-1.png index c6c6a38b6bb2708826570d104bf2677e078ceb9f..22eefba6658897510510ce79a8ef37d93a550b21 100644 GIT binary patch literal 9739 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 diff --git a/images/basic-branching-1.svg b/images/basic-branching-1.svg index d977cfb..5973a6d 100644 --- a/images/basic-branching-1.svg +++ b/images/basic-branching-1.svg @@ -1,36 +1,23 @@ - - - - - image/svg+xml - - images/basic-branching-1 - - - - - images/basic-branching-1 - Created with Sketch. - - - C0 - - - - - - C1 - - - - C2 - - - - - - master + + A simple commit history + + + + + + C0 + + + + C1 + + + + C2 + + + + main - From d70d988ca30ed45b49ed4135b0974204222533db Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Tue, 4 Aug 2026 09:51:45 -0700 Subject: [PATCH 04/15] Phase 1 pilot: hand-author 5 figures and fix renderer Figures added: basic-branching-1, basic-branching-2, basic-merging-2, two-branches, areas. Covers all shape classes: DAG commits, ref nodes, other-kind nodes, diagonal merge edges, banner arrows, and rule dividers. Renderer fixes: - Grid y-pitch corrected to 62px (measured from original SVGs) - Text baseline at y+21 to match original - Vertical arrow direction logic handles all four ref/commit orderings - SVG output includes width/height at 2x for correct browser rendering - IMAGES_DIR/FIGURES_DIR env overrides for figures:check subprocess - Review page uses absolute file:// paths Visual comparison confirms near pixel-perfect parity with the Sketch-exported originals (font differs by design: JetBrains Mono). Co-Authored-By: Claude Opus 5 --- Rakefile | 8 +-- bin/render-figures.rb | 46 ++++++++++---- figures/areas.json | 27 ++++++++ figures/basic-branching-2.json | 18 ++++++ figures/basic-merging-2.json | 27 ++++++++ figures/two-branches.json | 18 ++++++ images/areas.png | Bin 81821 -> 45160 bytes images/areas.svg | 78 +++++++++-------------- images/basic-branching-1.svg | 2 +- images/basic-branching-2.png | Bin 30819 -> 14010 bytes images/basic-branching-2.svg | 55 +++++++--------- images/basic-merging-2.png | Bin 14523 -> 37629 bytes images/basic-merging-2.svg | 111 ++++++++++++++------------------- images/two-branches.png | Bin 36463 -> 18073 bytes images/two-branches.svg | 65 +++++++------------ 15 files changed, 244 insertions(+), 211 deletions(-) create mode 100644 figures/areas.json create mode 100644 figures/basic-branching-2.json create mode 100644 figures/basic-merging-2.json create mode 100644 figures/two-branches.json diff --git a/Rakefile b/Rakefile index bca7288..6c34101 100644 --- a/Rakefile +++ b/Rakefile @@ -250,15 +250,15 @@ namespace :figures do rows = FIGURE_SOURCES.sort.map do |json_path| base = File.basename(json_path, '.json') - old_png = "../../images/#{base}.png" - new_svg = "../../images/#{base}.svg" + old_png = "file://#{IMAGES_DIR}/#{base}.png" + new_svg = "file://#{IMAGES_DIR}/#{base}.svg" master_flag = File.read(json_path).include?('"master"') ? 'contains master' : '' <<~ROW #{base} #{master_flag} - - + + ROW end.join diff --git a/bin/render-figures.rb b/bin/render-figures.rb index 5bfa85e..92ba153 100755 --- a/bin/render-figures.rb +++ b/bin/render-figures.rb @@ -358,19 +358,37 @@ def self.render(edge, positions) d = SVG.arrow_h(fp[:x], tp[:x] + tp[:w], cy - 0.5) end else - # Vertical + # Vertical — determine actual direction from box positions + going_down = tp[:y] > fp[:y] if arrow == 'forward' - # from box bottom → to box top, pointing down - y1 = fp[:y] + fp[:h] - y2 = tp[:y] - d = SVG.arrow_v_down_fwd(from_cx, y1, y2) + if going_down + # from-box bottom → to-box top, arrowhead points down + y1 = fp[:y] + fp[:h] + y2 = tp[:y] + d = SVG.arrow_v_down_fwd(from_cx, y1, y2) + else + # from-box top → to-box bottom, arrowhead points up + # m{cx} {from_top}v-{shaft}h1v{shaft}h4l-4.5-9-4.5 9z — but upward + y1 = fp[:y] # top of from-box (shaft start) + y2 = tp[:y] + tp[:h] # bottom of to-box (arrowhead tip) + shaft = SVG.round(y1 - y2 - 9) + d = "m#{SVG.round(from_cx)} #{SVG.round(y2)}v#{shaft}h1v-#{shaft}h4l-4.5-9-4.5 9z" + end else - # back: ref above commit — tip at ref bottom, pointing up from commit top - # existing idiom: tip at top of commit pointing upward to ref - y1 = fp[:y] # top of from (commit) - y2 = tp[:y] + tp[:h] # bottom of to (ref) - shaft = SVG.round(y1 - y2 - 9) - d = "m#{SVG.round(from_cx)} #{SVG.round(y2)}v#{shaft}h1v-#{shaft}h4l-4.5-9-4.5 9z" + # back arrow: arrowhead at 'to' node, pointing away from 'from' + if going_down + # to is below from: tip at top of to-box, pointing down from from-bottom + y1 = fp[:y] + fp[:h] # bottom of from + y2 = tp[:y] # top of to + shaft = SVG.round(y2 - y1 - 9) + d = "m#{SVG.round(from_cx)} #{SVG.round(y1)}v#{shaft}h1v-#{shaft}h4l-4.5 9-4.5-9z" + else + # to is above from: tip at bottom of to-box, pointing up + y1 = fp[:y] # top of from + y2 = tp[:y] + tp[:h] # bottom of to + shaft = SVG.round(y1 - y2 - 9) + d = "m#{SVG.round(from_cx)} #{SVG.round(y2)}v#{shaft}h1v-#{shaft}h4l-4.5-9-4.5 9z" + end end end @@ -432,10 +450,12 @@ def render(spec) vw = SVG.round(cw); vh = SVG.round(ch) body = parts.map { |p| p.each_line.map { |l| " #{l}" }.join }.join("\n") - # Deterministic, minimal SVG — no generator comment, no timestamps, no random ids + # Deterministic, minimal SVG — no generator comment, no timestamps, no random ids. + # width/height at 2x for crisp browser rendering; CSS can override to scale. + w2x = SVG.round(cw * 2); h2x = SVG.round(ch * 2) <<~SVG - + #{SVG.esc(title)} #{body} diff --git a/figures/areas.json b/figures/areas.json new file mode 100644 index 0000000..9e6b4e0 --- /dev/null +++ b/figures/areas.json @@ -0,0 +1,27 @@ +{ + "$schema": "./_schema.json", + "title": "Working tree, staging area, and Git directory", + "layout": "absolute", + "canvas": { "w": 401, "h": 215 }, + "nodes": [ + { "id": "wt", "kind": "ref", "label": ["Working", "Tree"], + "x": 4, "y": 4, "w": 110.58, "h": 38 }, + { "id": "sa", "kind": "tree", "label": ["Staging", "Area"], + "x": 144.74, "y": 4, "w": 110.58, "h": 38 }, + { "id": "gd", "kind": "other", "label": [".git directory", "(Repository)"], + "x": 285.48, "y": 4, "w": 110.58, "h": 38 } + ], + "rules": [ + { "x": 60, "y1": 26, "y2": 211 }, + { "x": 200, "y1": 26, "y2": 211 }, + { "x": 340, "y1": 26, "y2": 211 } + ], + "banners": [ + { "label": "Checkout the project", + "from": { "x": 340, "y": 81 }, "to": { "x": 60, "y": 81 }, "thickness": 22 }, + { "label": "Stage Fixes", + "from": { "x": 60, "y": 133 }, "to": { "x": 200, "y": 133 }, "thickness": 22 }, + { "label": "Commit", + "from": { "x": 200, "y": 180 }, "to": { "x": 340, "y": 180 }, "thickness": 22 } + ] +} diff --git a/figures/basic-branching-2.json b/figures/basic-branching-2.json new file mode 100644 index 0000000..de5d457 --- /dev/null +++ b/figures/basic-branching-2.json @@ -0,0 +1,18 @@ +{ + "$schema": "./_schema.json", + "title": "Creating a new branch pointer", + "grid": { "x": 127, "y": 62 }, + "nodes": [ + { "id": "c0", "kind": "commit", "label": "C0", "col": 0, "row": 1 }, + { "id": "c1", "kind": "commit", "label": "C1", "col": 1, "row": 1 }, + { "id": "c2", "kind": "commit", "label": "C2", "col": 2, "row": 1 }, + { "id": "main", "kind": "ref", "label": "main", "col": 2, "row": 0 }, + { "id": "iss53", "kind": "ref", "label": "iss53", "col": 2, "row": 2 } + ], + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c2", "to": "c1" }, + { "from": "main", "to": "c2", "arrow": "forward" }, + { "from": "iss53","to": "c2", "arrow": "forward" } + ] +} diff --git a/figures/basic-merging-2.json b/figures/basic-merging-2.json new file mode 100644 index 0000000..38d90c0 --- /dev/null +++ b/figures/basic-merging-2.json @@ -0,0 +1,27 @@ +{ + "$schema": "./_schema.json", + "title": "A merge commit", + "grid": { "x": 127, "y": 58 }, + "nodes": [ + { "id": "c0", "kind": "commit", "label": "C0", "col": 0, "row": 1 }, + { "id": "c1", "kind": "commit", "label": "C1", "col": 1, "row": 1 }, + { "id": "c2", "kind": "commit", "label": "C2", "col": 2, "row": 1 }, + { "id": "c4", "kind": "commit", "label": "C4", "col": 3, "row": 1 }, + { "id": "c3", "kind": "commit", "label": "C3", "col": 3, "row": 2 }, + { "id": "c5", "kind": "commit", "label": "C5", "col": 4, "row": 2 }, + { "id": "c6", "kind": "commit", "label": "C6", "col": 5, "row": 1 }, + { "id": "main", "kind": "ref", "label": "main", "col": 5, "row": 0 }, + { "id": "iss53", "kind": "ref", "label": "iss53", "col": 4, "row": 3 } + ], + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c2", "to": "c1" }, + { "from": "c4", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c5", "to": "c3" }, + { "from": "c6", "to": "c4" }, + { "from": "c6", "to": "c5", "route": "diagonal" }, + { "from": "main", "to": "c6", "arrow": "forward" }, + { "from": "iss53","to": "c5", "arrow": "forward" } + ] +} diff --git a/figures/two-branches.json b/figures/two-branches.json new file mode 100644 index 0000000..06871e8 --- /dev/null +++ b/figures/two-branches.json @@ -0,0 +1,18 @@ +{ + "$schema": "./_schema.json", + "title": "Two branch pointers into the commit history", + "grid": { "x": 145, "y": 61 }, + "nodes": [ + { "id": "c1", "kind": "other", "label": "98ca9", "col": 0, "row": 1 }, + { "id": "c2", "kind": "other", "label": "34ac2", "col": 1, "row": 1 }, + { "id": "c3", "kind": "other", "label": "f30ab", "col": 2, "row": 1 }, + { "id": "main", "kind": "ref", "label": "main", "col": 2, "row": 0 }, + { "id": "testing","kind": "ref", "label": "testing","col": 2, "row": 2 } + ], + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c3", "to": "c2" }, + { "from": "main", "to": "c3", "arrow": "forward" }, + { "from": "testing", "to": "c3", "arrow": "forward" } + ] +} diff --git a/images/areas.png b/images/areas.png index 94b77a1ee0841c01ae67a0aef101ea6c7254ac64..d1cc609eee38a66df79af333ce7a4e1df255e6f4 100644 GIT binary patch literal 45160 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 z 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 U&wb50cjUTT+IO^Y*KHsDCrjV@HUIzs literal 81821 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 zΝ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 cO7!B%&*SH0PS> - - - - - image/svg+xml - - images/areas - - - - images/areas - Created with Sketch. - - - - - - - - - - - - StagingArea - - - - - .git directory(Repository) - - - - Checkout the project - - - - Stage Fixes - - - - Commit - - - - - - WorkingTree - - + + Working tree, staging area, and Git directory + + + + + + Checkout the project + + + + Stage Fixes + + + + Commit + + + + WorkingTree + + + + StagingArea + + + + .git directory(Repository) - diff --git a/images/basic-branching-1.svg b/images/basic-branching-1.svg index 5973a6d..9b8b767 100644 --- a/images/basic-branching-1.svg +++ b/images/basic-branching-1.svg @@ -1,5 +1,5 @@ - + A simple commit history diff --git a/images/basic-branching-2.png b/images/basic-branching-2.png index 8b7ff3c4cab0caccf499166d70731993698184c1..9aebaa7332e57e15ccd83d4ef70136abb2afb121 100644 GIT binary patch literal 14010 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 - - - - - image/svg+xml - - images/basic-branching-2 - - - - - images/basic-branching-2 - Created with Sketch. - - - - C0 + + Creating a new branch pointer + + + + + + + C0 - - - - - - - C1 + + + C1 - - - C2 + + + C2 - - - master + + + main - - - iss53 + + + iss53 - diff --git a/images/basic-merging-2.png b/images/basic-merging-2.png index d60f46620fe63a66052393e701a30099ea87bbac..51fcee33e93a71b79d17f6ad777a0c6dcea3a1c5 100644 GIT binary patch literal 37629 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 literal 14523 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 - - - - - image/svg+xml - - images/basic-merging-2 - - - - - images/basic-merging-2 - Created with Sketch. - - - - - - - C0 + + A merge commit + + + + + + + + + + + + C0 + + + + C1 + + + + C2 + + + + C4 + + + + C3 + + + + C5 + + + + C6 + + + + main + + + + iss53 - - - C1 - - - - C2 - - - - - - - master - - - - - C4 - - - - - - C5 - - - - - - - C6 - - - - C3 - - - - - - iss53 - - - diff --git a/images/two-branches.png b/images/two-branches.png index 9cdbdccc55c4529a3a444293bd14642628d3d240..ab0e7f8b7a25aaa6e6520e4f027d99fa697a7d4c 100644 GIT binary patch literal 18073 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 Tv{&T`=&owY+De6YpS}KH!f+&# literal 36463 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%0Axb#-;q17yb(8ES_Qnz%r~@ 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 diff --git a/images/two-branches.svg b/images/two-branches.svg index ded4572..7d842b8 100644 --- a/images/two-branches.svg +++ b/images/two-branches.svg @@ -1,51 +1,28 @@ - - - - - image/svg+xml - - images/two-branches - - - - - images/two-branches - Created with Sketch. - - - - - - master - + + Two branch pointers into the commit history + + + + + + + 98ca9 - - - - - testing - + + + 34ac2 - - - - - f30ab - + + + f30ab - - - - - - - 34ac2 - + + + main - - - 98ca9 + + + testing - From a0f723a7c913a379d9d581ef8c218967a749f0e3 Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Tue, 4 Aug 2026 09:58:00 -0700 Subject: [PATCH 05/15] Add SVG-to-JSON extractor (Phase 2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bin/svg-to-figure.rb parses images/*.svg and bootstraps figures/*.json draft specs. It flattens nested SVG transforms, classifies rects by size and fill color, infers grid pitch from node center clusters, and snaps nodes to col/row coordinates. Results on all 112 non-symbols SVGs: 50 figures clean (< 3px residual) 62 figures flagged (> 3px — need manual review) Edges are not auto-detected; all figures get an empty edges array to fill. Report written to tmp/extractor-report.json (not committed). Co-Authored-By: Claude Opus 5 --- bin/svg-to-figure.rb | 398 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 398 insertions(+) create mode 100755 bin/svg-to-figure.rb diff --git a/bin/svg-to-figure.rb b/bin/svg-to-figure.rb new file mode 100755 index 0000000..86454fb --- /dev/null +++ b/bin/svg-to-figure.rb @@ -0,0 +1,398 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# svg-to-figure.rb — bootstrap JSON figure specs from existing images/*.svg +# +# Usage: +# bin/svg-to-figure.rb # process all images/*.svg +# bin/svg-to-figure.rb images/basic-branching-3.svg +# +# Outputs figures/.json for each SVG that doesn't already have one. +# Existing figures/*.json are never overwritten. +# +# Also emits tmp/extractor-report.json with per-figure residuals and TODO items +# so the review harness can order figures by difficulty. + +require 'json' +require 'rexml/document' +require 'fileutils' + +REPO_ROOT = File.expand_path('..', __dir__) +FIGURES_DIR = File.join(REPO_ROOT, 'figures') +IMAGES_DIR = File.join(REPO_ROOT, 'images') +PALETTE_FILE = File.join(FIGURES_DIR, '_palette.json') +REPORT_FILE = File.join(REPO_ROOT, 'tmp', 'extractor-report.json') + +PALETTE = JSON.parse(File.read(PALETTE_FILE)) + +# --------------------------------------------------------------------------- +# Transform math — flatten nested SVG transform attributes to absolute coords +# --------------------------------------------------------------------------- + +# Parse a single transform string into a 3x3 affine matrix [a,b,c,d,e,f] +# (same as SVG matrix(a b c d e f), applied as: x' = ax+cy+e, y' = bx+dy+f) +def parse_transform(str) + return [1,0,0,1,0,0] if str.nil? || str.strip.empty? + str = str.strip + case str + when /^translate\(\s*([-\d.]+)[\s,]+([-\d.]+)\s*\)/ + [1, 0, 0, 1, $1.to_f, $2.to_f] + when /^translate\(\s*([-\d.]+)\s*\)/ + [1, 0, 0, 1, $1.to_f, 0] + when /^scale\(\s*([-\d.]+)[\s,]+([-\d.]+)\s*\)/ + [$1.to_f, 0, 0, $2.to_f, 0, 0] + when /^scale\(\s*([-\d.]+)\s*\)/ + s = $1.to_f; [s, 0, 0, s, 0, 0] + when /^matrix\(\s*([-\d.]+)[\s,]+([-\d.]+)[\s,]+([-\d.]+)[\s,]+([-\d.]+)[\s,]+([-\d.]+)[\s,]+([-\d.]+)\s*\)/ + [$1, $2, $3, $4, $5, $6].map(&:to_f) + else + [1, 0, 0, 1, 0, 0] + end +end + +# Multiply two affine matrices +def mul_matrix(m1, m2) + a1,b1,c1,d1,e1,f1 = m1 + a2,b2,c2,d2,e2,f2 = m2 + [ + a1*a2 + c1*b2, + b1*a2 + d1*b2, + a1*c2 + c1*d2, + b1*c2 + d1*d2, + a1*e2 + c1*f2 + e1, + b1*e2 + d1*f2 + f1 + ] +end + +# Apply matrix to a point +def apply_matrix(m, x, y) + a,b,c,d,e,f = m + [a*x + c*y + e, b*x + d*y + f] +end + +# Walk the REXML tree and collect all rects/paths/texts with their absolute coords. +# Returns an array of hashes. +def collect_elements(node, parent_matrix = [1,0,0,1,0,0], results = []) + node.elements.each do |el| + local_tr = parse_transform(el.attributes['transform']) + matrix = mul_matrix(parent_matrix, local_tr) + + case el.name + when 'rect' + x = el.attributes['x'].to_f + y = el.attributes['y'].to_f + w = el.attributes['width'].to_f + h = el.attributes['height'].to_f + rx = el.attributes['rx'].to_f + style = el.attributes['style'] || '' + fill = extract_fill(el, style) + stroke = extract_stroke(el, style) + + ax, ay = apply_matrix(matrix, x, y) + # Also transform width/height to handle scale() + aw = w * matrix[0].abs + ah = h * matrix[3].abs + + results << { type: :rect, x: ax, y: ay, w: aw, h: ah, rx: rx, fill: fill, stroke: stroke, matrix: matrix } + + when 'text' + text_content = el.texts.map(&:value).join + + el.elements.map { |c| c.texts.map(&:value).join }.join + tspans = [] + el.elements.each('tspan') { |ts| tspans << ts.text.to_s.strip } + text_content = tspans.any? ? tspans.join("\n") : text_content.strip + # text position from x/y attrs or tspan + tx = (el.attributes['x'] || el.elements['tspan']&.attributes['x']).to_f + ty = (el.attributes['y'] || el.elements['tspan']&.attributes['y']).to_f + atx, aty = apply_matrix(matrix, tx, ty) + results << { type: :text, x: atx, y: aty, content: text_content, lines: tspans } + end + + collect_elements(el, matrix, results) if el.elements.size > 0 + end + results +end + +def extract_fill(el, style) + if (m = style.match(/(?:^|;)fill:\s*([^;]+)/)) + m[1].strip + elsif el.attributes['fill'] + el.attributes['fill'] + else + nil + end +end + +def extract_stroke(el, style) + if (m = style.match(/(?:^|;)stroke:\s*([^;]+)/)) + v = m[1].strip + v unless v == 'none' + elsif el.attributes['stroke'] + v = el.attributes['stroke'] + v unless v == 'none' + else + nil + end +end + +# --------------------------------------------------------------------------- +# Node classification — map (w, h, fill) → kind +# --------------------------------------------------------------------------- + +COLOR_ALIASES = { + '#efefe7' => 'commit', '#f44d27' => 'ref', '#00909a' => 'tree', + '#cd9f00' => 'blob', '#b8e986' => 'jessica', '#fcc161' => 'john', + '#deb9ff' => 'josie', 'none' => nil, '#f0f0f0' => nil +}.freeze + +# Normalise a fill value to a palette color name or nil +def classify_fill(fill_raw) + return nil unless fill_raw + f = fill_raw.downcase.strip + return nil if f == 'none' || f == 'transparent' + # Direct match + return COLOR_ALIASES[f] if COLOR_ALIASES.key?(f) + # Check palette colors + PALETTE['colors'].each do |name, hex| + return name if hex.downcase == f + end + nil +end + +def classify_rect(r) + fill_name = classify_fill(r[:fill]) + w = r[:w].round; h = r[:h].round + rx = r[:rx].round + + # Try to match palette kinds by (w, h, shape) + PALETTE['kinds'].each do |kind, spec| + kw = spec['w'].to_i; kh = spec['h'].to_i + next unless (kw - w).abs <= 2 && (kh - h).abs <= 2 + kfill = spec['fill'] + # Match by fill or shape + if fill_name && (fill_name == kfill || PALETTE['colors'][kfill] == r[:fill]&.downcase) + return kind + end + # Fallback: match by size + shape type + pill = (spec['shape'] == 'pill') + if pill && rx >= 10 && fill_name == kfill + return kind + end + end + + # Heuristic fallbacks + return 'commit' if fill_name == 'commit' || r[:fill]&.downcase == '#efefe7' + return 'ref' if fill_name == 'ref' || r[:fill]&.downcase == '#f44d27' + return 'tree' if fill_name == 'tree' || r[:fill]&.downcase == '#00909a' + return 'blob' if fill_name == 'blob' || r[:fill]&.downcase == '#cd9f00' + return 'jessica' if r[:fill]&.downcase == '#b8e986' + return 'john' if r[:fill]&.downcase == '#fcc161' + return 'josie' if r[:fill]&.downcase == '#deb9ff' + return 'other' if fill_name == 'commit' && r[:stroke] + + nil # unclassified +end + +# --------------------------------------------------------------------------- +# Grid inference — cluster x/y centers and fit a pitch +# --------------------------------------------------------------------------- + +# Cluster a sorted array of values into groups within `tolerance` +def cluster(vals, tolerance = 8.0) + return [] if vals.empty? + groups = [[vals.first]] + vals[1..].each do |v| + if v - groups.last.last <= tolerance + groups.last << v + else + groups << [v] + end + end + groups.map { |g| g.sum / g.size.to_f } +end + +# Given cluster centers, infer a grid pitch and origin +def infer_grid(centers) + return { origin: centers.first, pitch: nil } if centers.size < 2 + diffs = centers.each_cons(2).map { |a, b| b - a } + pitch = diffs.sum / diffs.size.to_f + { origin: centers.first, pitch: pitch.round(1) } +end + +# Snap a value to a grid and return (col_or_row, residual) +def snap_to_grid(val, origin, pitch) + return [0, val - origin] unless pitch && pitch > 0 + col = ((val - origin) / pitch).round + residual = val - (origin + col * pitch) + [col, residual] +end + +# --------------------------------------------------------------------------- +# Main extractor +# --------------------------------------------------------------------------- + +def extract_figure(svg_path) + name = File.basename(svg_path, '.svg') + doc = REXML::Document.new(File.read(svg_path)) + root = doc.root + + # Get the root viewBox + vb = root.attributes['viewBox'] + canvas_w, canvas_h = if vb && (m = vb.match(/[\d.]+\s+[\d.]+\s+([\d.]+)\s+([\d.]+)/)) + [m[1].to_f, m[2].to_f] + else + [nil, nil] + end + + elements = collect_elements(root) + + # Separate rects and texts + rects = elements.select { |e| e[:type] == :rect } + texts = elements.select { |e| e[:type] == :text } + + # Classify each rect to a node kind, filter out unclassified + node_rects = rects.filter_map do |r| + kind = classify_rect(r) + next unless kind + { kind: kind, x: r[:x], y: r[:y], w: r[:w], h: r[:h] } + end + + # Match each node rect to nearby text + nodes = node_rects.map.with_index do |nr, i| + cx = nr[:x] + nr[:w] / 2.0 + cy = nr[:y] + nr[:h] / 2.0 + # Find text whose absolute x is nearest the node center and y within the node + best = texts.min_by do |t| + x_dist = (t[:x] - cx).abs + in_box = t[:y] >= nr[:y] - 5 && t[:y] <= nr[:y] + nr[:h] + 5 + in_box ? x_dist : 1e9 + end + label = if best && (best[:x] - cx).abs < nr[:w] + best[:lines].size > 1 ? best[:lines] : best[:content].strip + else + "node#{i}" + end + { id: "node#{i}", kind: nr[:kind], label: label, x: nr[:x].round(2), y: nr[:y].round(2), + w: nr[:w].round(2), h: nr[:h].round(2), _cx: cx, _cy: cy } + end + + # Assign stable ids based on label content + nodes.each do |n| + lbl = Array(n[:label]).first.to_s.strip + n[:id] = lbl.gsub(/[^a-z0-9]/i, '-').downcase.gsub(/-+/, '-').gsub(/^-|-$/, '') + n[:id] = "node_#{n[:id]}" if n[:id].empty? || n[:id].match?(/^\d/) + end + # Deduplicate ids + seen = Hash.new(0) + nodes.each do |n| + count = seen[n[:id]] += 1 + n[:id] = "#{n[:id]}-#{count}" if count > 1 + end + + # Grid inference + xs = nodes.map { |n| n[:_cx] }.sort + ys = nodes.map { |n| n[:_cy] }.sort + x_centers = cluster(xs) + y_centers = cluster(ys) + x_grid = infer_grid(x_centers) + y_grid = infer_grid(y_centers) + + # Snap nodes to grid + max_residual = 0.0 + nodes.each do |n| + col, rx = snap_to_grid(n[:_cx], x_grid[:origin], x_grid[:pitch]) + row, ry = snap_to_grid(n[:_cy], y_grid[:origin], y_grid[:pitch]) + n[:col] = col; n[:row] = row + n[:dx] = rx.round(2) unless rx.abs < 0.5 + n[:dy] = ry.round(2) unless ry.abs < 0.5 + max_residual = [max_residual, rx.abs, ry.abs].max + end + + # Compute grid pitch; fall back to per-node absolute coords if no pitch + use_grid = x_grid[:pitch] && y_grid[:pitch] && nodes.size > 1 + grid_x = x_grid[:pitch]&.round(1) + grid_y = y_grid[:pitch]&.round(1) + + # Build JSON spec + json_nodes = nodes.map do |n| + nd = { 'id' => n[:id], 'kind' => n[:kind], 'label' => n[:label] } + if use_grid + nd['col'] = n[:col]; nd['row'] = n[:row] + nd['dx'] = n[:dx] if n[:dx] + nd['dy'] = n[:dy] if n[:dy] + else + nd['x'] = n[:x]; nd['y'] = n[:y] + end + nd + end + + spec = { '$schema' => './_schema.json', 'title' => name.gsub('-', ' ') } + if use_grid + spec['grid'] = { 'x' => grid_x, 'y' => grid_y } if grid_x && grid_y + else + spec['layout'] = 'absolute' + spec['canvas'] = { 'w' => canvas_w&.round(2), 'h' => canvas_h&.round(2) } + end + spec['nodes'] = json_nodes + spec['edges'] = [] # TODO: edge detection not yet implemented + + todos = [] + todos << "max grid residual #{max_residual.round(1)}px — review node positions" if max_residual > 3 + todos << "no grid pitch inferred — using absolute coords" unless use_grid + todos << "edge detection not implemented — add edges manually" + todos << "canvas size: #{canvas_w&.round}x#{canvas_h&.round}" + + { spec: spec, name: name, max_residual: max_residual.round(2), todos: todos, node_count: nodes.size } +end + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- + +FileUtils.mkdir_p(FIGURES_DIR) +FileUtils.mkdir_p(File.join(REPO_ROOT, 'tmp')) + +report_only = ARGV.delete('--report') +svg_args = ARGV.reject { |a| a.start_with?('--') } + +targets = if svg_args.empty? + Dir[File.join(IMAGES_DIR, '*.svg')].sort +else + svg_args +end +# Skip the legend/stencil sheet — it's not a figure +targets.reject! { |p| File.basename(p, '.svg') == 'symbols' } + +report = [] + +targets.each do |svg_path| + name = File.basename(svg_path, '.svg') + out_path = File.join(FIGURES_DIR, "#{name}.json") + + begin + result = extract_figure(svg_path) + report << { name: name, nodes: result[:node_count], max_residual: result[:max_residual], todos: result[:todos] } + + if File.exist?(out_path) + puts " skip #{name} (already exists, residual #{result[:max_residual]}px)" + next + end + + next if report_only + + spec = result[:spec] + json = JSON.pretty_generate(spec) + File.write(out_path, json + "\n") + flag = result[:max_residual] > 3 ? ' ⚠' : '' + puts " extracted #{name} (#{result[:node_count]} nodes, residual #{result[:max_residual]}px)#{flag}" + rescue => e + warn " ERROR #{name}: #{e.message}" + warn e.backtrace.first(3).join("\n") + report << { name: name, error: e.message } + end +end + +# Write report sorted by max_residual descending (hard cases first) +report.sort_by! { |r| -(r[:max_residual] || 999) } +File.write(REPORT_FILE, JSON.pretty_generate(report)) +puts "\nReport: #{REPORT_FILE}" From 708d53fc7e90f900ffafe3ceae25709a2bb17fc8 Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Tue, 4 Aug 2026 09:58:13 -0700 Subject: [PATCH 06/15] Add extracted draft figure JSON for all 108 remaining figures Auto-generated by bin/svg-to-figure.rb from images/*.svg. All figures have node positions; edges are empty and must be added manually. 50 figures have < 3px grid residual; 62 are flagged for position review. Co-Authored-By: Claude Opus 5 --- figures/advance-master.json | 73 ++++++++++ figures/advance-testing.json | 66 +++++++++ figures/basic-branching-3.json | 53 +++++++ figures/basic-branching-4.json | 72 ++++++++++ figures/basic-branching-5.json | 69 +++++++++ figures/basic-branching-6.json | 77 ++++++++++ figures/basic-merging-1.json | 76 ++++++++++ figures/basic-rebase-1.json | 65 +++++++++ figures/basic-rebase-2.json | 77 ++++++++++ figures/basic-rebase-3.json | 78 ++++++++++ figures/basic-rebase-4.json | 68 +++++++++ figures/benevolent-dictator.json | 76 ++++++++++ figures/branch-and-history.json | 84 +++++++++++ figures/centralized.json | 49 +++++++ figures/centralized_workflow.json | 44 ++++++ figures/checkout-master.json | 64 +++++++++ figures/clean.json | 67 +++++++++ figures/commit-and-tree.json | 46 ++++++ figures/commits-and-parents.json | 60 ++++++++ figures/data-model-1.json | 33 +++++ figures/data-model-2.json | 33 +++++ figures/data-model-3.json | 55 ++++++++ figures/data-model-4.json | 72 ++++++++++ figures/deltas.json | 130 +++++++++++++++++ figures/distributed.json | 97 +++++++++++++ figures/double-dot.json | 72 ++++++++++ figures/head-to-master.json | 57 ++++++++ figures/head-to-testing.json | 53 +++++++ figures/integration-manager.json | 95 +++++++++++++ figures/interesting-rebase-1.json | 101 +++++++++++++ figures/interesting-rebase-2.json | 114 +++++++++++++++ figures/interesting-rebase-3.json | 102 ++++++++++++++ figures/interesting-rebase-4.json | 139 ++++++++++++++++++ figures/interesting-rebase-5.json | 87 ++++++++++++ figures/large-merges-1.json | 149 ++++++++++++++++++++ figures/large-merges-2.json | 227 ++++++++++++++++++++++++++++++ figures/lifecycle.json | 40 ++++++ figures/local.json | 39 +++++ figures/lr-branches-1.json | 81 +++++++++++ figures/lr-branches-2.json | 69 +++++++++ figures/managed-team-1.json | 72 ++++++++++ figures/managed-team-2.json | 134 ++++++++++++++++++ figures/managed-team-3.json | 159 +++++++++++++++++++++ figures/managed-team-flow.json | 77 ++++++++++ figures/merging-workflows-1.json | 94 +++++++++++++ figures/merging-workflows-2.json | 114 +++++++++++++++ figures/merging-workflows-3.json | 72 ++++++++++ figures/merging-workflows-4.json | 84 +++++++++++ figures/merging-workflows-5.json | 87 ++++++++++++ figures/perils-of-rebasing-1.json | 66 +++++++++ figures/perils-of-rebasing-2.json | 129 +++++++++++++++++ figures/perils-of-rebasing-3.json | 145 +++++++++++++++++++ figures/perils-of-rebasing-4.json | 153 ++++++++++++++++++++ figures/perils-of-rebasing-5.json | 116 +++++++++++++++ figures/public-small-1.json | 90 ++++++++++++ figures/public-small-2.json | 90 ++++++++++++ figures/public-small-3.json | 106 ++++++++++++++ figures/rebasing-1.json | 65 +++++++++ figures/rebasing-2.json | 75 ++++++++++ figures/remote-branches-1.json | 81 +++++++++++ figures/remote-branches-2.json | 123 ++++++++++++++++ figures/remote-branches-3.json | 131 +++++++++++++++++ figures/remote-branches-4.json | 150 ++++++++++++++++++++ figures/remote-branches-5.json | 159 +++++++++++++++++++++ figures/replace1.json | 54 +++++++ figures/replace2.json | 61 ++++++++ figures/replace3.json | 74 ++++++++++ figures/replace4.json | 91 ++++++++++++ figures/replace5.json | 87 ++++++++++++ figures/rerere1.json | 49 +++++++ figures/rerere2.json | 57 ++++++++ figures/rerere3.json | 106 ++++++++++++++ figures/reset-checkout.json | 140 ++++++++++++++++++ figures/reset-ex1.json | 64 +++++++++ figures/reset-ex2.json | 73 ++++++++++ figures/reset-ex3.json | 91 ++++++++++++ figures/reset-ex4.json | 91 ++++++++++++ figures/reset-ex5.json | 91 ++++++++++++ figures/reset-ex6.json | 104 ++++++++++++++ figures/reset-hard.json | 103 ++++++++++++++ figures/reset-mixed.json | 93 ++++++++++++ figures/reset-path1.json | 91 ++++++++++++ figures/reset-path2.json | 81 +++++++++++ figures/reset-path3.json | 91 ++++++++++++ figures/reset-soft.json | 85 +++++++++++ figures/reset-squash-r1.json | 138 ++++++++++++++++++ figures/reset-squash-r2.json | 153 ++++++++++++++++++++ figures/reset-squash-r3.json | 152 ++++++++++++++++++++ figures/reset-start.json | 77 ++++++++++ figures/reset-workflow.json | 36 +++++ figures/small-team-1.json | 57 ++++++++ figures/small-team-2.json | 65 +++++++++ figures/small-team-3.json | 65 +++++++++ figures/small-team-4.json | 74 ++++++++++ figures/small-team-5.json | 96 +++++++++++++ figures/small-team-6.json | 110 +++++++++++++++ figures/small-team-7.json | 109 ++++++++++++++ figures/small-team-flow.json | 57 ++++++++ figures/smudge.json | 67 +++++++++ figures/snapshots.json | 169 ++++++++++++++++++++++ figures/symbols.json | 197 ++++++++++++++++++++++++++ figures/topic-branches-1.json | 152 ++++++++++++++++++++ figures/topic-branches-2.json | 151 ++++++++++++++++++++ figures/undomerge-reset.json | 84 +++++++++++ figures/undomerge-revert.json | 94 +++++++++++++ figures/undomerge-revert2.json | 105 ++++++++++++++ figures/undomerge-revert3.json | 112 +++++++++++++++ figures/undomerge-start.json | 82 +++++++++++ 108 files changed, 9860 insertions(+) create mode 100644 figures/advance-master.json create mode 100644 figures/advance-testing.json create mode 100644 figures/basic-branching-3.json create mode 100644 figures/basic-branching-4.json create mode 100644 figures/basic-branching-5.json create mode 100644 figures/basic-branching-6.json create mode 100644 figures/basic-merging-1.json create mode 100644 figures/basic-rebase-1.json create mode 100644 figures/basic-rebase-2.json create mode 100644 figures/basic-rebase-3.json create mode 100644 figures/basic-rebase-4.json create mode 100644 figures/benevolent-dictator.json create mode 100644 figures/branch-and-history.json create mode 100644 figures/centralized.json create mode 100644 figures/centralized_workflow.json create mode 100644 figures/checkout-master.json create mode 100644 figures/clean.json create mode 100644 figures/commit-and-tree.json create mode 100644 figures/commits-and-parents.json create mode 100644 figures/data-model-1.json create mode 100644 figures/data-model-2.json create mode 100644 figures/data-model-3.json create mode 100644 figures/data-model-4.json create mode 100644 figures/deltas.json create mode 100644 figures/distributed.json create mode 100644 figures/double-dot.json create mode 100644 figures/head-to-master.json create mode 100644 figures/head-to-testing.json create mode 100644 figures/integration-manager.json create mode 100644 figures/interesting-rebase-1.json create mode 100644 figures/interesting-rebase-2.json create mode 100644 figures/interesting-rebase-3.json create mode 100644 figures/interesting-rebase-4.json create mode 100644 figures/interesting-rebase-5.json create mode 100644 figures/large-merges-1.json create mode 100644 figures/large-merges-2.json create mode 100644 figures/lifecycle.json create mode 100644 figures/local.json create mode 100644 figures/lr-branches-1.json create mode 100644 figures/lr-branches-2.json create mode 100644 figures/managed-team-1.json create mode 100644 figures/managed-team-2.json create mode 100644 figures/managed-team-3.json create mode 100644 figures/managed-team-flow.json create mode 100644 figures/merging-workflows-1.json create mode 100644 figures/merging-workflows-2.json create mode 100644 figures/merging-workflows-3.json create mode 100644 figures/merging-workflows-4.json create mode 100644 figures/merging-workflows-5.json create mode 100644 figures/perils-of-rebasing-1.json create mode 100644 figures/perils-of-rebasing-2.json create mode 100644 figures/perils-of-rebasing-3.json create mode 100644 figures/perils-of-rebasing-4.json create mode 100644 figures/perils-of-rebasing-5.json create mode 100644 figures/public-small-1.json create mode 100644 figures/public-small-2.json create mode 100644 figures/public-small-3.json create mode 100644 figures/rebasing-1.json create mode 100644 figures/rebasing-2.json create mode 100644 figures/remote-branches-1.json create mode 100644 figures/remote-branches-2.json create mode 100644 figures/remote-branches-3.json create mode 100644 figures/remote-branches-4.json create mode 100644 figures/remote-branches-5.json create mode 100644 figures/replace1.json create mode 100644 figures/replace2.json create mode 100644 figures/replace3.json create mode 100644 figures/replace4.json create mode 100644 figures/replace5.json create mode 100644 figures/rerere1.json create mode 100644 figures/rerere2.json create mode 100644 figures/rerere3.json create mode 100644 figures/reset-checkout.json create mode 100644 figures/reset-ex1.json create mode 100644 figures/reset-ex2.json create mode 100644 figures/reset-ex3.json create mode 100644 figures/reset-ex4.json create mode 100644 figures/reset-ex5.json create mode 100644 figures/reset-ex6.json create mode 100644 figures/reset-hard.json create mode 100644 figures/reset-mixed.json create mode 100644 figures/reset-path1.json create mode 100644 figures/reset-path2.json create mode 100644 figures/reset-path3.json create mode 100644 figures/reset-soft.json create mode 100644 figures/reset-squash-r1.json create mode 100644 figures/reset-squash-r2.json create mode 100644 figures/reset-squash-r3.json create mode 100644 figures/reset-start.json create mode 100644 figures/reset-workflow.json create mode 100644 figures/small-team-1.json create mode 100644 figures/small-team-2.json create mode 100644 figures/small-team-3.json create mode 100644 figures/small-team-4.json create mode 100644 figures/small-team-5.json create mode 100644 figures/small-team-6.json create mode 100644 figures/small-team-7.json create mode 100644 figures/small-team-flow.json create mode 100644 figures/smudge.json create mode 100644 figures/snapshots.json create mode 100644 figures/symbols.json create mode 100644 figures/topic-branches-1.json create mode 100644 figures/topic-branches-2.json create mode 100644 figures/undomerge-reset.json create mode 100644 figures/undomerge-revert.json create mode 100644 figures/undomerge-revert2.json create mode 100644 figures/undomerge-revert3.json create mode 100644 figures/undomerge-start.json diff --git a/figures/advance-master.json b/figures/advance-master.json new file mode 100644 index 0000000..f86cefc --- /dev/null +++ b/figures/advance-master.json @@ -0,0 +1,73 @@ +{ + "$schema": "./_schema.json", + "title": "advance master", + "grid": { + "x": 144.9, + "y": 50.0 + }, + "nodes": [ + { + "id": "f30ab", + "kind": "commit", + "label": "f30ab", + "col": 2, + "row": 3, + "dy": 5.0 + }, + { + "id": "node_34ac2", + "kind": "commit", + "label": "34ac2", + "col": 1, + "row": 3, + "dy": 5.0 + }, + { + "id": "node_98ca9", + "kind": "commit", + "label": "98ca9", + "col": 0, + "row": 3, + "dy": 5.0 + }, + { + "id": "node_87ab2", + "kind": "commit", + "label": "87ab2", + "col": 3, + "row": 4, + "dy": -12.0 + }, + { + "id": "c2b9e", + "kind": "commit", + "label": "c2b9e", + "col": 3, + "row": 2, + "dy": 22.0 + }, + { + "id": "testing", + "kind": "ref", + "label": "testing", + "col": 3, + "row": 5 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 1, + "dy": 11.0 + }, + { + "id": "head", + "kind": "blob", + "label": "HEAD", + "col": 3, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/advance-testing.json b/figures/advance-testing.json new file mode 100644 index 0000000..1f9d93b --- /dev/null +++ b/figures/advance-testing.json @@ -0,0 +1,66 @@ +{ + "$schema": "./_schema.json", + "title": "advance testing", + "grid": { + "x": 89.1, + "y": 61.3 + }, + "nodes": [ + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 0, + "dx": 32.7 + }, + { + "id": "f30ab", + "kind": "commit", + "label": "f30ab", + "col": 3, + "row": 1, + "dx": 22.7 + }, + { + "id": "node_87ab2", + "kind": "commit", + "label": "87ab2", + "col": 5, + "row": 1, + "dx": -10.5 + }, + { + "id": "node_34ac2", + "kind": "commit", + "label": "34ac2", + "col": 2, + "row": 1, + "dx": -33.2 + }, + { + "id": "node_98ca9", + "kind": "commit", + "label": "98ca9", + "col": 0, + "row": 1 + }, + { + "id": "testing", + "kind": "ref", + "label": "testing", + "col": 5, + "row": 2, + "dx": -0.5 + }, + { + "id": "head", + "kind": "goldref", + "label": "HEAD", + "col": 5, + "row": 3, + "dx": 0.5 + } + ], + "edges": [] +} diff --git a/figures/basic-branching-3.json b/figures/basic-branching-3.json new file mode 100644 index 0000000..312ffde --- /dev/null +++ b/figures/basic-branching-3.json @@ -0,0 +1,53 @@ +{ + "$schema": "./_schema.json", + "title": "basic branching 3", + "grid": { + "x": 127.0, + "y": 62.0 + }, + "nodes": [ + { + "id": "c0", + "kind": "commit", + "label": "C0", + "col": 0, + "row": 1 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 1, + "row": 1 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 2, + "row": 1 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 3, + "row": 1 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 0 + }, + { + "id": "iss53", + "kind": "ref", + "label": "iss53", + "col": 3, + "row": 2 + } + ], + "edges": [] +} diff --git a/figures/basic-branching-4.json b/figures/basic-branching-4.json new file mode 100644 index 0000000..384f194 --- /dev/null +++ b/figures/basic-branching-4.json @@ -0,0 +1,72 @@ +{ + "$schema": "./_schema.json", + "title": "basic branching 4", + "grid": { + "x": 127.0, + "y": 60.7 + }, + "nodes": [ + { + "id": "c0", + "kind": "commit", + "label": "C0", + "col": 0, + "row": 1, + "dy": 1.3 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 1, + "row": 1, + "dy": 1.3 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 2, + "row": 1, + "dy": 1.3 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 0 + }, + { + "id": "hotfix", + "kind": "ref", + "label": "hotfix", + "col": 3, + "row": 0 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 1, + "dy": 1.3 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 3, + "row": 2, + "dy": -1.4 + }, + { + "id": "iss53", + "kind": "ref", + "label": "iss53", + "col": 3, + "row": 3 + } + ], + "edges": [] +} diff --git a/figures/basic-branching-5.json b/figures/basic-branching-5.json new file mode 100644 index 0000000..25ddbf2 --- /dev/null +++ b/figures/basic-branching-5.json @@ -0,0 +1,69 @@ +{ + "$schema": "./_schema.json", + "title": "basic branching 5", + "grid": { + "x": 127.0, + "y": 60.0 + }, + "nodes": [ + { + "id": "c0", + "kind": "commit", + "label": "C0", + "col": 0, + "row": 2 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 1, + "row": 2 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 2, + "row": 2 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 0 + }, + { + "id": "hotfix", + "kind": "ref", + "label": "hotfix", + "col": 3, + "row": 1, + "dy": -2.0 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 2 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 3, + "row": 3, + "dy": -2.0 + }, + { + "id": "iss53", + "kind": "ref", + "label": "iss53", + "col": 3, + "row": 4 + } + ], + "edges": [] +} diff --git a/figures/basic-branching-6.json b/figures/basic-branching-6.json new file mode 100644 index 0000000..6cb8762 --- /dev/null +++ b/figures/basic-branching-6.json @@ -0,0 +1,77 @@ +{ + "$schema": "./_schema.json", + "title": "basic branching 6", + "grid": { + "x": 126.7, + "y": 60.7 + }, + "nodes": [ + { + "id": "c0", + "kind": "commit", + "label": "C0", + "col": 0, + "row": 1, + "dy": 1.3 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 1, + "row": 1, + "dy": 1.3 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 2, + "row": 1, + "dx": 0.6, + "dy": 1.3 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 0, + "dx": 0.9 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 1, + "dx": 0.9, + "dy": 1.3 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 4, + "row": 2, + "dy": -1.4 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 3, + "row": 2, + "dx": 0.9, + "dy": -1.4 + }, + { + "id": "iss53", + "kind": "ref", + "label": "iss53", + "col": 4, + "row": 3 + } + ], + "edges": [] +} diff --git a/figures/basic-merging-1.json b/figures/basic-merging-1.json new file mode 100644 index 0000000..271073e --- /dev/null +++ b/figures/basic-merging-1.json @@ -0,0 +1,76 @@ +{ + "$schema": "./_schema.json", + "title": "basic merging 1", + "grid": { + "x": 126.8, + "y": 60.7 + }, + "nodes": [ + { + "id": "c0", + "kind": "commit", + "label": "C0", + "col": 0, + "row": 1, + "dy": 1.3 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 1, + "row": 1, + "dy": 1.3 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 2, + "row": 1, + "dy": 1.3 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 0, + "dx": 0.6 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 1, + "dx": 0.6, + "dy": 1.3 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 4, + "row": 2, + "dy": -1.4 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 3, + "row": 2, + "dx": 0.6, + "dy": -1.4 + }, + { + "id": "iss53", + "kind": "ref", + "label": "iss53", + "col": 4, + "row": 3 + } + ], + "edges": [] +} diff --git a/figures/basic-rebase-1.json b/figures/basic-rebase-1.json new file mode 100644 index 0000000..63f92a0 --- /dev/null +++ b/figures/basic-rebase-1.json @@ -0,0 +1,65 @@ +{ + "$schema": "./_schema.json", + "title": "basic rebase 1", + "grid": { + "x": 127.3, + "y": 60.2 + }, + "nodes": [ + { + "id": "c0", + "kind": "commit", + "label": "C0", + "col": 0, + "row": 2, + "dy": -1.9 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 1, + "row": 2, + "dy": -1.9 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 2, + "row": 2, + "dx": -0.6, + "dy": -1.9 + }, + { + "id": "experiment", + "kind": "ref", + "label": "experiment", + "col": 3, + "row": 0 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 1 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 3, + "row": 2, + "dy": -1.9 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 3 + } + ], + "edges": [] +} diff --git a/figures/basic-rebase-2.json b/figures/basic-rebase-2.json new file mode 100644 index 0000000..162da09 --- /dev/null +++ b/figures/basic-rebase-2.json @@ -0,0 +1,77 @@ +{ + "$schema": "./_schema.json", + "title": "basic rebase 2", + "grid": { + "x": 127.5, + "y": 60.2 + }, + "nodes": [ + { + "id": "c0", + "kind": "commit", + "label": "C0", + "col": 0, + "row": 2, + "dy": -1.9 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 1, + "row": 2, + "dx": -0.5, + "dy": -1.9 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 2, + "row": 2, + "dx": -1.0, + "dy": -1.9 + }, + { + "id": "experiment", + "kind": "ref", + "label": "experiment", + "col": 3, + "row": 0, + "dx": -0.5 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 1, + "dx": -0.5 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 3, + "row": 2, + "dx": -0.5, + "dy": -1.9 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 4, + "row": 2, + "dy": -1.9 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 4, + "row": 3 + } + ], + "edges": [] +} diff --git a/figures/basic-rebase-3.json b/figures/basic-rebase-3.json new file mode 100644 index 0000000..28861d5 --- /dev/null +++ b/figures/basic-rebase-3.json @@ -0,0 +1,78 @@ +{ + "$schema": "./_schema.json", + "title": "basic rebase 3", + "grid": { + "x": 127.5, + "y": 60.6 + }, + "nodes": [ + { + "id": "c0", + "kind": "commit", + "label": "C0", + "col": 0, + "row": 1, + "dy": -1.35 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 1, + "row": 1, + "dx": -0.5, + "dy": -1.35 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 2, + "row": 1, + "dx": -1.0, + "dy": -1.35 + }, + { + "id": "experiment", + "kind": "ref", + "label": "experiment", + "col": 4, + "row": 0, + "dy": -1.25 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 0, + "dx": -0.5, + "dy": 1.25 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 3, + "row": 1, + "dx": -0.5, + "dy": -1.35 + }, + { + "id": "c4-2", + "kind": "commit", + "label": "C4'", + "col": 4, + "row": 1, + "dy": -1.35 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 2 + } + ], + "edges": [] +} diff --git a/figures/basic-rebase-4.json b/figures/basic-rebase-4.json new file mode 100644 index 0000000..95aee0d --- /dev/null +++ b/figures/basic-rebase-4.json @@ -0,0 +1,68 @@ +{ + "$schema": "./_schema.json", + "title": "basic rebase 4", + "grid": { + "x": 127.5, + "y": 61.3 + }, + "nodes": [ + { + "id": "c0", + "kind": "commit", + "label": "C0", + "col": 0, + "row": 1, + "dy": -0.8 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 1, + "row": 1, + "dx": -0.5, + "dy": -0.8 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 2, + "row": 1, + "dx": -1.0, + "dy": -0.8 + }, + { + "id": "experiment", + "kind": "ref", + "label": "experiment", + "col": 4, + "row": 0 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 3, + "row": 1, + "dx": -0.5, + "dy": -0.8 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4'", + "col": 4, + "row": 1, + "dy": -0.8 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 4, + "row": 2 + } + ], + "edges": [] +} diff --git a/figures/benevolent-dictator.json b/figures/benevolent-dictator.json new file mode 100644 index 0000000..50075b9 --- /dev/null +++ b/figures/benevolent-dictator.json @@ -0,0 +1,76 @@ +{ + "$schema": "./_schema.json", + "title": "benevolent dictator", + "grid": { + "x": 68.7, + "y": 77.9 + }, + "nodes": [ + { + "id": "lieutenant", + "kind": "symref", + "label": "lieutenant", + "col": 0, + "row": 1 + }, + { + "id": "lieutenant-2", + "kind": "symref", + "label": "lieutenant", + "col": 1, + "row": 1, + "dx": 29.66 + }, + { + "id": "developer", + "kind": "commit", + "label": [ + "developer", + "public" + ], + "col": 0, + "row": 2 + }, + { + "id": "dictator", + "kind": "ref", + "label": "dictator", + "col": 0, + "row": 0, + "dx": 11.36, + "dy": 1.25 + }, + { + "id": "developer-2", + "kind": "commit", + "label": [ + "developer", + "public" + ], + "col": 2, + "row": 2 + }, + { + "id": "developer-3", + "kind": "commit", + "label": [ + "developer", + "public" + ], + "col": 4, + "row": 2 + }, + { + "id": "blessed", + "kind": "blob", + "label": [ + "blessed", + "repository" + ], + "col": 4, + "row": 0, + "dy": -1.25 + } + ], + "edges": [] +} diff --git a/figures/branch-and-history.json b/figures/branch-and-history.json new file mode 100644 index 0000000..9caa6f3 --- /dev/null +++ b/figures/branch-and-history.json @@ -0,0 +1,84 @@ +{ + "$schema": "./_schema.json", + "title": "branch and history", + "grid": { + "x": 88.3, + "y": 62.7 + }, + "nodes": [ + { + "id": "snapshot-c", + "kind": "symref", + "label": "Snapshot C", + "col": 3, + "row": 3, + "dx": 25.1 + }, + { + "id": "snapshot-b", + "kind": "symref", + "label": "Snapshot B", + "col": 2, + "row": 3, + "dx": -31.6 + }, + { + "id": "snapshot-a", + "kind": "symref", + "label": "Snapshot A", + "col": 0, + "row": 3 + }, + { + "id": "f30ab", + "kind": "commit", + "label": "f30ab", + "col": 3, + "row": 2, + "dx": 25.1, + "dy": -9.4 + }, + { + "id": "node_34ac2", + "kind": "commit", + "label": "34ac2", + "col": 2, + "row": 2, + "dx": -31.6, + "dy": -9.4 + }, + { + "id": "node_98ca9", + "kind": "commit", + "label": "98ca9", + "col": 0, + "row": 2, + "dy": -9.4 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 4, + "row": 1, + "dy": -8.7 + }, + { + "id": "head", + "kind": "goldref", + "label": "HEAD", + "col": 4, + "row": 0 + }, + { + "id": "v1-0", + "kind": "ref", + "label": "v1.0", + "col": 3, + "row": 1, + "dx": -23.9, + "dy": -8.7 + } + ], + "edges": [] +} diff --git a/figures/centralized.json b/figures/centralized.json new file mode 100644 index 0000000..40518d4 --- /dev/null +++ b/figures/centralized.json @@ -0,0 +1,49 @@ +{ + "$schema": "./_schema.json", + "title": "centralized", + "grid": { + "x": 225.0, + "y": 42.5 + }, + "nodes": [ + { + "id": "node0", + "kind": "tree", + "label": "node0", + "col": 0, + "row": 0 + }, + { + "id": "node1", + "kind": "commit", + "label": "node1", + "col": 1, + "row": 1, + "dy": -9.0 + }, + { + "id": "node2", + "kind": "commit", + "label": "node2", + "col": 1, + "row": 2, + "dy": 8.5 + }, + { + "id": "node3", + "kind": "commit", + "label": "node3", + "col": 1, + "row": 4, + "dy": -16.5 + }, + { + "id": "file", + "kind": "tree", + "label": "File", + "col": 0, + "row": 4 + } + ], + "edges": [] +} diff --git a/figures/centralized_workflow.json b/figures/centralized_workflow.json new file mode 100644 index 0000000..1a3a293 --- /dev/null +++ b/figures/centralized_workflow.json @@ -0,0 +1,44 @@ +{ + "$schema": "./_schema.json", + "title": "centralized_workflow", + "grid": { + "x": 106.8, + "y": 81.5 + }, + "nodes": [ + { + "id": "developer", + "kind": "ref", + "label": "developer", + "col": 1, + "row": 1, + "dx": -0.8 + }, + { + "id": "developer-2", + "kind": "ref", + "label": "developer", + "col": 0, + "row": 1 + }, + { + "id": "developer-3", + "kind": "ref", + "label": "developer", + "col": 2, + "row": 1 + }, + { + "id": "shared", + "kind": "blob", + "label": [ + "shared", + "repository" + ], + "col": 1, + "row": 0, + "dx": -0.8 + } + ], + "edges": [] +} diff --git a/figures/checkout-master.json b/figures/checkout-master.json new file mode 100644 index 0000000..a3a764f --- /dev/null +++ b/figures/checkout-master.json @@ -0,0 +1,64 @@ +{ + "$schema": "./_schema.json", + "title": "checkout master", + "grid": { + "x": 145.0, + "y": 61.3 + }, + "nodes": [ + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 1 + }, + { + "id": "f30ab", + "kind": "commit", + "label": "f30ab", + "col": 2, + "row": 2, + "dy": -0.6 + }, + { + "id": "node_87ab2", + "kind": "commit", + "label": "87ab2", + "col": 3, + "row": 2, + "dy": -0.6 + }, + { + "id": "node_34ac2", + "kind": "commit", + "label": "34ac2", + "col": 1, + "row": 2, + "dy": -0.6 + }, + { + "id": "node_98ca9", + "kind": "commit", + "label": "98ca9", + "col": 0, + "row": 2, + "dy": -0.6 + }, + { + "id": "testing", + "kind": "ref", + "label": "testing", + "col": 3, + "row": 3 + }, + { + "id": "head", + "kind": "blob", + "label": "HEAD", + "col": 2, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/clean.json b/figures/clean.json new file mode 100644 index 0000000..ae6499a --- /dev/null +++ b/figures/clean.json @@ -0,0 +1,67 @@ +{ + "$schema": "./_schema.json", + "title": "clean", + "grid": { + "x": 150.0, + "y": 53.0 + }, + "nodes": [ + { + "id": "filea-txt", + "kind": "commit", + "label": "fileA.txt", + "col": 0, + "row": 0 + }, + { + "id": "filea-txt-2", + "kind": "blob", + "label": "fileA.txt'", + "col": 2, + "row": 0 + }, + { + "id": "fileb-txt", + "kind": "blob", + "label": "fileB.txt'", + "col": 2, + "row": 1 + }, + { + "id": "fileb-txt-2", + "kind": "commit", + "label": "fileB.txt", + "col": 0, + "row": 1 + }, + { + "id": "filec-rb", + "kind": "commit", + "label": "fileC.rb", + "col": 0, + "row": 2 + }, + { + "id": "filec-rb-2", + "kind": "commit", + "label": "fileC.rb", + "col": 2, + "row": 2 + }, + { + "id": "smudge", + "kind": "ref", + "label": "smudge", + "col": 1, + "row": 0 + }, + { + "id": "clean", + "kind": "ref", + "label": "clean", + "col": 1, + "row": 1 + } + ], + "edges": [] +} diff --git a/figures/commit-and-tree.json b/figures/commit-and-tree.json new file mode 100644 index 0000000..5b42bcc --- /dev/null +++ b/figures/commit-and-tree.json @@ -0,0 +1,46 @@ +{ + "$schema": "./_schema.json", + "title": "commit and tree", + "grid": { + "x": 268.0, + "y": 146.0 + }, + "nodes": [ + { + "id": "node_92ec2", + "kind": "tree", + "label": "92ec2", + "col": 1, + "row": 1 + }, + { + "id": "the-initial-commit-of-my-project", + "kind": "commit", + "label": "The initial commit of my project", + "col": 0, + "row": 1 + }, + { + "id": "node_5b1d3", + "kind": "blob", + "label": "5b1d3", + "col": 2, + "row": 0 + }, + { + "id": "node_911e7", + "kind": "blob", + "label": "911e7", + "col": 2, + "row": 1 + }, + { + "id": "cba0a", + "kind": "blob", + "label": "cba0a", + "col": 2, + "row": 2 + } + ], + "edges": [] +} diff --git a/figures/commits-and-parents.json b/figures/commits-and-parents.json new file mode 100644 index 0000000..2fcc0cf --- /dev/null +++ b/figures/commits-and-parents.json @@ -0,0 +1,60 @@ +{ + "$schema": "./_schema.json", + "title": "commits and parents", + "grid": { + "x": 284.5, + "y": 143.0 + }, + "nodes": [ + { + "id": "snapshot-a", + "kind": "tree", + "label": "Snapshot A", + "col": 0, + "row": 1 + }, + { + "id": "snapshot-b", + "kind": "tree", + "label": "Snapshot B", + "col": 1, + "row": 1, + "dx": -0.75 + }, + { + "id": "snapshot-c", + "kind": "tree", + "label": "Snapshot C", + "col": 2, + "row": 1 + }, + { + "id": "fixed-bug-1328-stack-overflow", + "kind": "commit", + "label": [ + "Fixed bug #1328 - stack overflow", + "under certain conditions" + ], + "col": 1, + "row": 0 + }, + { + "id": "the-initial-commit-of-my-project", + "kind": "commit", + "label": "The initial commit of my project", + "col": 0, + "row": 0 + }, + { + "id": "add-feature-32-ability-to-add-new", + "kind": "commit", + "label": [ + "add feature #32 - ability to add new", + "formats to the central interface" + ], + "col": 2, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/data-model-1.json b/figures/data-model-1.json new file mode 100644 index 0000000..d187fb5 --- /dev/null +++ b/figures/data-model-1.json @@ -0,0 +1,33 @@ +{ + "$schema": "./_schema.json", + "title": "data model 1", + "grid": { + "x": 113.5, + "y": 90.0 + }, + "nodes": [ + { + "id": "blob", + "kind": "commit", + "label": "blob", + "col": 1, + "row": 0, + "dx": 1.5 + }, + { + "id": "blob-2", + "kind": "commit", + "label": "blob", + "col": 0, + "row": 0 + }, + { + "id": "blob-3", + "kind": "commit", + "label": "blob", + "col": 2, + "row": 1 + } + ], + "edges": [] +} diff --git a/figures/data-model-2.json b/figures/data-model-2.json new file mode 100644 index 0000000..4af6200 --- /dev/null +++ b/figures/data-model-2.json @@ -0,0 +1,33 @@ +{ + "$schema": "./_schema.json", + "title": "data model 2", + "grid": { + "x": 115.5, + "y": 88.8 + }, + "nodes": [ + { + "id": "version-2", + "kind": "commit", + "label": "\"version 2\"", + "col": 1, + "row": 0, + "dx": -0.5 + }, + { + "id": "new-file", + "kind": "commit", + "label": "\"new file\"", + "col": 0, + "row": 0 + }, + { + "id": "version-1", + "kind": "commit", + "label": "\"version 1\"", + "col": 2, + "row": 1 + } + ], + "edges": [] +} diff --git a/figures/data-model-3.json b/figures/data-model-3.json new file mode 100644 index 0000000..5ea581a --- /dev/null +++ b/figures/data-model-3.json @@ -0,0 +1,55 @@ +{ + "$schema": "./_schema.json", + "title": "data model 3", + "grid": { + "x": 329.5, + "y": 58.0 + }, + "nodes": [ + { + "id": "version-2", + "kind": "commit", + "label": "\"version 2\"", + "col": 1, + "row": 1, + "dy": 15.0 + }, + { + "id": "new-file", + "kind": "commit", + "label": "\"new file\"", + "col": 1, + "row": 3, + "dy": -23.0 + }, + { + "id": "version-1", + "kind": "commit", + "label": "\"version 1\"", + "col": 1, + "row": 4 + }, + { + "id": "third-commit", + "kind": "blob", + "label": "third commit", + "col": 0, + "row": 0 + }, + { + "id": "second-commit", + "kind": "blob", + "label": "second commit", + "col": 0, + "row": 2 + }, + { + "id": "first-commit", + "kind": "blob", + "label": "first commit", + "col": 0, + "row": 4 + } + ], + "edges": [] +} diff --git a/figures/data-model-4.json b/figures/data-model-4.json new file mode 100644 index 0000000..e755095 --- /dev/null +++ b/figures/data-model-4.json @@ -0,0 +1,72 @@ +{ + "$schema": "./_schema.json", + "title": "data model 4", + "grid": { + "x": 252.0, + "y": 58.0 + }, + "nodes": [ + { + "id": "version-2", + "kind": "commit", + "label": "\"version 2\"", + "col": 2, + "row": 1, + "dy": 15.0 + }, + { + "id": "new-file", + "kind": "commit", + "label": "\"new file\"", + "col": 2, + "row": 3, + "dy": -23.0 + }, + { + "id": "version-1", + "kind": "commit", + "label": "\"version 1\"", + "col": 2, + "row": 4 + }, + { + "id": "third-commit", + "kind": "blob", + "label": "third commit", + "col": 1, + "row": 0, + "dx": -77.5 + }, + { + "id": "second-commit", + "kind": "blob", + "label": "second commit", + "col": 1, + "row": 2, + "dx": -77.5 + }, + { + "id": "first-commit", + "kind": "blob", + "label": "first commit", + "col": 1, + "row": 4, + "dx": -77.49 + }, + { + "id": "refs-heads-test", + "kind": "ref", + "label": "refs/heads/test", + "col": 0, + "row": 2 + }, + { + "id": "refs-heads-master", + "kind": "ref", + "label": "refs/heads/master", + "col": 0, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/deltas.json b/figures/deltas.json new file mode 100644 index 0000000..d53d676 --- /dev/null +++ b/figures/deltas.json @@ -0,0 +1,130 @@ +{ + "$schema": "./_schema.json", + "title": "deltas", + "grid": { + "x": 116.0, + "y": 52.3 + }, + "nodes": [ + { + "id": "version-1", + "kind": "blob", + "label": "Version 1", + "col": 0, + "row": 0 + }, + { + "id": "version-2", + "kind": "blob", + "label": "Version 2", + "col": 1, + "row": 0 + }, + { + "id": "version-3", + "kind": "blob", + "label": "Version 3", + "col": 2, + "row": 0 + }, + { + "id": "version-4", + "kind": "blob", + "label": "Version 4", + "col": 3, + "row": 0 + }, + { + "id": "version-5", + "kind": "blob", + "label": "Version 5", + "col": 4, + "row": 0 + }, + { + "id": "file-a", + "kind": "commit", + "label": "File A", + "col": 0, + "row": 1, + "dy": 6.7 + }, + { + "id": "file-a-2", + "kind": "commit", + "label": "File A", + "col": 0, + "row": 1, + "dy": 6.7 + }, + { + "id": "node_1", + "kind": "commit", + "label": "Δ1", + "col": 1, + "row": 1, + "dy": 6.7 + }, + { + "id": "node_1-2", + "kind": "commit", + "label": "Δ1", + "col": 1, + "row": 3 + }, + { + "id": "node_2", + "kind": "commit", + "label": "Δ2", + "col": 2, + "row": 3 + }, + { + "id": "node_1-3", + "kind": "commit", + "label": "Δ1", + "col": 3, + "row": 2, + "dy": 3.4 + }, + { + "id": "node_2-2", + "kind": "commit", + "label": "Δ2", + "col": 3, + "row": 1, + "dy": 6.7 + }, + { + "id": "node_2-3", + "kind": "commit", + "label": "Δ2", + "col": 4, + "row": 2, + "dy": 3.4 + }, + { + "id": "node_3", + "kind": "commit", + "label": "Δ3", + "col": 4, + "row": 3 + }, + { + "id": "file-b", + "kind": "commit", + "label": "File B", + "col": 0, + "row": 2, + "dy": 3.4 + }, + { + "id": "file-c", + "kind": "commit", + "label": "File C", + "col": 0, + "row": 3 + } + ], + "edges": [] +} diff --git a/figures/distributed.json b/figures/distributed.json new file mode 100644 index 0000000..53b281a --- /dev/null +++ b/figures/distributed.json @@ -0,0 +1,97 @@ +{ + "$schema": "./_schema.json", + "title": "distributed", + "grid": { + "x": 146.4, + "y": 71.2 + }, + "nodes": [ + { + "id": "version-3", + "kind": "commit", + "label": "Version 3", + "col": 1, + "row": 0 + }, + { + "id": "version-2", + "kind": "commit", + "label": "Version 2", + "col": 1, + "row": 1, + "dy": -29.2 + }, + { + "id": "version-1", + "kind": "commit", + "label": "Version 1", + "col": 1, + "row": 1, + "dy": 12.8 + }, + { + "id": "version-3-2", + "kind": "commit", + "label": "Version 3", + "col": 0, + "row": 5, + "dy": -13.0 + }, + { + "id": "version-2-2", + "kind": "commit", + "label": "Version 2", + "col": 0, + "row": 5, + "dy": 29.0 + }, + { + "id": "version-1-2", + "kind": "commit", + "label": "Version 1", + "col": 0, + "row": 6 + }, + { + "id": "file", + "kind": "tree", + "label": "File", + "col": 0, + "row": 4, + "dy": -29.8 + }, + { + "id": "version-3-3", + "kind": "commit", + "label": "Version 3", + "col": 2, + "row": 5, + "dy": -13.0 + }, + { + "id": "version-2-3", + "kind": "commit", + "label": "Version 2", + "col": 2, + "row": 5, + "dy": 29.0 + }, + { + "id": "version-1-3", + "kind": "commit", + "label": "Version 1", + "col": 2, + "row": 6 + }, + { + "id": "file-2", + "kind": "tree", + "label": "File", + "col": 2, + "row": 4, + "dx": -0.8, + "dy": -29.8 + } + ], + "edges": [] +} diff --git a/figures/double-dot.json b/figures/double-dot.json new file mode 100644 index 0000000..4c59e3e --- /dev/null +++ b/figures/double-dot.json @@ -0,0 +1,72 @@ +{ + "$schema": "./_schema.json", + "title": "double dot", + "grid": { + "x": 116.1, + "y": 53.0 + }, + "nodes": [ + { + "id": "a", + "kind": "commit", + "label": "A", + "col": 0, + "row": 0 + }, + { + "id": "b", + "kind": "commit", + "label": "B", + "col": 1, + "row": 0, + "dx": 2.9 + }, + { + "id": "e", + "kind": "commit", + "label": "E", + "col": 2, + "row": 0, + "dx": 5.8 + }, + { + "id": "f", + "kind": "commit", + "label": "F", + "col": 3, + "row": 0, + "dx": 8.7 + }, + { + "id": "c", + "kind": "commit", + "label": "C", + "col": 2, + "row": 1, + "dx": 5.8 + }, + { + "id": "d", + "kind": "commit", + "label": "D", + "col": 3, + "row": 1, + "dx": 8.7 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 4, + "row": 0 + }, + { + "id": "experiment", + "kind": "ref", + "label": "experiment", + "col": 4, + "row": 1 + } + ], + "edges": [] +} diff --git a/figures/head-to-master.json b/figures/head-to-master.json new file mode 100644 index 0000000..51cf377 --- /dev/null +++ b/figures/head-to-master.json @@ -0,0 +1,57 @@ +{ + "$schema": "./_schema.json", + "title": "head to master", + "grid": { + "x": 145.0, + "y": 62.3 + }, + "nodes": [ + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 1, + "dy": 2.7 + }, + { + "id": "testing", + "kind": "ref", + "label": "testing", + "col": 2, + "row": 3 + }, + { + "id": "f30ab", + "kind": "commit", + "label": "f30ab", + "col": 2, + "row": 2, + "dy": 1.4 + }, + { + "id": "node_34ac2", + "kind": "commit", + "label": "34ac2", + "col": 1, + "row": 2, + "dy": 1.4 + }, + { + "id": "node_98ca9", + "kind": "commit", + "label": "98ca9", + "col": 0, + "row": 2, + "dy": 1.4 + }, + { + "id": "head", + "kind": "blob", + "label": "HEAD", + "col": 2, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/head-to-testing.json b/figures/head-to-testing.json new file mode 100644 index 0000000..e15b31c --- /dev/null +++ b/figures/head-to-testing.json @@ -0,0 +1,53 @@ +{ + "$schema": "./_schema.json", + "title": "head to testing", + "grid": { + "x": 145.0, + "y": 61.0 + }, + "nodes": [ + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 0 + }, + { + "id": "testing", + "kind": "ref", + "label": "testing", + "col": 2, + "row": 2 + }, + { + "id": "f30ab", + "kind": "commit", + "label": "f30ab", + "col": 2, + "row": 1 + }, + { + "id": "node_34ac2", + "kind": "commit", + "label": "34ac2", + "col": 1, + "row": 1 + }, + { + "id": "node_98ca9", + "kind": "commit", + "label": "98ca9", + "col": 0, + "row": 1 + }, + { + "id": "head", + "kind": "blob", + "label": "HEAD", + "col": 2, + "row": 3 + } + ], + "edges": [] +} diff --git a/figures/integration-manager.json b/figures/integration-manager.json new file mode 100644 index 0000000..0234e47 --- /dev/null +++ b/figures/integration-manager.json @@ -0,0 +1,95 @@ +{ + "$schema": "./_schema.json", + "title": "integration manager", + "grid": { + "x": 137.1, + "y": 84.0 + }, + "nodes": [ + { + "id": "developer", + "kind": "tree", + "label": [ + "developer", + "public" + ], + "col": 1, + "row": 0, + "dx": 5.11 + }, + { + "id": "developer-2", + "kind": "commit", + "label": [ + "developer", + "private" + ], + "col": 1, + "row": 1, + "dx": 4.9 + }, + { + "id": "developer-3", + "kind": "commit", + "label": [ + "developer", + "private" + ], + "col": 1, + "row": 1, + "dx": 4.9 + }, + { + "id": "developer-4", + "kind": "commit", + "label": [ + "developer", + "private" + ], + "col": 2, + "row": 1 + }, + { + "id": "blessed", + "kind": "blob", + "label": [ + "blessed", + "repository" + ], + "col": 0, + "row": 0 + }, + { + "id": "integration", + "kind": "ref", + "label": [ + "integration", + "manager" + ], + "col": 0, + "row": 1 + }, + { + "id": "developer-5", + "kind": "tree", + "label": [ + "developer", + "public" + ], + "col": 2, + "row": 0 + }, + { + "id": "developer-6", + "kind": "tree", + "label": [ + "developer", + "public" + ], + "col": 1, + "row": 0, + "dx": 5.11 + } + ], + "edges": [] +} diff --git a/figures/interesting-rebase-1.json b/figures/interesting-rebase-1.json new file mode 100644 index 0000000..d70741e --- /dev/null +++ b/figures/interesting-rebase-1.json @@ -0,0 +1,101 @@ +{ + "$schema": "./_schema.json", + "title": "interesting rebase 1", + "grid": { + "x": 127.2, + "y": 60.9 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 1 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 1 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 0 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 3, + "row": 1 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 2, + "dy": 2.7 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 2, + "dy": 2.7 + }, + { + "id": "c8", + "kind": "commit", + "label": "C8", + "col": 3, + "row": 4, + "dy": -1.1 + }, + { + "id": "c9", + "kind": "commit", + "label": "C9", + "col": 4, + "row": 4, + "dy": -1.1 + }, + { + "id": "c10", + "kind": "commit", + "label": "C10", + "col": 4, + "row": 2, + "dy": 2.7 + }, + { + "id": "server", + "kind": "ref", + "label": "server", + "col": 4, + "row": 3, + "dy": 3.8 + }, + { + "id": "client", + "kind": "ref", + "label": "client", + "col": 4, + "row": 5 + } + ], + "edges": [] +} diff --git a/figures/interesting-rebase-2.json b/figures/interesting-rebase-2.json new file mode 100644 index 0000000..c7ce2a1 --- /dev/null +++ b/figures/interesting-rebase-2.json @@ -0,0 +1,114 @@ +{ + "$schema": "./_schema.json", + "title": "interesting rebase 2", + "grid": { + "x": 127.2, + "y": 60.6 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 1 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 1 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 0 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 3, + "row": 1 + }, + { + "id": "c8", + "kind": "commit", + "label": "C8'", + "col": 4, + "row": 1 + }, + { + "id": "c9", + "kind": "commit", + "label": "C9'", + "col": 5, + "row": 1 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 2, + "dy": 3.3 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 2, + "dy": 3.3 + }, + { + "id": "c8-2", + "kind": "commit", + "label": "C8", + "col": 3, + "row": 4 + }, + { + "id": "c9-2", + "kind": "commit", + "label": "C9", + "col": 4, + "row": 4 + }, + { + "id": "c10", + "kind": "commit", + "label": "C10", + "col": 4, + "row": 2, + "dy": 3.3 + }, + { + "id": "server", + "kind": "ref", + "label": "server", + "col": 4, + "row": 3, + "dy": 4.7 + }, + { + "id": "client", + "kind": "ref", + "label": "client", + "col": 5, + "row": 2, + "dy": 1.3 + } + ], + "edges": [] +} diff --git a/figures/interesting-rebase-3.json b/figures/interesting-rebase-3.json new file mode 100644 index 0000000..38418d6 --- /dev/null +++ b/figures/interesting-rebase-3.json @@ -0,0 +1,102 @@ +{ + "$schema": "./_schema.json", + "title": "interesting rebase 3", + "grid": { + "x": 127.2, + "y": 62.2 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1, + "dy": -1.7 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 1, + "dy": -1.7 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 1, + "dy": -1.7 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 5, + "row": 0 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 3, + "row": 1, + "dy": -1.7 + }, + { + "id": "c8", + "kind": "commit", + "label": "C8'", + "col": 4, + "row": 1, + "dy": -1.7 + }, + { + "id": "c9", + "kind": "commit", + "label": "C9'", + "col": 5, + "row": 1, + "dy": -1.7 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 2 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 2 + }, + { + "id": "c10", + "kind": "commit", + "label": "C10", + "col": 4, + "row": 2 + }, + { + "id": "server", + "kind": "ref", + "label": "server", + "col": 4, + "row": 3 + }, + { + "id": "client", + "kind": "ref", + "label": "client", + "col": 5, + "row": 2, + "dy": -1.9 + } + ], + "edges": [] +} diff --git a/figures/interesting-rebase-4.json b/figures/interesting-rebase-4.json new file mode 100644 index 0000000..746d2d9 --- /dev/null +++ b/figures/interesting-rebase-4.json @@ -0,0 +1,139 @@ +{ + "$schema": "./_schema.json", + "title": "interesting rebase 4", + "grid": { + "x": 127.4, + "y": 61.9 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1, + "dy": -1.4 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 1, + "dy": -1.4 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 1, + "dx": -0.8, + "dy": -1.4 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 5, + "row": 0, + "dx": -1.2 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 3, + "row": 1, + "dy": -1.4 + }, + { + "id": "c8", + "kind": "commit", + "label": "C8'", + "col": 4, + "row": 1, + "dx": -0.6, + "dy": -1.4 + }, + { + "id": "c9", + "kind": "commit", + "label": "C9'", + "col": 5, + "row": 1, + "dx": -1.0, + "dy": -1.4 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3'", + "col": 6, + "row": 1, + "dx": -1.2, + "dy": -1.4 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4'", + "col": 7, + "row": 1, + "dx": -0.8, + "dy": -1.4 + }, + { + "id": "c10", + "kind": "commit", + "label": "C10'", + "col": 8, + "row": 1, + "dy": -1.4 + }, + { + "id": "c3-2", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 2, + "dx": -0.8, + "dy": 0.7 + }, + { + "id": "c4-2", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 2, + "dy": 0.7 + }, + { + "id": "c10-2", + "kind": "commit", + "label": "C10", + "col": 4, + "row": 2, + "dx": -0.6, + "dy": 0.7 + }, + { + "id": "server", + "kind": "ref", + "label": "server", + "col": 8, + "row": 2, + "dy": -1.3 + }, + { + "id": "client", + "kind": "ref", + "label": "client", + "col": 5, + "row": 2, + "dx": -1.2, + "dy": -1.3 + } + ], + "edges": [] +} diff --git a/figures/interesting-rebase-5.json b/figures/interesting-rebase-5.json new file mode 100644 index 0000000..4b91e02 --- /dev/null +++ b/figures/interesting-rebase-5.json @@ -0,0 +1,87 @@ +{ + "$schema": "./_schema.json", + "title": "interesting rebase 5", + "grid": { + "x": 127.4, + "y": 60.5 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 1 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 1, + "dx": -0.8 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 8, + "row": 0, + "dx": -0.5 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 3, + "row": 1 + }, + { + "id": "c8", + "kind": "commit", + "label": "C8'", + "col": 4, + "row": 1, + "dx": -0.6 + }, + { + "id": "c9", + "kind": "commit", + "label": "C9'", + "col": 5, + "row": 1, + "dx": -1.0 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3'", + "col": 6, + "row": 1, + "dx": -1.4 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4'", + "col": 7, + "row": 1, + "dx": -0.8 + }, + { + "id": "c10", + "kind": "commit", + "label": "C10'", + "col": 8, + "row": 1 + } + ], + "edges": [] +} diff --git a/figures/large-merges-1.json b/figures/large-merges-1.json new file mode 100644 index 0000000..2e98760 --- /dev/null +++ b/figures/large-merges-1.json @@ -0,0 +1,149 @@ +{ + "$schema": "./_schema.json", + "title": "large merges 1", + "grid": { + "x": 123.2, + "y": 53.0 + }, + "nodes": [ + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 0, + "dx": -4.2 + }, + { + "id": "tv-rebase-stat", + "kind": "ref", + "label": "tv/rebase-stat", + "col": 4, + "row": 2 + }, + { + "id": "jk-clone-checkout", + "kind": "ref", + "label": "jk/clone-checkout", + "col": 4, + "row": 3 + }, + { + "id": "db-push-cleanup", + "kind": "ref", + "label": "db/push-cleanup", + "col": 4, + "row": 4 + }, + { + "id": "js-notes", + "kind": "ref", + "label": "js/notes", + "col": 4, + "row": 5 + }, + { + "id": "ps-blame", + "kind": "ref", + "label": "ps/blame", + "col": 4, + "row": 6 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 1, + "dx": -4.2 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 2, + "dx": -8.4 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 3, + "dx": -8.4 + }, + { + "id": "c7", + "kind": "commit", + "label": "C7", + "col": 2, + "row": 4, + "dx": -8.4 + }, + { + "id": "c9", + "kind": "commit", + "label": "C9", + "col": 2, + "row": 5, + "dx": -8.4 + }, + { + "id": "c11", + "kind": "commit", + "label": "C11", + "col": 2, + "row": 6, + "dx": -8.4 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 2, + "dx": -11.6 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 3, + "row": 3, + "dx": -11.6 + }, + { + "id": "c8", + "kind": "commit", + "label": "C8", + "col": 3, + "row": 4, + "dx": -11.6 + }, + { + "id": "c10", + "kind": "commit", + "label": "C10", + "col": 3, + "row": 5, + "dx": -11.6 + }, + { + "id": "c12", + "kind": "commit", + "label": "C12", + "col": 3, + "row": 6, + "dx": -11.6 + } + ], + "edges": [] +} diff --git a/figures/large-merges-2.json b/figures/large-merges-2.json new file mode 100644 index 0000000..5bf83aa --- /dev/null +++ b/figures/large-merges-2.json @@ -0,0 +1,227 @@ +{ + "$schema": "./_schema.json", + "title": "large merges 2", + "grid": { + "x": 87.3, + "y": 50.4 + }, + "nodes": [ + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 3, + "dx": 1.3, + "dy": -18.2 + }, + { + "id": "tv-rebase-stat", + "kind": "ref", + "label": "tv/rebase-stat", + "col": 6, + "row": 6, + "dx": -23.9, + "dy": -5.4 + }, + { + "id": "jk-clone-checkout", + "kind": "ref", + "label": "jk/clone-checkout", + "col": 6, + "row": 7, + "dx": -24.0, + "dy": -2.8 + }, + { + "id": "db-push-cleanup", + "kind": "ref", + "label": "db/push-cleanup", + "col": 6, + "row": 8, + "dx": -24.0 + }, + { + "id": "js-notes", + "kind": "ref", + "label": "js/notes", + "col": 6, + "row": 0, + "dx": -24.0 + }, + { + "id": "seen", + "kind": "ref", + "label": "seen", + "col": 8, + "row": 3, + "dy": 9.8 + }, + { + "id": "next", + "kind": "ref", + "label": "next", + "col": 8, + "row": 4, + "dy": 4.4 + }, + { + "id": "ps-blame", + "kind": "ref", + "label": "ps/blame", + "col": 6, + "row": 1, + "dx": -24.1, + "dy": 2.6 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 4, + "dy": -17.6 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 4, + "dx": 31.7, + "dy": -17.6 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 3, + "row": 6, + "dx": -23.9, + "dy": -5.4 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 3, + "row": 7, + "dx": -23.9, + "dy": -2.8 + }, + { + "id": "c7", + "kind": "commit", + "label": "C7", + "col": 3, + "row": 8, + "dx": -23.9 + }, + { + "id": "c9", + "kind": "commit", + "label": "C9", + "col": 3, + "row": 0, + "dx": -23.9 + }, + { + "id": "c11", + "kind": "commit", + "label": "C11", + "col": 3, + "row": 1, + "dx": -23.9, + "dy": 2.6 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 4, + "row": 6, + "dx": 8.8, + "dy": -5.4 + }, + { + "id": "c16", + "kind": "commit", + "label": "C16", + "col": 5, + "row": 3, + "dx": 40.5, + "dy": 9.8 + }, + { + "id": "c17", + "kind": "commit", + "label": "C17", + "col": 7, + "row": 3, + "dx": -15.3, + "dy": 9.8 + }, + { + "id": "c13", + "kind": "commit", + "label": "C13", + "col": 4, + "row": 4, + "dx": 8.8, + "dy": 4.4 + }, + { + "id": "c14", + "kind": "commit", + "label": "C14", + "col": 5, + "row": 4, + "dx": 40.5, + "dy": 4.4 + }, + { + "id": "c15", + "kind": "commit", + "label": "C15", + "col": 7, + "row": 4, + "dx": -15.1, + "dy": 4.4 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 4, + "row": 7, + "dx": 8.8, + "dy": -2.8 + }, + { + "id": "c8", + "kind": "commit", + "label": "C8", + "col": 4, + "row": 8, + "dx": 8.8 + }, + { + "id": "c10", + "kind": "commit", + "label": "C10", + "col": 4, + "row": 0, + "dx": 8.8 + }, + { + "id": "c12", + "kind": "commit", + "label": "C12", + "col": 4, + "row": 1, + "dx": 8.8, + "dy": 2.6 + } + ], + "edges": [] +} diff --git a/figures/lifecycle.json b/figures/lifecycle.json new file mode 100644 index 0000000..da0f3ed --- /dev/null +++ b/figures/lifecycle.json @@ -0,0 +1,40 @@ +{ + "$schema": "./_schema.json", + "title": "lifecycle", + "layout": "absolute", + "canvas": { + "w": 516.0, + "h": 227.0 + }, + "nodes": [ + { + "id": "modified", + "kind": "goldref", + "label": "Modified", + "x": 271.4, + "y": 0.0 + }, + { + "id": "untracked", + "kind": "commit", + "label": "Untracked", + "x": 0.0, + "y": 0.0 + }, + { + "id": "unmodified", + "kind": "tree", + "label": "Unmodified", + "x": 135.61, + "y": 0.0 + }, + { + "id": "staged", + "kind": "ref", + "label": "Staged", + "x": 407.05, + "y": 0.0 + } + ], + "edges": [] +} diff --git a/figures/local.json b/figures/local.json new file mode 100644 index 0000000..5777441 --- /dev/null +++ b/figures/local.json @@ -0,0 +1,39 @@ +{ + "$schema": "./_schema.json", + "title": "local", + "grid": { + "x": 165.0, + "y": 55.0 + }, + "nodes": [ + { + "id": "file", + "kind": "tree", + "label": "File", + "col": 0, + "row": 0 + }, + { + "id": "version-3", + "kind": "commit", + "label": "Version 3", + "col": 1, + "row": 0 + }, + { + "id": "version-2", + "kind": "commit", + "label": "Version 2", + "col": 1, + "row": 1 + }, + { + "id": "version-1", + "kind": "commit", + "label": "Version 1", + "col": 1, + "row": 2 + } + ], + "edges": [] +} diff --git a/figures/lr-branches-1.json b/figures/lr-branches-1.json new file mode 100644 index 0000000..25cdc43 --- /dev/null +++ b/figures/lr-branches-1.json @@ -0,0 +1,81 @@ +{ + "$schema": "./_schema.json", + "title": "lr branches 1", + "grid": { + "x": 118.0, + "y": 70.0 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 1 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 1 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 1 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 4, + "row": 1 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 5, + "row": 1 + }, + { + "id": "c7", + "kind": "commit", + "label": "C7", + "col": 6, + "row": 1 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 0, + "row": 0 + }, + { + "id": "develop", + "kind": "ref", + "label": "develop", + "col": 4, + "row": 0 + }, + { + "id": "topic", + "kind": "ref", + "label": "topic", + "col": 6, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/lr-branches-2.json b/figures/lr-branches-2.json new file mode 100644 index 0000000..301fb0c --- /dev/null +++ b/figures/lr-branches-2.json @@ -0,0 +1,69 @@ +{ + "$schema": "./_schema.json", + "title": "lr branches 2", + "grid": { + "x": 138.4, + "y": 146.8 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 0 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 1, + "dx": 14.0, + "dy": -7.33 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 1, + "dx": 11.16, + "dy": -7.33 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 1, + "dx": 8.46, + "dy": -7.33 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 4, + "row": 1, + "dx": 5.48, + "dy": -7.35 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 5, + "row": 2, + "dx": 2.68 + }, + { + "id": "c7", + "kind": "commit", + "label": "C7", + "col": 6, + "row": 2 + } + ], + "edges": [] +} diff --git a/figures/managed-team-1.json b/figures/managed-team-1.json new file mode 100644 index 0000000..1fcae6d --- /dev/null +++ b/figures/managed-team-1.json @@ -0,0 +1,72 @@ +{ + "$schema": "./_schema.json", + "title": "managed team 1", + "grid": { + "x": 119.0, + "y": 54.7 + }, + "nodes": [ + { + "id": "node_4b078", + "kind": "commit", + "label": "4b078", + "col": 0, + "row": 1, + "dy": 3.8 + }, + { + "id": "node_1edee", + "kind": "commit", + "label": "1edee", + "col": 1, + "row": 1, + "dy": 3.8 + }, + { + "id": "node_33009", + "kind": "jessica", + "label": "33009", + "col": 2, + "row": 1, + "dy": 3.8 + }, + { + "id": "node_85127", + "kind": "jessica", + "label": "85127", + "col": 3, + "row": 2, + "dy": -2.9 + }, + { + "id": "e5b0f", + "kind": "jessica", + "label": "e5b0f", + "col": 2, + "row": 2, + "dy": -2.9 + }, + { + "id": "featureb", + "kind": "ref", + "label": "featureB", + "col": 3, + "row": 3 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 0 + }, + { + "id": "featurea", + "kind": "ref", + "label": "featureA", + "col": 2, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/managed-team-2.json b/figures/managed-team-2.json new file mode 100644 index 0000000..3a7e865 --- /dev/null +++ b/figures/managed-team-2.json @@ -0,0 +1,134 @@ +{ + "$schema": "./_schema.json", + "title": "managed team 2", + "grid": { + "x": 95.2, + "y": 45.8 + }, + "nodes": [ + { + "id": "node_4b078", + "kind": "commit", + "label": "4b078", + "col": 0, + "row": 3, + "dy": -20.9 + }, + { + "id": "node_1edee", + "kind": "commit", + "label": "1edee", + "col": 1, + "row": 3, + "dx": 23.8, + "dy": -20.9 + }, + { + "id": "node_33009", + "kind": "jessica", + "label": "33009", + "col": 3, + "row": 3, + "dx": -47.6, + "dy": -20.9 + }, + { + "id": "aad88", + "kind": "john", + "label": "aad88", + "col": 4, + "row": 3, + "dx": -23.8, + "dy": -20.9 + }, + { + "id": "node_774b3", + "kind": "jessica", + "label": "774b3", + "col": 5, + "row": 3, + "dy": -20.9 + }, + { + "id": "node_85127", + "kind": "jessica", + "label": "85127", + "col": 4, + "row": 4, + "dx": -23.8, + "dy": -18.7 + }, + { + "id": "cd685", + "kind": "jessica", + "label": "cd685", + "col": 5, + "row": 4, + "dy": -18.7 + }, + { + "id": "fba9a", + "kind": "josie", + "label": "fba9a", + "col": 3, + "row": 5, + "dx": 2.4, + "dy": -16.5 + }, + { + "id": "e5b0f", + "kind": "jessica", + "label": "e5b0f", + "col": 3, + "row": 4, + "dx": -47.6, + "dy": -18.7 + }, + { + "id": "featureb", + "kind": "ref", + "label": "featureB", + "col": 5, + "row": 5, + "dy": -7.0 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 1, + "dx": 23.7, + "dy": 12.2 + }, + { + "id": "featurea", + "kind": "ref", + "label": "featureA", + "col": 5, + "row": 1, + "dy": 12.2 + }, + { + "id": "origin", + "kind": "ref", + "label": [ + "origin/", + "featureA" + ], + "col": 5, + "row": 0 + }, + { + "id": "origin-2", + "kind": "ref", + "label": [ + "origin/", + "featureBee" + ], + "col": 5, + "row": 6 + } + ], + "edges": [] +} diff --git a/figures/managed-team-3.json b/figures/managed-team-3.json new file mode 100644 index 0000000..67a9f80 --- /dev/null +++ b/figures/managed-team-3.json @@ -0,0 +1,159 @@ +{ + "$schema": "./_schema.json", + "title": "managed team 3", + "grid": { + "x": 99.2, + "y": 45.8 + }, + "nodes": [ + { + "id": "node_4b078", + "kind": "commit", + "label": "4b078", + "col": 0, + "row": 3, + "dy": -20.81 + }, + { + "id": "node_1edee", + "kind": "commit", + "label": "1edee", + "col": 1, + "row": 3, + "dx": 19.8, + "dy": -20.81 + }, + { + "id": "node_33009", + "kind": "jessica", + "label": "33009", + "col": 2, + "row": 3, + "dx": 39.6, + "dy": -20.81 + }, + { + "id": "aad88", + "kind": "john", + "label": "aad88", + "col": 4, + "row": 3, + "dx": -39.8, + "dy": -20.81 + }, + { + "id": "node_774b3", + "kind": "jessica", + "label": "774b3", + "col": 5, + "row": 3, + "dx": -20.0, + "dy": -20.81 + }, + { + "id": "node_5399e", + "kind": "commit", + "label": "5399e", + "col": 6, + "row": 3, + "dy": -20.81 + }, + { + "id": "node_85127", + "kind": "jessica", + "label": "85127", + "col": 4, + "row": 4, + "dx": -39.8, + "dy": -18.61 + }, + { + "id": "cd685", + "kind": "jessica", + "label": "cd685", + "col": 5, + "row": 4, + "dx": -20.0, + "dy": -18.61 + }, + { + "id": "fba9a", + "kind": "josie", + "label": "fba9a", + "col": 3, + "row": 5, + "dx": -9.6, + "dy": -16.41 + }, + { + "id": "e5b0f", + "kind": "jessica", + "label": "e5b0f", + "col": 2, + "row": 4, + "dx": 39.6, + "dy": -18.61 + }, + { + "id": "featureb", + "kind": "ref", + "label": "featureB", + "col": 5, + "row": 5, + "dx": -20.0, + "dy": -6.91 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 1, + "dx": 19.8, + "dy": 12.29 + }, + { + "id": "featurea", + "kind": "ref", + "label": "featureA", + "col": 5, + "row": 1, + "dx": -20.0, + "dy": 12.29 + }, + { + "id": "origin", + "kind": "ref", + "label": [ + "origin/", + "featureBee" + ], + "col": 5, + "row": 6, + "dx": -20.0 + }, + { + "id": "origin-2", + "kind": "ref", + "label": [ + "origin/", + "featureA" + ], + "col": 5, + "row": 0, + "dx": -20.0 + }, + { + "id": "origin-3", + "kind": "ref", + "label": [ + "origin/", + "master" + ], + "col": 6, + "row": 1, + "dy": 12.29 + } + ], + "edges": [] +} diff --git a/figures/managed-team-flow.json b/figures/managed-team-flow.json new file mode 100644 index 0000000..e34df40 --- /dev/null +++ b/figures/managed-team-flow.json @@ -0,0 +1,77 @@ +{ + "$schema": "./_schema.json", + "title": "managed team flow", + "grid": { + "x": 98.8, + "y": 595.0 + }, + "nodes": [ + { + "id": "john", + "kind": "ref", + "label": "John", + "col": 1, + "row": 0, + "dx": -3.8 + }, + { + "id": "john-2", + "kind": "ref", + "label": "John", + "col": 1, + "row": 1, + "dx": -3.8 + }, + { + "id": "josie", + "kind": "ref", + "label": "Josie", + "col": 2, + "row": 0, + "dx": -7.6 + }, + { + "id": "josie-2", + "kind": "ref", + "label": "Josie", + "col": 2, + "row": 1, + "dx": -7.6 + }, + { + "id": "jessica", + "kind": "ref", + "label": "Jessica", + "col": 0, + "row": 0 + }, + { + "id": "jessica-2", + "kind": "ref", + "label": "Jessica", + "col": 0, + "row": 1 + }, + { + "id": "server", + "kind": "ref", + "label": [ + "server:", + "featureA" + ], + "col": 3, + "row": 0 + }, + { + "id": "server-2", + "kind": "ref", + "label": [ + "server:", + "featureA" + ], + "col": 3, + "row": 1 + } + ], + "edges": [] +} diff --git a/figures/merging-workflows-1.json b/figures/merging-workflows-1.json new file mode 100644 index 0000000..08351cf --- /dev/null +++ b/figures/merging-workflows-1.json @@ -0,0 +1,94 @@ +{ + "$schema": "./_schema.json", + "title": "merging workflows 1", + "grid": { + "x": 118.0, + "y": 53.7 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1, + "dy": 3.3 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 1, + "dx": 1.0, + "dy": 3.3 + }, + { + "id": "c7", + "kind": "commit", + "label": "C7", + "col": 2, + "row": 1, + "dx": 2.0, + "dy": 3.3 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 2, + "dx": 2.0, + "dy": 0.6 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 2, + "dx": 3.0, + "dy": 0.6 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 3, + "dx": 2.0 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 3, + "row": 3, + "dx": 3.0 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 0, + "dx": 2.1 + }, + { + "id": "ruby-client", + "kind": "ref", + "label": "ruby_client", + "col": 4, + "row": 2, + "dy": 0.6 + }, + { + "id": "php-client", + "kind": "ref", + "label": "php_client", + "col": 4, + "row": 3 + } + ], + "edges": [] +} diff --git a/figures/merging-workflows-2.json b/figures/merging-workflows-2.json new file mode 100644 index 0000000..a1b6d93 --- /dev/null +++ b/figures/merging-workflows-2.json @@ -0,0 +1,114 @@ +{ + "$schema": "./_schema.json", + "title": "merging workflows 2", + "grid": { + "x": 118.4, + "y": 54.3 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1, + "dy": 2.7 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 1, + "dx": 0.6, + "dy": 2.7 + }, + { + "id": "c7", + "kind": "commit", + "label": "C7", + "col": 2, + "row": 1, + "dx": 1.2, + "dy": 2.7 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 2, + "dx": 1.2, + "dy": -0.6 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 2, + "dx": 1.8, + "dy": -0.6 + }, + { + "id": "c9", + "kind": "commit", + "label": "C9", + "col": 5, + "row": 1, + "dy": 2.7 + }, + { + "id": "c8", + "kind": "commit", + "label": "C8", + "col": 4, + "row": 1, + "dx": -0.6, + "dy": 2.7 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 3, + "dx": 1.2, + "dy": -1.9 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 3, + "row": 3, + "dx": 1.8, + "dy": -1.9 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 5, + "row": 0 + }, + { + "id": "ruby-client", + "kind": "ref", + "label": "ruby_client", + "col": 4, + "row": 2, + "dx": -0.8, + "dy": -0.6 + }, + { + "id": "php-client", + "kind": "ref", + "label": "php_client", + "col": 3, + "row": 4, + "dx": 1.8 + } + ], + "edges": [] +} diff --git a/figures/merging-workflows-3.json b/figures/merging-workflows-3.json new file mode 100644 index 0000000..3ce441c --- /dev/null +++ b/figures/merging-workflows-3.json @@ -0,0 +1,72 @@ +{ + "$schema": "./_schema.json", + "title": "merging workflows 3", + "grid": { + "x": 119.0, + "y": 55.0 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1, + "dy": 2.0 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 1, + "dy": 2.0 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 1, + "dy": 2.0 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 2, + "dy": -2.0 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 2, + "dy": -2.0 + }, + { + "id": "develop", + "kind": "ref", + "label": "develop", + "col": 2, + "row": 0 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 0 + }, + { + "id": "ruby-client", + "kind": "ref", + "label": "ruby_client", + "col": 3, + "row": 3 + } + ], + "edges": [] +} diff --git a/figures/merging-workflows-4.json b/figures/merging-workflows-4.json new file mode 100644 index 0000000..5f08b54 --- /dev/null +++ b/figures/merging-workflows-4.json @@ -0,0 +1,84 @@ +{ + "$schema": "./_schema.json", + "title": "merging workflows 4", + "grid": { + "x": 118.7, + "y": 55.0 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1, + "dy": 2.0 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 1, + "dy": 2.0 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 1, + "dx": 0.6, + "dy": 2.0 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 2, + "dx": 0.6, + "dy": -2.0 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 2, + "dx": 0.9, + "dy": -2.0 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 4, + "row": 1, + "dy": 2.0 + }, + { + "id": "develop", + "kind": "ref", + "label": "develop", + "col": 4, + "row": 0 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 0 + }, + { + "id": "ruby-client", + "kind": "ref", + "label": "ruby_client", + "col": 3, + "row": 3, + "dx": 0.9 + } + ], + "edges": [] +} diff --git a/figures/merging-workflows-5.json b/figures/merging-workflows-5.json new file mode 100644 index 0000000..fda397d --- /dev/null +++ b/figures/merging-workflows-5.json @@ -0,0 +1,87 @@ +{ + "$schema": "./_schema.json", + "title": "merging workflows 5", + "grid": { + "x": 87.3, + "y": 55.0 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1, + "dy": 2.0 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 1, + "dx": 31.7, + "dy": 2.0 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 3, + "row": 1, + "dx": -23.9, + "dy": 2.0 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 3, + "row": 2, + "dx": -23.9, + "dy": -2.0 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 4, + "row": 2, + "dx": 7.8, + "dy": -2.0 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 5, + "row": 1, + "dx": 38.5, + "dy": 2.0 + }, + { + "id": "develop", + "kind": "ref", + "label": "develop", + "col": 6, + "row": 0 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 5, + "row": 0, + "dx": -10.5 + }, + { + "id": "ruby-client", + "kind": "ref", + "label": "ruby_client", + "col": 4, + "row": 3, + "dx": 7.8 + } + ], + "edges": [] +} diff --git a/figures/perils-of-rebasing-1.json b/figures/perils-of-rebasing-1.json new file mode 100644 index 0000000..fb7f90d --- /dev/null +++ b/figures/perils-of-rebasing-1.json @@ -0,0 +1,66 @@ +{ + "$schema": "./_schema.json", + "title": "perils of rebasing 1", + "grid": { + "x": 91.2, + "y": 97.5 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 0 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 0, + "dx": 44.15 + }, + { + "id": "c1-2", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1, + "dy": 46.5 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 2, + "dx": 23.85 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 3, + "row": 2, + "dx": -41.55 + }, + { + "id": "master-2", + "kind": "ref", + "label": "master", + "col": 4, + "row": 2 + }, + { + "id": "teamone-master", + "kind": "ref", + "label": "teamone/master", + "col": 1, + "row": 1, + "dx": 44.35, + "dy": 46.5 + } + ], + "edges": [] +} diff --git a/figures/perils-of-rebasing-2.json b/figures/perils-of-rebasing-2.json new file mode 100644 index 0000000..23c744d --- /dev/null +++ b/figures/perils-of-rebasing-2.json @@ -0,0 +1,129 @@ +{ + "$schema": "./_schema.json", + "title": "perils of rebasing 2", + "grid": { + "x": 96.5, + "y": 68.8 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1, + "dy": -18.79 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 4, + "row": 1, + "dx": -21.3, + "dy": -18.79 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 1, + "row": 1, + "dx": 21.6, + "dy": -18.79 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 1, + "row": 0, + "dx": 21.78 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 2, + "row": 1, + "dx": 43.3, + "dy": -18.79 + }, + { + "id": "c1-2", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 3, + "dy": 18.61 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 4, + "dx": 43.1 + }, + { + "id": "c7", + "kind": "commit", + "label": "C7", + "col": 4, + "row": 4, + "dx": -31.9 + }, + { + "id": "c4-2", + "kind": "commit", + "label": "C4", + "col": 1, + "row": 3, + "dx": 21.6, + "dy": 18.66 + }, + { + "id": "c5-2", + "kind": "commit", + "label": "C5", + "col": 1, + "row": 3, + "dx": 21.7, + "dy": -31.49 + }, + { + "id": "c6-2", + "kind": "commit", + "label": "C6", + "col": 2, + "row": 3, + "dx": 43.1, + "dy": 18.61 + }, + { + "id": "master-2", + "kind": "ref", + "label": "master", + "col": 5, + "row": 4 + }, + { + "id": "teamone-master", + "kind": "ref", + "label": "teamone/master", + "col": 4, + "row": 3, + "dx": -21.4, + "dy": 18.61 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 4, + "dx": 21.6 + } + ], + "edges": [] +} diff --git a/figures/perils-of-rebasing-3.json b/figures/perils-of-rebasing-3.json new file mode 100644 index 0000000..3c549fd --- /dev/null +++ b/figures/perils-of-rebasing-3.json @@ -0,0 +1,145 @@ +{ + "$schema": "./_schema.json", + "title": "perils of rebasing 3", + "grid": { + "x": 96.5, + "y": 66.0 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1, + "dy": -16.01 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 4, + "row": 0, + "dx": -21.5 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4'", + "col": 2, + "row": 0, + "dx": 43.0 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 1, + "row": 0, + "dx": 21.51 + }, + { + "id": "c4-2", + "kind": "commit", + "label": "C4", + "col": 1, + "row": 1, + "dx": 21.51, + "dy": -16.01 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 2, + "row": 1, + "dx": 43.01, + "dy": -16.01 + }, + { + "id": "c1-2", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 3, + "dy": 15.89 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 4, + "dx": 21.51 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 4, + "dx": 43.0 + }, + { + "id": "c7", + "kind": "commit", + "label": "C7", + "col": 4, + "row": 4, + "dx": -32.04 + }, + { + "id": "c4-3", + "kind": "commit", + "label": "C4'", + "col": 2, + "row": 2, + "dx": 43.0, + "dy": 31.89 + }, + { + "id": "c4-4", + "kind": "commit", + "label": "C4", + "col": 1, + "row": 3, + "dx": 21.5, + "dy": 15.89 + }, + { + "id": "c5-2", + "kind": "commit", + "label": "C5", + "col": 1, + "row": 2, + "dx": 21.5, + "dy": 31.89 + }, + { + "id": "c6-2", + "kind": "commit", + "label": "C6", + "col": 2, + "row": 3, + "dx": 43.0, + "dy": 15.89 + }, + { + "id": "master-2", + "kind": "ref", + "label": "master", + "col": 5, + "row": 4 + }, + { + "id": "teamone-master", + "kind": "ref", + "label": "teamone/master", + "col": 4, + "row": 2, + "dx": -21.54, + "dy": 31.9 + } + ], + "edges": [] +} diff --git a/figures/perils-of-rebasing-4.json b/figures/perils-of-rebasing-4.json new file mode 100644 index 0000000..6aba725 --- /dev/null +++ b/figures/perils-of-rebasing-4.json @@ -0,0 +1,153 @@ +{ + "$schema": "./_schema.json", + "title": "perils of rebasing 4", + "grid": { + "x": 100.1, + "y": 66.7 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1, + "dy": -15.69 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 4, + "row": 0, + "dx": -35.9 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4'", + "col": 2, + "row": 0, + "dx": 35.82 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 1, + "row": 0, + "dx": 17.9 + }, + { + "id": "c4-2", + "kind": "commit", + "label": "C4", + "col": 1, + "row": 1, + "dx": 17.92, + "dy": -15.69 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 2, + "row": 1, + "dx": 35.8, + "dy": -15.69 + }, + { + "id": "c1-2", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 3, + "dy": 15.81 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 4, + "dx": 17.79 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 4, + "dx": 35.74 + }, + { + "id": "c7", + "kind": "commit", + "label": "C7", + "col": 4, + "row": 4, + "dx": -46.49 + }, + { + "id": "c8", + "kind": "commit", + "label": "C8", + "col": 5, + "row": 4, + "dx": -28.6 + }, + { + "id": "c4-3", + "kind": "commit", + "label": "C4'", + "col": 2, + "row": 2, + "dx": 35.74, + "dy": 31.49 + }, + { + "id": "c4-4", + "kind": "commit", + "label": "C4", + "col": 1, + "row": 3, + "dx": 17.82, + "dy": 15.81 + }, + { + "id": "c5-2", + "kind": "commit", + "label": "C5", + "col": 1, + "row": 2, + "dx": 17.79, + "dy": 31.49 + }, + { + "id": "c6-2", + "kind": "commit", + "label": "C6", + "col": 2, + "row": 3, + "dx": 35.74, + "dy": 15.81 + }, + { + "id": "master-2", + "kind": "ref", + "label": "master", + "col": 6, + "row": 4 + }, + { + "id": "teamone-master", + "kind": "ref", + "label": "teamone/master", + "col": 4, + "row": 2, + "dx": -35.98, + "dy": 31.51 + } + ], + "edges": [] +} diff --git a/figures/perils-of-rebasing-5.json b/figures/perils-of-rebasing-5.json new file mode 100644 index 0000000..8ec3569 --- /dev/null +++ b/figures/perils-of-rebasing-5.json @@ -0,0 +1,116 @@ +{ + "$schema": "./_schema.json", + "title": "perils of rebasing 5", + "grid": { + "x": 100.0, + "y": 80.3 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 1, + "dy": -29.29 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 4, + "row": 0, + "dx": -37.75 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4'", + "col": 2, + "row": 0, + "dx": 35.79 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 1, + "row": 0, + "dx": 17.87 + }, + { + "id": "c4-2", + "kind": "commit", + "label": "C4", + "col": 1, + "row": 1, + "dx": 17.87, + "dy": -29.29 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 2, + "row": 1, + "dx": 35.79, + "dy": -29.29 + }, + { + "id": "c1-2", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 3 + }, + { + "id": "c4-3", + "kind": "commit", + "label": "C4'", + "col": 2, + "row": 3, + "dx": 35.75 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2'", + "col": 4, + "row": 3, + "dx": -46.29 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3'", + "col": 5, + "row": 3, + "dx": -28.3 + }, + { + "id": "c5-2", + "kind": "commit", + "label": "C5", + "col": 1, + "row": 3, + "dx": 17.83 + }, + { + "id": "master-2", + "kind": "ref", + "label": "master", + "col": 6, + "row": 3 + }, + { + "id": "teamone-master", + "kind": "ref", + "label": "teamone/master", + "col": 2, + "row": 2, + "dx": 35.75, + "dy": 29.39 + } + ], + "edges": [] +} diff --git a/figures/public-small-1.json b/figures/public-small-1.json new file mode 100644 index 0000000..ffd9641 --- /dev/null +++ b/figures/public-small-1.json @@ -0,0 +1,90 @@ +{ + "$schema": "./_schema.json", + "title": "public small 1", + "grid": { + "x": 119.0, + "y": 51.3 + }, + "nodes": [ + { + "id": "node_4b078", + "kind": "commit", + "label": "4b078", + "col": 0, + "row": 1, + "dy": 4.7 + }, + { + "id": "node_1edee", + "kind": "commit", + "label": "1edee", + "col": 1, + "row": 1, + "dy": 4.7 + }, + { + "id": "node_33009", + "kind": "commit", + "label": "33009", + "col": 2, + "row": 1, + "dy": 4.7 + }, + { + "id": "node_0d708", + "kind": "commit", + "label": "0d708", + "col": 3, + "row": 2, + "dy": 1.4 + }, + { + "id": "e5b0f", + "kind": "commit", + "label": "e5b0f", + "col": 2, + "row": 3 + }, + { + "id": "a2de3", + "kind": "commit", + "label": "a2de3", + "col": 2, + "row": 2, + "dy": 1.4 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 0 + }, + { + "id": "featurea", + "kind": "ref", + "label": "featureA", + "col": 4, + "row": 2, + "dy": 1.4 + }, + { + "id": "featureb", + "kind": "ref", + "label": "featureB", + "col": 3, + "row": 3 + }, + { + "id": "origin", + "kind": "ref", + "label": [ + "origin/", + "master" + ], + "col": 2, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/public-small-2.json b/figures/public-small-2.json new file mode 100644 index 0000000..76c9c8c --- /dev/null +++ b/figures/public-small-2.json @@ -0,0 +1,90 @@ +{ + "$schema": "./_schema.json", + "title": "public small 2", + "grid": { + "x": 119.0, + "y": 51.3 + }, + "nodes": [ + { + "id": "node_4b078", + "kind": "commit", + "label": "4b078", + "col": 0, + "row": 1, + "dy": 4.72 + }, + { + "id": "node_1edee", + "kind": "commit", + "label": "1edee", + "col": 1, + "row": 1, + "dy": 4.72 + }, + { + "id": "node_33009", + "kind": "commit", + "label": "33009", + "col": 2, + "row": 1, + "dy": 4.72 + }, + { + "id": "node_5399e", + "kind": "commit", + "label": "5399e", + "col": 4, + "row": 2, + "dy": 1.42 + }, + { + "id": "e5b0f", + "kind": "commit", + "label": "e5b0f", + "col": 2, + "row": 3 + }, + { + "id": "dee6b", + "kind": "commit", + "label": "dee6b", + "col": 3, + "row": 2, + "dy": 1.42 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 0 + }, + { + "id": "featurea", + "kind": "ref", + "label": "featureA", + "col": 5, + "row": 2, + "dy": 1.42 + }, + { + "id": "featureb", + "kind": "ref", + "label": "featureB", + "col": 3, + "row": 3 + }, + { + "id": "origin", + "kind": "ref", + "label": [ + "origin/", + "master" + ], + "col": 2, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/public-small-3.json b/figures/public-small-3.json new file mode 100644 index 0000000..a7a9f61 --- /dev/null +++ b/figures/public-small-3.json @@ -0,0 +1,106 @@ +{ + "$schema": "./_schema.json", + "title": "public small 3", + "grid": { + "x": 118.9, + "y": 34.1 + }, + "nodes": [ + { + "id": "node_4b078", + "kind": "commit", + "label": "4b078", + "col": 0, + "row": 2, + "dy": -12.18 + }, + { + "id": "node_1edee", + "kind": "commit", + "label": "1edee", + "col": 1, + "row": 2, + "dy": -12.18 + }, + { + "id": "node_33009", + "kind": "commit", + "label": "33009", + "col": 2, + "row": 2, + "dy": -12.18 + }, + { + "id": "node_5399e", + "kind": "commit", + "label": "5399e", + "col": 4, + "row": 2, + "dy": 12.42 + }, + { + "id": "node_17f4d", + "kind": "commit", + "label": "17f4d", + "col": 3, + "row": 1, + "dy": -2.92 + }, + { + "id": "e5b0f", + "kind": "commit", + "label": "e5b0f", + "col": 2, + "row": 4 + }, + { + "id": "dee6b", + "kind": "commit", + "label": "dee6b", + "col": 3, + "row": 2, + "dy": 12.32 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 0 + }, + { + "id": "featurea", + "kind": "ref", + "label": "featureA", + "col": 5, + "row": 2, + "dy": 12.35 + }, + { + "id": "featureb", + "kind": "ref", + "label": "featureB", + "col": 3, + "row": 4 + }, + { + "id": "featurebv2", + "kind": "ref", + "label": "featureBv2", + "col": 4, + "row": 1, + "dy": -2.99 + }, + { + "id": "origin", + "kind": "ref", + "label": [ + "origin/", + "master" + ], + "col": 2, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/rebasing-1.json b/figures/rebasing-1.json new file mode 100644 index 0000000..39aaacc --- /dev/null +++ b/figures/rebasing-1.json @@ -0,0 +1,65 @@ +{ + "$schema": "./_schema.json", + "title": "rebasing 1", + "grid": { + "x": 119.0, + "y": 55.0 + }, + "nodes": [ + { + "id": "node_0b743", + "kind": "commit", + "label": "0b743", + "col": 0, + "row": 1, + "dy": 2.0 + }, + { + "id": "a6b4c", + "kind": "commit", + "label": "a6b4c", + "col": 1, + "row": 1, + "dy": 2.0 + }, + { + "id": "f42c5", + "kind": "commit", + "label": "f42c5", + "col": 2, + "row": 1, + "dy": 2.0 + }, + { + "id": "e43a6", + "kind": "commit", + "label": "e43a6", + "col": 2, + "row": 2, + "dy": -2.0 + }, + { + "id": "node_5ddae", + "kind": "commit", + "label": "5ddae", + "col": 3, + "row": 2, + "dy": -2.0 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 0 + }, + { + "id": "ruby-client", + "kind": "ref", + "label": "ruby_client", + "col": 3, + "row": 3 + } + ], + "edges": [] +} diff --git a/figures/rebasing-2.json b/figures/rebasing-2.json new file mode 100644 index 0000000..fe31213 --- /dev/null +++ b/figures/rebasing-2.json @@ -0,0 +1,75 @@ +{ + "$schema": "./_schema.json", + "title": "rebasing 2", + "grid": { + "x": 118.8, + "y": 55.0 + }, + "nodes": [ + { + "id": "node_0b743", + "kind": "commit", + "label": "0b743", + "col": 0, + "row": 1, + "dy": 2.0 + }, + { + "id": "a6b4c", + "kind": "commit", + "label": "a6b4c", + "col": 1, + "row": 1, + "dy": 2.0 + }, + { + "id": "f42c5", + "kind": "commit", + "label": "f42c5", + "col": 2, + "row": 1, + "dy": 2.0 + }, + { + "id": "a0a41", + "kind": "commit", + "label": "a0a41", + "col": 3, + "row": 1, + "dy": 2.0 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 0 + }, + { + "id": "e43a6", + "kind": "commit", + "label": "e43a6", + "col": 2, + "row": 2, + "dy": -2.0 + }, + { + "id": "node_5ddae", + "kind": "commit", + "label": "5ddae", + "col": 3, + "row": 2, + "dx": 0.6, + "dy": -2.0 + }, + { + "id": "ruby-client", + "kind": "ref", + "label": "ruby_client", + "col": 3, + "row": 3, + "dx": 0.6 + } + ], + "edges": [] +} diff --git a/figures/remote-branches-1.json b/figures/remote-branches-1.json new file mode 100644 index 0000000..403e7a8 --- /dev/null +++ b/figures/remote-branches-1.json @@ -0,0 +1,81 @@ +{ + "$schema": "./_schema.json", + "title": "remote branches 1", + "grid": { + "x": 117.0, + "y": 73.0 + }, + "nodes": [ + { + "id": "node_0b743", + "kind": "commit", + "label": "0b743", + "col": 0, + "row": 1, + "dy": -20.0 + }, + { + "id": "a6b4c", + "kind": "commit", + "label": "a6b4c", + "col": 1, + "row": 1, + "dy": -20.0 + }, + { + "id": "f4265", + "kind": "commit", + "label": "f4265", + "col": 2, + "row": 1, + "dy": -20.0 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 0 + }, + { + "id": "node_0b743-2", + "kind": "commit", + "label": "0b743", + "col": 0, + "row": 3, + "dy": 20.0 + }, + { + "id": "a6b4c-2", + "kind": "commit", + "label": "a6b4c", + "col": 1, + "row": 3, + "dy": 20.0 + }, + { + "id": "f4265-2", + "kind": "commit", + "label": "f4265", + "col": 2, + "row": 3, + "dy": 20.0 + }, + { + "id": "master-2", + "kind": "ref", + "label": "master", + "col": 2, + "row": 4 + }, + { + "id": "origin-master", + "kind": "ref", + "label": "origin/master", + "col": 2, + "row": 3, + "dy": -33.0 + } + ], + "edges": [] +} diff --git a/figures/remote-branches-2.json b/figures/remote-branches-2.json new file mode 100644 index 0000000..ece7b0a --- /dev/null +++ b/figures/remote-branches-2.json @@ -0,0 +1,123 @@ +{ + "$schema": "./_schema.json", + "title": "remote branches 2", + "grid": { + "x": 116.7, + "y": 73.0 + }, + "nodes": [ + { + "id": "node_0b743", + "kind": "commit", + "label": "0b743", + "col": 0, + "row": 1, + "dx": 1.0, + "dy": -20.0 + }, + { + "id": "a6b4c", + "kind": "commit", + "label": "a6b4c", + "col": 1, + "row": 1, + "dx": 1.3, + "dy": -20.0 + }, + { + "id": "f4265", + "kind": "commit", + "label": "f4265", + "col": 2, + "row": 1, + "dx": 1.6, + "dy": -20.0 + }, + { + "id": "node_31b8e", + "kind": "commit", + "label": "31b8e", + "col": 3, + "row": 1, + "dy": -20.0 + }, + { + "id": "node_190a3", + "kind": "commit", + "label": "190a3", + "col": 4, + "row": 1, + "dx": -0.8, + "dy": -20.0 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 4, + "row": 0, + "dx": -0.8 + }, + { + "id": "node_0b743-2", + "kind": "commit", + "label": "0b743", + "col": 0, + "row": 3, + "dx": -1.0, + "dy": 20.0 + }, + { + "id": "a6b4c-2", + "kind": "commit", + "label": "a6b4c", + "col": 1, + "row": 3, + "dx": -0.7, + "dy": 20.0 + }, + { + "id": "f4265-2", + "kind": "commit", + "label": "f4265", + "col": 2, + "row": 3, + "dy": 20.0 + }, + { + "id": "a38de", + "kind": "commit", + "label": "a38de", + "col": 3, + "row": 3, + "dx": 0.9, + "dy": 20.0 + }, + { + "id": "node_893cf", + "kind": "commit", + "label": "893cf", + "col": 4, + "row": 3, + "dx": 1.2, + "dy": 20.0 + }, + { + "id": "master-2", + "kind": "ref", + "label": "master", + "col": 4, + "row": 4, + "dx": 1.2 + }, + { + "id": "origin-master", + "kind": "ref", + "label": "origin/master", + "col": 2, + "row": 3, + "dy": -33.0 + } + ], + "edges": [] +} diff --git a/figures/remote-branches-3.json b/figures/remote-branches-3.json new file mode 100644 index 0000000..c49fe99 --- /dev/null +++ b/figures/remote-branches-3.json @@ -0,0 +1,131 @@ +{ + "$schema": "./_schema.json", + "title": "remote branches 3", + "grid": { + "x": 117.3, + "y": 69.8 + }, + "nodes": [ + { + "id": "node_0b743", + "kind": "commit", + "label": "0b743", + "col": 0, + "row": 3, + "dy": 29.6 + }, + { + "id": "a6b4c", + "kind": "commit", + "label": "a6b4c", + "col": 1, + "row": 3, + "dy": 29.6 + }, + { + "id": "f4265", + "kind": "commit", + "label": "f4265", + "col": 2, + "row": 3, + "dx": -0.61, + "dy": 29.6 + }, + { + "id": "node_31b8e", + "kind": "commit", + "label": "31b8e", + "col": 3, + "row": 3, + "dy": 29.6 + }, + { + "id": "node_190a3", + "kind": "commit", + "label": "190a3", + "col": 4, + "row": 3, + "dy": 29.6 + }, + { + "id": "a38de", + "kind": "commit", + "label": "a38de", + "col": 3, + "row": 4, + "dy": 16.8 + }, + { + "id": "node_893cf", + "kind": "commit", + "label": "893cf", + "col": 4, + "row": 4, + "dy": 16.8 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 4, + "row": 5 + }, + { + "id": "origin-master", + "kind": "ref", + "label": "origin/master", + "col": 4, + "row": 3, + "dy": -23.4 + }, + { + "id": "node_0b743-2", + "kind": "commit", + "label": "0b743", + "col": 0, + "row": 1, + "dy": -16.8 + }, + { + "id": "a6b4c-2", + "kind": "commit", + "label": "a6b4c", + "col": 1, + "row": 1, + "dy": -16.8 + }, + { + "id": "f4265-2", + "kind": "commit", + "label": "f4265", + "col": 2, + "row": 1, + "dx": -0.61, + "dy": -16.8 + }, + { + "id": "node_31b8e-2", + "kind": "commit", + "label": "31b8e", + "col": 3, + "row": 1, + "dy": -16.8 + }, + { + "id": "node_190a3-2", + "kind": "commit", + "label": "190a3", + "col": 4, + "row": 1, + "dy": -16.8 + }, + { + "id": "master-2", + "kind": "ref", + "label": "master", + "col": 4, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/remote-branches-4.json b/figures/remote-branches-4.json new file mode 100644 index 0000000..611b08d --- /dev/null +++ b/figures/remote-branches-4.json @@ -0,0 +1,150 @@ +{ + "$schema": "./_schema.json", + "title": "remote branches 4", + "grid": { + "x": 85.7, + "y": 73.1 + }, + "nodes": [ + { + "id": "node_0b743", + "kind": "commit", + "label": "0b743", + "col": 0, + "row": 3, + "dx": 2.5, + "dy": 36.02 + }, + { + "id": "a6b4c", + "kind": "commit", + "label": "a6b4c", + "col": 1, + "row": 3, + "dx": 33.79, + "dy": 36.02 + }, + { + "id": "f4265", + "kind": "commit", + "label": "f4265", + "col": 3, + "row": 3, + "dx": -20.61, + "dy": 36.02 + }, + { + "id": "node_31b8e", + "kind": "commit", + "label": "31b8e", + "col": 4, + "row": 3, + "dx": 11.69, + "dy": 36.02 + }, + { + "id": "node_190a3", + "kind": "commit", + "label": "190a3", + "col": 6, + "row": 3, + "dx": -42.71, + "dy": 36.02 + }, + { + "id": "a38de", + "kind": "commit", + "label": "a38de", + "col": 4, + "row": 4, + "dx": 11.69, + "dy": 19.92 + }, + { + "id": "node_893cf", + "kind": "commit", + "label": "893cf", + "col": 6, + "row": 4, + "dx": -42.71, + "dy": 19.92 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 6, + "row": 5, + "dx": -42.7 + }, + { + "id": "origin-master", + "kind": "ref", + "label": "origin/master", + "col": 6, + "row": 3, + "dx": -42.7, + "dy": -16.98 + }, + { + "id": "f4265-2", + "kind": "commit", + "label": "f4265", + "col": 0, + "row": 1, + "dx": -2.5, + "dy": -19.78 + }, + { + "id": "node_31b8e-2", + "kind": "commit", + "label": "31b8e", + "col": 1, + "row": 1, + "dx": 26.79, + "dy": -19.78 + }, + { + "id": "node_190a3-2", + "kind": "commit", + "label": "190a3", + "col": 3, + "row": 1, + "dx": -28.61, + "dy": -19.78 + }, + { + "id": "master-2", + "kind": "ref", + "label": "master", + "col": 3, + "row": 0, + "dx": -28.6 + }, + { + "id": "f4265-3", + "kind": "commit", + "label": "f4265", + "col": 5, + "row": 1, + "dx": -29.0, + "dy": -19.78 + }, + { + "id": "node_31b8e-3", + "kind": "commit", + "label": "31b8e", + "col": 6, + "row": 1, + "dy": -19.78 + }, + { + "id": "master-3", + "kind": "ref", + "label": "master", + "col": 6, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/remote-branches-5.json b/figures/remote-branches-5.json new file mode 100644 index 0000000..ab0c04c --- /dev/null +++ b/figures/remote-branches-5.json @@ -0,0 +1,159 @@ +{ + "$schema": "./_schema.json", + "title": "remote branches 5", + "grid": { + "x": 85.9, + "y": 73.0 + }, + "nodes": [ + { + "id": "node_0b743", + "kind": "commit", + "label": "0b743", + "col": 0, + "row": 3, + "dx": 1.6, + "dy": 36.0 + }, + { + "id": "a6b4c", + "kind": "commit", + "label": "a6b4c", + "col": 1, + "row": 3, + "dx": 32.7, + "dy": 36.0 + }, + { + "id": "f4265", + "kind": "commit", + "label": "f4265", + "col": 3, + "row": 3, + "dx": -22.1, + "dy": 36.0 + }, + { + "id": "node_31b8e", + "kind": "commit", + "label": "31b8e", + "col": 4, + "row": 3, + "dx": 10.0, + "dy": 36.0 + }, + { + "id": "node_190a3", + "kind": "commit", + "label": "190a3", + "col": 5, + "row": 3, + "dx": 41.1, + "dy": 36.0 + }, + { + "id": "a38de", + "kind": "commit", + "label": "a38de", + "col": 4, + "row": 4, + "dx": 10.0, + "dy": 20.0 + }, + { + "id": "node_893cf", + "kind": "commit", + "label": "893cf", + "col": 5, + "row": 4, + "dx": 41.1, + "dy": 20.0 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 5, + "row": 5, + "dx": 41.1 + }, + { + "id": "origin-master", + "kind": "ref", + "label": "origin/master", + "col": 5, + "row": 3, + "dx": 41.1, + "dy": -18.0 + }, + { + "id": "teamone-master", + "kind": "ref", + "label": "teamone/master", + "col": 4, + "row": 3, + "dx": 10.0, + "dy": -18.0 + }, + { + "id": "f4265-2", + "kind": "commit", + "label": "f4265", + "col": 0, + "row": 1, + "dx": -1.6, + "dy": -20.0 + }, + { + "id": "node_31b8e-2", + "kind": "commit", + "label": "31b8e", + "col": 1, + "row": 1, + "dx": 27.5, + "dy": -20.0 + }, + { + "id": "node_190a3-2", + "kind": "commit", + "label": "190a3", + "col": 3, + "row": 1, + "dx": -28.3, + "dy": -20.0 + }, + { + "id": "master-2", + "kind": "ref", + "label": "master", + "col": 3, + "row": 0, + "dx": -28.3 + }, + { + "id": "f4265-3", + "kind": "commit", + "label": "f4265", + "col": 5, + "row": 1, + "dx": -29.11, + "dy": -20.0 + }, + { + "id": "node_31b8e-3", + "kind": "commit", + "label": "31b8e", + "col": 6, + "row": 1, + "dy": -20.0 + }, + { + "id": "master-3", + "kind": "ref", + "label": "master", + "col": 6, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/replace1.json b/figures/replace1.json new file mode 100644 index 0000000..0189769 --- /dev/null +++ b/figures/replace1.json @@ -0,0 +1,54 @@ +{ + "$schema": "./_schema.json", + "title": "replace1", + "grid": { + "x": 135.4, + "y": 92.0 + }, + "nodes": [ + { + "id": "ef989", + "kind": "commit", + "label": "ef989", + "col": 0, + "row": 0, + "dx": -0.8 + }, + { + "id": "c6e1e", + "kind": "commit", + "label": "c6e1e", + "col": 0, + "row": 1 + }, + { + "id": "node_9c68f", + "kind": "commit", + "label": "9c68f", + "col": 0, + "row": 2 + }, + { + "id": "node_94570", + "kind": "commit", + "label": "94570", + "col": 0, + "row": 3 + }, + { + "id": "c1822", + "kind": "commit", + "label": "c1822", + "col": 0, + "row": 4 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/replace2.json b/figures/replace2.json new file mode 100644 index 0000000..206cd49 --- /dev/null +++ b/figures/replace2.json @@ -0,0 +1,61 @@ +{ + "$schema": "./_schema.json", + "title": "replace2", + "grid": { + "x": 137.2, + "y": 92.0 + }, + "nodes": [ + { + "id": "ef989", + "kind": "commit", + "label": "ef989", + "col": 0, + "row": 0 + }, + { + "id": "c6e1e", + "kind": "commit", + "label": "c6e1e", + "col": 0, + "row": 1 + }, + { + "id": "node_9c68f", + "kind": "commit", + "label": "9c68f", + "col": 0, + "row": 2 + }, + { + "id": "node_94570", + "kind": "commit", + "label": "94570", + "col": 0, + "row": 3 + }, + { + "id": "c1822", + "kind": "commit", + "label": "c1822", + "col": 0, + "row": 4 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 0 + }, + { + "id": "history", + "kind": "ref", + "label": "history", + "col": 1, + "row": 1, + "dy": 1.0 + } + ], + "edges": [] +} diff --git a/figures/replace3.json b/figures/replace3.json new file mode 100644 index 0000000..794dd65 --- /dev/null +++ b/figures/replace3.json @@ -0,0 +1,74 @@ +{ + "$schema": "./_schema.json", + "title": "replace3", + "grid": { + "x": 142.0, + "y": 92.0 + }, + "nodes": [ + { + "id": "node_622e8", + "kind": "commit", + "label": "622e8", + "col": 0, + "row": 2, + "dy": -0.94 + }, + { + "id": "c6e1e", + "kind": "commit", + "label": "c6e1e", + "col": 1, + "row": 1, + "dx": 4.97 + }, + { + "id": "node_9c68f", + "kind": "commit", + "label": "9c68f", + "col": 1, + "row": 2, + "dx": 4.97 + }, + { + "id": "node_94570", + "kind": "commit", + "label": "94570", + "col": 1, + "row": 3, + "dx": 4.97 + }, + { + "id": "c1822", + "kind": "commit", + "label": "c1822", + "col": 1, + "row": 4, + "dx": 4.97 + }, + { + "id": "history", + "kind": "ref", + "label": "history", + "col": 2, + "row": 1, + "dy": 1.05 + }, + { + "id": "ef989", + "kind": "commit", + "label": "ef989", + "col": 1, + "row": 0, + "dx": 4.97 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/replace4.json b/figures/replace4.json new file mode 100644 index 0000000..e1082ce --- /dev/null +++ b/figures/replace4.json @@ -0,0 +1,91 @@ +{ + "$schema": "./_schema.json", + "title": "replace4", + "grid": { + "x": 140.2, + "y": 92.0 + }, + "nodes": [ + { + "id": "ef989", + "kind": "commit", + "label": "ef989", + "col": 2, + "row": 0, + "dx": 2.91 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 0, + "row": 0 + }, + { + "id": "e146b", + "kind": "commit", + "label": "e146b", + "col": 1, + "row": 0, + "dx": -3.92 + }, + { + "id": "c6e1e", + "kind": "commit", + "label": "c6e1e", + "col": 2, + "row": 1, + "dx": 2.91 + }, + { + "id": "history", + "kind": "ref", + "label": "history", + "col": 3, + "row": 1, + "dy": 0.99 + }, + { + "id": "node_81a70", + "kind": "commit", + "label": "81a70", + "col": 1, + "row": 1, + "dx": -3.94 + }, + { + "id": "node_622e8", + "kind": "commit", + "label": "622e8", + "col": 1, + "row": 2, + "dx": -3.86, + "dy": -1.0 + }, + { + "id": "node_9c68f", + "kind": "commit", + "label": "9c68f", + "col": 2, + "row": 2, + "dx": 2.91 + }, + { + "id": "node_94570", + "kind": "commit", + "label": "94570", + "col": 2, + "row": 3, + "dx": 2.91 + }, + { + "id": "c1822", + "kind": "commit", + "label": "c1822", + "col": 2, + "row": 4, + "dx": 2.91 + } + ], + "edges": [] +} diff --git a/figures/replace5.json b/figures/replace5.json new file mode 100644 index 0000000..028014f --- /dev/null +++ b/figures/replace5.json @@ -0,0 +1,87 @@ +{ + "$schema": "./_schema.json", + "title": "replace5", + "grid": { + "x": 112.0, + "y": 62.9 + }, + "nodes": [ + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 0, + "row": 0 + }, + { + "id": "e146b", + "kind": "commit", + "label": "e146b", + "col": 1, + "row": 0, + "dx": 24.28 + }, + { + "id": "node_81a70", + "kind": "commit", + "label": "81a70", + "col": 1, + "row": 1, + "dx": 24.26, + "dy": 29.05 + }, + { + "id": "node_622e8", + "kind": "commit", + "label": "622e8", + "col": 1, + "row": 3, + "dx": 24.34, + "dy": -5.7 + }, + { + "id": "c6e1e", + "kind": "commit", + "label": "c6e1e", + "col": 2, + "row": 2, + "dx": -25.09, + "dy": -24.16 + }, + { + "id": "history", + "kind": "ref", + "label": "history", + "col": 3, + "row": 2, + "dy": -23.16 + }, + { + "id": "node_9c68f", + "kind": "commit", + "label": "9c68f", + "col": 2, + "row": 3, + "dx": -25.09, + "dy": 4.94 + }, + { + "id": "node_94570", + "kind": "commit", + "label": "94570", + "col": 2, + "row": 5, + "dx": -25.09, + "dy": -28.86 + }, + { + "id": "c1822", + "kind": "commit", + "label": "c1822", + "col": 2, + "row": 6, + "dx": -25.09 + } + ], + "edges": [] +} diff --git a/figures/rerere1.json b/figures/rerere1.json new file mode 100644 index 0000000..f43227e --- /dev/null +++ b/figures/rerere1.json @@ -0,0 +1,49 @@ +{ + "$schema": "./_schema.json", + "title": "rerere1", + "grid": { + "x": 152.9, + "y": 66.0 + }, + "nodes": [ + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 0 + }, + { + "id": "hello-world", + "kind": "commit", + "label": "hello world", + "col": 0, + "row": 1, + "dy": 1.9 + }, + { + "id": "world", + "kind": "commit", + "label": "world", + "col": 1, + "row": 1, + "dy": 1.9 + }, + { + "id": "hello", + "kind": "commit", + "label": "hello", + "col": 1, + "row": 2, + "dy": -2.1 + }, + { + "id": "i18n-world", + "kind": "ref", + "label": "i18n-world", + "col": 1, + "row": 3 + } + ], + "edges": [] +} diff --git a/figures/rerere2.json b/figures/rerere2.json new file mode 100644 index 0000000..1bfc8dc --- /dev/null +++ b/figures/rerere2.json @@ -0,0 +1,57 @@ +{ + "$schema": "./_schema.json", + "title": "rerere2", + "grid": { + "x": 152.9, + "y": 66.0 + }, + "nodes": [ + { + "id": "hello-world", + "kind": "commit", + "label": "hello world", + "col": 0, + "row": 1, + "dy": 2.0 + }, + { + "id": "hola-world", + "kind": "commit", + "label": "hola world", + "col": 1, + "row": 1, + "dy": 2.0 + }, + { + "id": "hola-mundo", + "kind": "commit", + "label": "hola mundo", + "col": 2, + "row": 1, + "dy": 2.0 + }, + { + "id": "hello-mundo", + "kind": "commit", + "label": "hello mundo", + "col": 1, + "row": 2, + "dy": -2.0 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 0 + }, + { + "id": "i18-world", + "kind": "ref", + "label": "i18-world", + "col": 1, + "row": 3 + } + ], + "edges": [] +} diff --git a/figures/rerere3.json b/figures/rerere3.json new file mode 100644 index 0000000..d279677 --- /dev/null +++ b/figures/rerere3.json @@ -0,0 +1,106 @@ +{ + "$schema": "./_schema.json", + "title": "rerere3", + "grid": { + "x": 79.5, + "y": 67.1 + }, + "nodes": [ + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 0, + "dx": 4.0, + "dy": -3.0 + }, + { + "id": "hello-world", + "kind": "commit", + "label": "hello world", + "col": 0, + "row": 1, + "dy": 4.9 + }, + { + "id": "hola-world", + "kind": "commit", + "label": "hola world", + "col": 2, + "row": 1, + "dx": -5.0, + "dy": 4.9 + }, + { + "id": "hola-mundo", + "kind": "commit", + "label": "hola mundo", + "col": 4, + "row": 1, + "dx": -12.0, + "dy": 4.9 + }, + { + "id": "i18-world", + "kind": "ref", + "label": "i18-world", + "col": 4, + "row": 0, + "dy": -5.0 + }, + { + "id": "hello-world-2", + "kind": "commit", + "label": "hello world", + "col": 0, + "row": 1, + "dy": 5.03 + }, + { + "id": "hola-world-2", + "kind": "commit", + "label": "hola world", + "col": 2, + "row": 1, + "dx": -6.13, + "dy": 5.02 + }, + { + "id": "master-2", + "kind": "ref", + "label": "master", + "col": 2, + "row": 0, + "dx": -6.13, + "dy": 4.0 + }, + { + "id": "hello-mundo", + "kind": "commit", + "label": "hello mundo", + "col": 2, + "row": 2, + "dx": -6.1 + }, + { + "id": "hola-mundo-2", + "kind": "commit", + "label": "hola mundo", + "col": 4, + "row": 1, + "dx": -12.0, + "dy": 5.02 + }, + { + "id": "i18-world-2", + "kind": "ref", + "label": "i18-world", + "col": 4, + "row": 0, + "dx": -12.0, + "dy": 3.99 + } + ], + "edges": [] +} diff --git a/figures/reset-checkout.json b/figures/reset-checkout.json new file mode 100644 index 0000000..f1e985c --- /dev/null +++ b/figures/reset-checkout.json @@ -0,0 +1,140 @@ +{ + "$schema": "./_schema.json", + "title": "reset checkout", + "grid": { + "x": 86.2, + "y": 53.3 + }, + "nodes": [ + { + "id": "commit-a", + "kind": "commit", + "label": "commit A", + "col": 4, + "row": 2, + "dx": -30.9, + "dy": 1.4 + }, + { + "id": "commit-b", + "kind": "commit", + "label": "commit B", + "col": 5, + "row": 2, + "dy": 1.4 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 1, + "dx": 12.35, + "dy": 0.7 + }, + { + "id": "develop", + "kind": "ref", + "label": "develop", + "col": 5, + "row": 1, + "dx": -43.05, + "dy": 0.7 + }, + { + "id": "head", + "kind": "tree", + "label": "HEAD", + "col": 5, + "row": 0, + "dx": -43.04 + }, + { + "id": "commit-a-2", + "kind": "commit", + "label": "commit A", + "col": 0, + "row": 4, + "dy": -1.2 + }, + { + "id": "commit-b-2", + "kind": "commit", + "label": "commit B", + "col": 1, + "row": 4, + "dx": 30.8, + "dy": -1.2 + }, + { + "id": "head-2", + "kind": "tree", + "label": "HEAD", + "col": 1, + "row": 2, + "dx": 30.8, + "dy": -2.6 + }, + { + "id": "master-2", + "kind": "ref", + "label": "master", + "col": 0, + "row": 3, + "dy": -1.89 + }, + { + "id": "develop-2", + "kind": "ref", + "label": "develop", + "col": 1, + "row": 3, + "dx": 30.81, + "dy": -1.89 + }, + { + "id": "commit-a-3", + "kind": "commit", + "label": "commit A", + "col": 3, + "row": 6, + "dx": 12.36 + }, + { + "id": "commit-b-3", + "kind": "commit", + "label": "commit B", + "col": 5, + "row": 6, + "dx": -43.03 + }, + { + "id": "master-3", + "kind": "ref", + "label": "master", + "col": 3, + "row": 5, + "dx": 12.35, + "dy": -0.59 + }, + { + "id": "develop-3", + "kind": "ref", + "label": "develop", + "col": 5, + "row": 5, + "dx": -43.04, + "dy": -0.51 + }, + { + "id": "head-3", + "kind": "tree", + "label": "HEAD", + "col": 3, + "row": 4, + "dx": 12.35, + "dy": -1.21 + } + ], + "edges": [] +} diff --git a/figures/reset-ex1.json b/figures/reset-ex1.json new file mode 100644 index 0000000..98bedac --- /dev/null +++ b/figures/reset-ex1.json @@ -0,0 +1,64 @@ +{ + "$schema": "./_schema.json", + "title": "reset ex1", + "grid": { + "x": 141.0, + "y": 86.6 + }, + "nodes": [ + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 1, + "row": 2, + "dy": 34.29 + }, + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 2, + "dx": 0.57, + "dy": 34.29 + }, + { + "id": "file-txt", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 2, + "row": 3 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 2, + "dy": 34.25 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 0 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 0, + "row": 1, + "dy": -41.6 + } + ], + "edges": [] +} diff --git a/figures/reset-ex2.json b/figures/reset-ex2.json new file mode 100644 index 0000000..80be3a1 --- /dev/null +++ b/figures/reset-ex2.json @@ -0,0 +1,73 @@ +{ + "$schema": "./_schema.json", + "title": "reset ex2", + "grid": { + "x": 140.9, + "y": 86.3 + }, + "nodes": [ + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 2, + "dy": 34.82 + }, + { + "id": "file-txt", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 2, + "row": 3 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 2, + "dy": 34.85 + }, + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 1, + "row": 2, + "dy": 34.82 + }, + { + "id": "file-txt-2", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 1, + "row": 3 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 0 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 0, + "row": 1, + "dy": -41.3 + } + ], + "edges": [] +} diff --git a/figures/reset-ex3.json b/figures/reset-ex3.json new file mode 100644 index 0000000..8011eaf --- /dev/null +++ b/figures/reset-ex3.json @@ -0,0 +1,91 @@ +{ + "$schema": "./_schema.json", + "title": "reset ex3", + "grid": { + "x": 140.9, + "y": 70.1 + }, + "nodes": [ + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 0 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 0, + "row": 1, + "dy": -25.1 + }, + { + "id": "file-txt", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 2, + "row": 4 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 3, + "dy": 14.03 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 3, + "dy": 14.2 + }, + { + "id": "eb43bf8", + "kind": "tree", + "label": "eb43bf8", + "col": 0, + "row": 4 + }, + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 1, + "row": 3, + "dy": 14.2 + }, + { + "id": "file-txt-2", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 1, + "row": 4 + }, + { + "id": "file-txt-3", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 0, + "row": 2, + "dy": -17.35 + } + ], + "edges": [] +} diff --git a/figures/reset-ex4.json b/figures/reset-ex4.json new file mode 100644 index 0000000..244529f --- /dev/null +++ b/figures/reset-ex4.json @@ -0,0 +1,91 @@ +{ + "$schema": "./_schema.json", + "title": "reset ex4", + "grid": { + "x": 141.0, + "y": 70.2 + }, + "nodes": [ + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 1, + "row": 3, + "dy": 14.01 + }, + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 3, + "dy": 14.01 + }, + { + "id": "file-txt", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 2, + "row": 4 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 3, + "dy": 14.06 + }, + { + "id": "file-txt-2", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 1, + "row": 4 + }, + { + "id": "eb43bf8", + "kind": "tree", + "label": "eb43bf8", + "col": 0, + "row": 4 + }, + { + "id": "file-txt-3", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 0, + "row": 2, + "dy": -18.29 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 0 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 0, + "row": 1, + "dy": -25.2 + } + ], + "edges": [] +} diff --git a/figures/reset-ex5.json b/figures/reset-ex5.json new file mode 100644 index 0000000..9d54685 --- /dev/null +++ b/figures/reset-ex5.json @@ -0,0 +1,91 @@ +{ + "$schema": "./_schema.json", + "title": "reset ex5", + "grid": { + "x": 141.0, + "y": 70.2 + }, + "nodes": [ + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 1, + "row": 3, + "dy": 13.75 + }, + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 3, + "dy": 13.75 + }, + { + "id": "file-txt", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 2, + "row": 4 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 3, + "dy": 13.8 + }, + { + "id": "eb43bf8", + "kind": "tree", + "label": "eb43bf8", + "col": 0, + "row": 4 + }, + { + "id": "file-txt-2", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 0, + "row": 2, + "dy": -18.55 + }, + { + "id": "file-txt-3", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 1, + "row": 4 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 0 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 0, + "row": 1, + "dy": -25.2 + } + ], + "edges": [] +} diff --git a/figures/reset-ex6.json b/figures/reset-ex6.json new file mode 100644 index 0000000..1a23aa9 --- /dev/null +++ b/figures/reset-ex6.json @@ -0,0 +1,104 @@ +{ + "$schema": "./_schema.json", + "title": "reset ex6", + "grid": { + "x": 140.9, + "y": 70.0 + }, + "nodes": [ + { + "id": "file-txt", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 2, + "row": 4 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 3, + "dy": 13.67 + }, + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 1, + "row": 3, + "dy": 13.62 + }, + { + "id": "file-txt-2", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 1, + "row": 4 + }, + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 3, + "dy": 13.62 + }, + { + "id": "node_9e5e6a4", + "kind": "ref", + "label": "9e5e6a4", + "col": 0, + "row": 4 + }, + { + "id": "file-txt-3", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 0, + "row": 2, + "dy": -19.01 + }, + { + "id": "file-txt-4", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 1, + "row": 2, + "dy": -19.01 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 1, + "row": 0, + "dx": -0.7 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 1, + "row": 1, + "dx": -0.7, + "dy": -25.0 + } + ], + "edges": [] +} diff --git a/figures/reset-hard.json b/figures/reset-hard.json new file mode 100644 index 0000000..e298807 --- /dev/null +++ b/figures/reset-hard.json @@ -0,0 +1,103 @@ +{ + "$schema": "./_schema.json", + "title": "reset hard", + "grid": { + "x": 140.9, + "y": 69.9 + }, + "nodes": [ + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 1, + "row": 0 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 1, + "row": 1, + "dy": -25.11 + }, + { + "id": "file-txt", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 2, + "row": 4 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 3, + "dy": 13.58 + }, + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 1, + "row": 3, + "dy": 13.52 + }, + { + "id": "file-txt-2", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 1, + "row": 4 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 3, + "dy": 13.52 + }, + { + "id": "node_9e5e6a4", + "kind": "ref", + "label": "9e5e6a4", + "col": 0, + "row": 4 + }, + { + "id": "file-txt-3", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 0, + "row": 2, + "dy": -19.28 + }, + { + "id": "file-txt-4", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 1, + "row": 2, + "dx": -0.76, + "dy": -19.29 + } + ], + "edges": [] +} diff --git a/figures/reset-mixed.json b/figures/reset-mixed.json new file mode 100644 index 0000000..16b1bca --- /dev/null +++ b/figures/reset-mixed.json @@ -0,0 +1,93 @@ +{ + "$schema": "./_schema.json", + "title": "reset mixed", + "grid": { + "x": 140.9, + "y": 69.9 + }, + "nodes": [ + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 1, + "row": 0 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 1, + "row": 1, + "dy": -25.11 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 3, + "dy": 13.58 + }, + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 1, + "row": 3, + "dy": 13.52 + }, + { + "id": "file-txt", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 1, + "row": 4 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 3, + "dy": 13.52 + }, + { + "id": "node_9e5e6a4", + "kind": "ref", + "label": "9e5e6a4", + "col": 0, + "row": 4 + }, + { + "id": "file-txt-2", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 0, + "row": 2, + "dy": -19.28 + }, + { + "id": "file-txt-3", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 1, + "row": 2, + "dx": -0.76, + "dy": -19.29 + } + ], + "edges": [] +} diff --git a/figures/reset-path1.json b/figures/reset-path1.json new file mode 100644 index 0000000..9b8b8db --- /dev/null +++ b/figures/reset-path1.json @@ -0,0 +1,91 @@ +{ + "$schema": "./_schema.json", + "title": "reset path1", + "grid": { + "x": 141.0, + "y": 70.2 + }, + "nodes": [ + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 1, + "row": 3, + "dy": 14.01 + }, + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 3, + "dy": 14.01 + }, + { + "id": "file-txt", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 2, + "row": 4 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 3, + "dy": 14.06 + }, + { + "id": "file-txt-2", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 1, + "row": 4 + }, + { + "id": "eb43bf8", + "kind": "tree", + "label": "eb43bf8", + "col": 0, + "row": 4 + }, + { + "id": "file-txt-3", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 0, + "row": 2, + "dy": -18.29 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 0 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 0, + "row": 1, + "dy": -25.2 + } + ], + "edges": [] +} diff --git a/figures/reset-path2.json b/figures/reset-path2.json new file mode 100644 index 0000000..7192b90 --- /dev/null +++ b/figures/reset-path2.json @@ -0,0 +1,81 @@ +{ + "$schema": "./_schema.json", + "title": "reset path2", + "grid": { + "x": 141.0, + "y": 70.3 + }, + "nodes": [ + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 1, + "row": 3, + "dy": 13.71 + }, + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 3, + "dy": 13.71 + }, + { + "id": "file-txt", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 2, + "row": 4 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 3, + "dy": 13.76 + }, + { + "id": "eb43bf8", + "kind": "tree", + "label": "eb43bf8", + "col": 0, + "row": 4 + }, + { + "id": "file-txt-2", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 0, + "row": 2, + "dy": -18.49 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 0 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 0, + "row": 1, + "dy": -25.3 + } + ], + "edges": [] +} diff --git a/figures/reset-path3.json b/figures/reset-path3.json new file mode 100644 index 0000000..716137d --- /dev/null +++ b/figures/reset-path3.json @@ -0,0 +1,91 @@ +{ + "$schema": "./_schema.json", + "title": "reset path3", + "grid": { + "x": 141.5, + "y": 69.7 + }, + "nodes": [ + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 2, + "row": 0, + "dx": 0.76 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 2, + "row": 1, + "dx": 0.76, + "dy": -24.91 + }, + { + "id": "file-txt", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 0, + "row": 2, + "dy": -18.69 + }, + { + "id": "file-txt-2", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 1, + "row": 2, + "dx": -0.85, + "dy": -18.69 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 3, + "dx": -1.59, + "dy": 14.06 + }, + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 1, + "row": 3, + "dx": -0.89, + "dy": 14.01 + }, + { + "id": "file-txt-3", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 1, + "row": 4, + "dx": -0.89 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 3, + "dy": 14.01 + } + ], + "edges": [] +} diff --git a/figures/reset-soft.json b/figures/reset-soft.json new file mode 100644 index 0000000..10715f8 --- /dev/null +++ b/figures/reset-soft.json @@ -0,0 +1,85 @@ +{ + "$schema": "./_schema.json", + "title": "reset soft", + "grid": { + "x": 140.8, + "y": 69.8 + }, + "nodes": [ + { + "id": "file-txt", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 0, + "row": 2, + "dy": -18.89 + }, + { + "id": "file-txt-2", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 1, + "row": 2, + "dx": -0.5, + "dy": -18.89 + }, + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 1, + "row": 0, + "dx": 0.7 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 1, + "row": 1, + "dx": 0.7, + "dy": -25.01 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 3, + "dy": 14.06 + }, + { + "id": "node_9e5e6a4", + "kind": "ref", + "label": "9e5e6a4", + "col": 0, + "row": 4 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 3, + "dy": 14.01 + }, + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 1, + "row": 3, + "dy": 14.01 + } + ], + "edges": [] +} diff --git a/figures/reset-squash-r1.json b/figures/reset-squash-r1.json new file mode 100644 index 0000000..fd61248 --- /dev/null +++ b/figures/reset-squash-r1.json @@ -0,0 +1,138 @@ +{ + "$schema": "./_schema.json", + "title": "reset squash r1", + "grid": { + "x": 141.4, + "y": 50.5 + }, + "nodes": [ + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 3, + "row": 0, + "dx": 0.73 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 3, + "row": 1, + "dx": 0.73, + "dy": -5.71 + }, + { + "id": "file-a-txt-v1", + "kind": "tree", + "label": "file-a.txt v1", + "col": 1, + "row": 2, + "dy": 12.72 + }, + { + "id": "file-b-txt-v1", + "kind": "commit", + "label": "file-b.txt v1", + "col": 2, + "row": 3, + "dy": -5.78 + }, + { + "id": "file-a-txt-v3", + "kind": "blob", + "label": "file-a.txt v3", + "col": 3, + "row": 2, + "dy": 12.57 + }, + { + "id": "file-b-txt-v1-2", + "kind": "commit", + "label": "file-b.txt v1", + "col": 2, + "row": 3, + "dy": -5.78 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 3, + "row": 4, + "dx": -0.78, + "dy": 21.67 + }, + { + "id": "file-a-txt-v3-2", + "kind": "blob", + "label": "file-a.txt v3", + "col": 3, + "row": 5, + "dx": -0.77, + "dy": 18.06 + }, + { + "id": "file-b-txt-v1-3", + "kind": "commit", + "label": "file-b.txt v1", + "col": 2, + "row": 6, + "dx": -1.37 + }, + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 2, + "row": 4, + "dy": 21.67 + }, + { + "id": "file-a-txt-v3-3", + "kind": "blob", + "label": "file-a.txt v3", + "col": 2, + "row": 5, + "dy": 18.06 + }, + { + "id": "file-b-txt-v1-4", + "kind": "commit", + "label": "file-b.txt v1", + "col": 1, + "row": 6, + "dx": -0.58 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 1, + "row": 4, + "dx": 0.6, + "dy": 21.67 + }, + { + "id": "file-a-txt-v3-4", + "kind": "blob", + "label": "file-a.txt v3", + "col": 1, + "row": 5, + "dx": 0.6, + "dy": 18.06 + }, + { + "id": "file-b-txt-v1-5", + "kind": "commit", + "label": "file-b.txt v1", + "col": 0, + "row": 6 + } + ], + "edges": [] +} diff --git a/figures/reset-squash-r2.json b/figures/reset-squash-r2.json new file mode 100644 index 0000000..fe59000 --- /dev/null +++ b/figures/reset-squash-r2.json @@ -0,0 +1,153 @@ +{ + "$schema": "./_schema.json", + "title": "reset squash r2", + "grid": { + "x": 224.9, + "y": 39.3 + }, + "nodes": [ + { + "id": "node_38eb946", + "kind": "blob", + "label": "38eb946", + "col": 1, + "row": 7, + "dx": -82.9, + "dy": 7.25 + }, + { + "id": "file-b-txt-v1", + "kind": "commit", + "label": "file-b.txt v1", + "col": 0, + "row": 8 + }, + { + "id": "file-a-txt-v1", + "kind": "tree", + "label": "file-a.txt v1", + "col": 3, + "row": 3, + "dx": -57.45, + "dy": -4.54 + }, + { + "id": "file-b-txt-v1-2", + "kind": "commit", + "label": "file-b.txt v1", + "col": 3, + "row": 4, + "dx": 83.55, + "dy": -11.84 + }, + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 3, + "row": 0, + "dx": -57.46 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 3, + "row": 1, + "dx": -57.46, + "dy": 5.49 + }, + { + "id": "file-a-txt-v3", + "kind": "blob", + "label": "file-a.txt v3", + "col": 4, + "row": 3, + "dx": 0.65, + "dy": -4.69 + }, + { + "id": "file-b-txt-v1-3", + "kind": "commit", + "label": "file-b.txt v1", + "col": 3, + "row": 4, + "dx": 83.55, + "dy": -11.84 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 4, + "row": 6, + "dy": -12.46 + }, + { + "id": "file-a-txt-v3-2", + "kind": "blob", + "label": "file-a.txt v3", + "col": 4, + "row": 7, + "dy": -4.87 + }, + { + "id": "file-b-txt-v1-4", + "kind": "commit", + "label": "file-b.txt v1", + "col": 3, + "row": 8, + "dx": 82.68, + "dy": -12.02 + }, + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 3, + "row": 6, + "dx": 83.75, + "dy": -12.46 + }, + { + "id": "file-a-txt-v3-3", + "kind": "blob", + "label": "file-a.txt v3", + "col": 3, + "row": 7, + "dx": 83.76, + "dy": -4.87 + }, + { + "id": "file-b-txt-v1-5", + "kind": "commit", + "label": "file-b.txt v1", + "col": 3, + "row": 8, + "dx": -58.24, + "dy": -12.02 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 3, + "row": 6, + "dx": -57.2, + "dy": -12.46 + }, + { + "id": "eb43bf8", + "kind": "tree", + "label": "eb43bf8", + "col": 3, + "row": 7, + "dx": -57.2, + "dy": -4.74 + } + ], + "edges": [] +} diff --git a/figures/reset-squash-r3.json b/figures/reset-squash-r3.json new file mode 100644 index 0000000..40dfc24 --- /dev/null +++ b/figures/reset-squash-r3.json @@ -0,0 +1,152 @@ +{ + "$schema": "./_schema.json", + "title": "reset squash r3", + "grid": { + "x": 141.4, + "y": 49.1 + }, + "nodes": [ + { + "id": "file-a-txt-v1", + "kind": "tree", + "label": "file-a.txt v1", + "col": 1, + "row": 4, + "dy": 7.3 + }, + { + "id": "file-b-txt-v1", + "kind": "commit", + "label": "file-b.txt v1", + "col": 2, + "row": 5, + "dy": -9.76 + }, + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 3, + "row": 0 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 3, + "row": 1, + "dy": -4.31 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 3, + "row": 6, + "dx": -0.7, + "dy": 19.15 + }, + { + "id": "file-a-txt-v3", + "kind": "blob", + "label": "file-a.txt v3", + "col": 3, + "row": 7, + "dx": -0.7, + "dy": 16.94 + }, + { + "id": "file-b-txt-v1-2", + "kind": "commit", + "label": "file-b.txt v1", + "col": 2, + "row": 8, + "dx": -1.3 + }, + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 2, + "row": 6, + "dy": 19.15 + }, + { + "id": "file-a-txt-v3-2", + "kind": "blob", + "label": "file-a.txt v3", + "col": 2, + "row": 7, + "dy": 16.94 + }, + { + "id": "file-b-txt-v1-3", + "kind": "commit", + "label": "file-b.txt v1", + "col": 1, + "row": 8, + "dx": -0.68 + }, + { + "id": "node_68aef35", + "kind": "blob", + "label": "68aef35", + "col": 1, + "row": 7, + "dx": 0.6, + "dy": 17.11 + }, + { + "id": "file-b-txt-v1-4", + "kind": "commit", + "label": "file-b.txt v1", + "col": 0, + "row": 8 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 1, + "row": 6, + "dx": 0.6, + "dy": 19.14 + }, + { + "id": "node_68aef35-2", + "kind": "blob", + "label": "68aef35", + "col": 3, + "row": 2, + "dy": 11.42 + }, + { + "id": "file-b-txt-v1-5", + "kind": "commit", + "label": "file-b.txt v1", + "col": 2, + "row": 3, + "dy": -5.53 + }, + { + "id": "node_68aef35-3", + "kind": "blob", + "label": "68aef35", + "col": 3, + "row": 2, + "dy": 11.42 + }, + { + "id": "file-b-txt-v1-6", + "kind": "commit", + "label": "file-b.txt v1", + "col": 2, + "row": 3, + "dy": -5.53 + } + ], + "edges": [] +} diff --git a/figures/reset-start.json b/figures/reset-start.json new file mode 100644 index 0000000..a91260b --- /dev/null +++ b/figures/reset-start.json @@ -0,0 +1,77 @@ +{ + "$schema": "./_schema.json", + "title": "reset start", + "grid": { + "x": 141.4, + "y": 74.6 + }, + "nodes": [ + { + "id": "file-txt", + "kind": "tree", + "label": [ + "file.txt", + "v1" + ], + "col": 0, + "row": 2, + "dy": -28.14 + }, + { + "id": "file-txt-2", + "kind": "ref", + "label": [ + "file.txt", + "v2" + ], + "col": 1, + "row": 2, + "dx": -1.16, + "dy": -28.14 + }, + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "col": 2, + "row": 0, + "dx": 0.54 + }, + { + "id": "master", + "kind": "blob", + "label": "master", + "col": 2, + "row": 1, + "dx": 0.54, + "dy": -29.81 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 3, + "dx": -1.3 + }, + { + "id": "index", + "kind": "tree", + "label": "Index", + "col": 1, + "row": 3, + "dx": -0.57 + }, + { + "id": "head-2", + "kind": "commit", + "label": "HEAD", + "col": 0, + "row": 3 + } + ], + "edges": [] +} diff --git a/figures/reset-workflow.json b/figures/reset-workflow.json new file mode 100644 index 0000000..2cda03e --- /dev/null +++ b/figures/reset-workflow.json @@ -0,0 +1,36 @@ +{ + "$schema": "./_schema.json", + "title": "reset workflow", + "layout": "absolute", + "canvas": { + "w": 401.0, + "h": 221.0 + }, + "nodes": [ + { + "id": "index", + "kind": "tree", + "label": "Index", + "x": 144.21, + "y": 4.0 + }, + { + "id": "head", + "kind": "commit", + "label": "HEAD", + "x": 284.95, + "y": 4.0 + }, + { + "id": "working", + "kind": "ref", + "label": [ + "Working", + "Directory" + ], + "x": 3.47, + "y": 4.0 + } + ], + "edges": [] +} diff --git a/figures/small-team-1.json b/figures/small-team-1.json new file mode 100644 index 0000000..b657418 --- /dev/null +++ b/figures/small-team-1.json @@ -0,0 +1,57 @@ +{ + "$schema": "./_schema.json", + "title": "small team 1", + "grid": { + "x": 118.9, + "y": 54.3 + }, + "nodes": [ + { + "id": "node_4b078", + "kind": "commit", + "label": "4b078", + "col": 0, + "row": 1, + "dy": 3.2 + }, + { + "id": "node_1edee", + "kind": "commit", + "label": "1edee", + "col": 1, + "row": 1, + "dy": 3.2 + }, + { + "id": "node_738ee", + "kind": "john", + "label": "738ee", + "col": 2, + "row": 1, + "dy": 3.2 + }, + { + "id": "fbff5", + "kind": "jessica", + "label": "fbff5", + "col": 2, + "row": 2, + "dy": -3.1 + }, + { + "id": "origin-master", + "kind": "ref", + "label": "origin/master", + "col": 2, + "row": 3 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/small-team-2.json b/figures/small-team-2.json new file mode 100644 index 0000000..e0958fb --- /dev/null +++ b/figures/small-team-2.json @@ -0,0 +1,65 @@ +{ + "$schema": "./_schema.json", + "title": "small team 2", + "grid": { + "x": 119.0, + "y": 54.7 + }, + "nodes": [ + { + "id": "node_4b078", + "kind": "commit", + "label": "4b078", + "col": 0, + "row": 1, + "dy": 3.8 + }, + { + "id": "node_1edee", + "kind": "commit", + "label": "1edee", + "col": 1, + "row": 1, + "dy": 3.8 + }, + { + "id": "node_738ee", + "kind": "john", + "label": "738ee", + "col": 2, + "row": 1, + "dy": 3.8 + }, + { + "id": "node_72bbc", + "kind": "john", + "label": "72bbc", + "col": 3, + "row": 1, + "dy": 3.8 + }, + { + "id": "fbff5", + "kind": "jessica", + "label": "fbff5", + "col": 2, + "row": 2, + "dy": -2.9 + }, + { + "id": "origin-master", + "kind": "ref", + "label": "origin/master", + "col": 2, + "row": 3 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/small-team-3.json b/figures/small-team-3.json new file mode 100644 index 0000000..07dea0e --- /dev/null +++ b/figures/small-team-3.json @@ -0,0 +1,65 @@ +{ + "$schema": "./_schema.json", + "title": "small team 3", + "grid": { + "x": 119.0, + "y": 37.3 + }, + "nodes": [ + { + "id": "node_4b078", + "kind": "commit", + "label": "4b078", + "col": 0, + "row": 2, + "dy": -18.6 + }, + { + "id": "node_1edee", + "kind": "commit", + "label": "1edee", + "col": 1, + "row": 2, + "dy": -18.6 + }, + { + "id": "node_738ee", + "kind": "john", + "label": "738ee", + "col": 2, + "row": 2, + "dy": -18.6 + }, + { + "id": "node_72bbc", + "kind": "john", + "label": "72bbc", + "col": 3, + "row": 2, + "dy": -18.6 + }, + { + "id": "fbff5", + "kind": "jessica", + "label": "fbff5", + "col": 2, + "row": 3, + "dy": -7.9 + }, + { + "id": "origin-master", + "kind": "ref", + "label": "origin/master", + "col": 3, + "row": 3 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/small-team-4.json b/figures/small-team-4.json new file mode 100644 index 0000000..cb517d3 --- /dev/null +++ b/figures/small-team-4.json @@ -0,0 +1,74 @@ +{ + "$schema": "./_schema.json", + "title": "small team 4", + "grid": { + "x": 119.0, + "y": 56.0 + }, + "nodes": [ + { + "id": "node_4b078", + "kind": "commit", + "label": "4b078", + "col": 0, + "row": 1 + }, + { + "id": "node_1edee", + "kind": "commit", + "label": "1edee", + "col": 1, + "row": 1 + }, + { + "id": "fbff5", + "kind": "jessica", + "label": "fbff5", + "col": 2, + "row": 1 + }, + { + "id": "node_8149a", + "kind": "jessica", + "label": "8149a", + "col": 3, + "row": 1 + }, + { + "id": "node_23ac6", + "kind": "jessica", + "label": "23ac6", + "col": 4, + "row": 1 + }, + { + "id": "node_4af42", + "kind": "jessica", + "label": "4af42", + "col": 5, + "row": 1 + }, + { + "id": "origin-master", + "kind": "ref", + "label": "origin/master", + "col": 2, + "row": 2 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 0 + }, + { + "id": "issue54", + "kind": "ref", + "label": "issue54", + "col": 5, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/small-team-5.json b/figures/small-team-5.json new file mode 100644 index 0000000..8db1ef3 --- /dev/null +++ b/figures/small-team-5.json @@ -0,0 +1,96 @@ +{ + "$schema": "./_schema.json", + "title": "small team 5", + "grid": { + "x": 119.0, + "y": 54.3 + }, + "nodes": [ + { + "id": "node_4b078", + "kind": "commit", + "label": "4b078", + "col": 0, + "row": 1, + "dy": 1.71 + }, + { + "id": "node_1edee", + "kind": "commit", + "label": "1edee", + "col": 1, + "row": 1, + "dy": 1.71 + }, + { + "id": "fbff5", + "kind": "jessica", + "label": "fbff5", + "col": 2, + "row": 1, + "dy": 1.71 + }, + { + "id": "node_738ee", + "kind": "john", + "label": "738ee", + "col": 2, + "row": 2, + "dy": -1.59 + }, + { + "id": "node_72bbc", + "kind": "john", + "label": "72bbc", + "col": 3, + "row": 2, + "dy": -1.59 + }, + { + "id": "node_8149a", + "kind": "jessica", + "label": "8149a", + "col": 3, + "row": 1, + "dy": 1.61 + }, + { + "id": "node_23ac6", + "kind": "jessica", + "label": "23ac6", + "col": 4, + "row": 1, + "dy": 1.61 + }, + { + "id": "node_4af42", + "kind": "jessica", + "label": "4af42", + "col": 5, + "row": 1, + "dy": 1.61 + }, + { + "id": "origin-master", + "kind": "ref", + "label": "origin/master", + "col": 3, + "row": 3 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 2, + "row": 0 + }, + { + "id": "issue54", + "kind": "ref", + "label": "issue54", + "col": 5, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/small-team-6.json b/figures/small-team-6.json new file mode 100644 index 0000000..e3463c6 --- /dev/null +++ b/figures/small-team-6.json @@ -0,0 +1,110 @@ +{ + "$schema": "./_schema.json", + "title": "small team 6", + "grid": { + "x": 119.2, + "y": 54.7 + }, + "nodes": [ + { + "id": "node_4b078", + "kind": "commit", + "label": "4b078", + "col": 0, + "row": 1, + "dy": 1.3 + }, + { + "id": "node_1edee", + "kind": "commit", + "label": "1edee", + "col": 1, + "row": 1, + "dy": 1.3 + }, + { + "id": "fbff5", + "kind": "jessica", + "label": "fbff5", + "col": 2, + "row": 1, + "dy": 1.29 + }, + { + "id": "node_738ee", + "kind": "john", + "label": "738ee", + "col": 2, + "row": 2, + "dy": -1.4 + }, + { + "id": "node_72bbc", + "kind": "john", + "label": "72bbc", + "col": 3, + "row": 2, + "dx": -0.6, + "dy": -1.4 + }, + { + "id": "node_8059c", + "kind": "jessica", + "label": "8059c", + "col": 6, + "row": 2, + "dy": -1.4 + }, + { + "id": "node_8149a", + "kind": "jessica", + "label": "8149a", + "col": 3, + "row": 1, + "dx": -0.6, + "dy": 1.3 + }, + { + "id": "node_23ac6", + "kind": "jessica", + "label": "23ac6", + "col": 4, + "row": 1, + "dx": -0.8, + "dy": 1.3 + }, + { + "id": "node_4af42", + "kind": "jessica", + "label": "4af42", + "col": 5, + "row": 1, + "dx": -1.0, + "dy": 1.3 + }, + { + "id": "origin-master", + "kind": "ref", + "label": "origin/master", + "col": 3, + "row": 3, + "dx": -0.6 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 6, + "row": 0 + }, + { + "id": "issue54", + "kind": "ref", + "label": "issue54", + "col": 5, + "row": 0, + "dx": -1.0 + } + ], + "edges": [] +} diff --git a/figures/small-team-7.json b/figures/small-team-7.json new file mode 100644 index 0000000..791bdf1 --- /dev/null +++ b/figures/small-team-7.json @@ -0,0 +1,109 @@ +{ + "$schema": "./_schema.json", + "title": "small team 7", + "grid": { + "x": 119.2, + "y": 54.7 + }, + "nodes": [ + { + "id": "node_4b078", + "kind": "commit", + "label": "4b078", + "col": 0, + "row": 1, + "dy": 1.35 + }, + { + "id": "node_1edee", + "kind": "commit", + "label": "1edee", + "col": 1, + "row": 1, + "dy": 1.35 + }, + { + "id": "fbff5", + "kind": "jessica", + "label": "fbff5", + "col": 2, + "row": 1, + "dy": 1.34 + }, + { + "id": "node_738ee", + "kind": "john", + "label": "738ee", + "col": 2, + "row": 2, + "dy": -1.35 + }, + { + "id": "node_72bbc", + "kind": "john", + "label": "72bbc", + "col": 3, + "row": 2, + "dx": -0.6, + "dy": -1.35 + }, + { + "id": "node_8059c", + "kind": "jessica", + "label": "8059c", + "col": 6, + "row": 2, + "dy": -1.35 + }, + { + "id": "node_8149a", + "kind": "jessica", + "label": "8149a", + "col": 3, + "row": 1, + "dx": -0.6, + "dy": 1.35 + }, + { + "id": "node_23ac6", + "kind": "jessica", + "label": "23ac6", + "col": 4, + "row": 1, + "dx": -0.8, + "dy": 1.35 + }, + { + "id": "node_4af42", + "kind": "jessica", + "label": "4af42", + "col": 5, + "row": 1, + "dx": -1.0, + "dy": 1.35 + }, + { + "id": "origin-master", + "kind": "ref", + "label": "origin/master", + "col": 6, + "row": 3 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 6, + "row": 0 + }, + { + "id": "issue54", + "kind": "ref", + "label": "issue54", + "col": 5, + "row": 0, + "dx": -1.0 + } + ], + "edges": [] +} diff --git a/figures/small-team-flow.json b/figures/small-team-flow.json new file mode 100644 index 0000000..6e81ee0 --- /dev/null +++ b/figures/small-team-flow.json @@ -0,0 +1,57 @@ +{ + "$schema": "./_schema.json", + "title": "small team flow", + "grid": { + "x": 114.5, + "y": 505.0 + }, + "nodes": [ + { + "id": "server", + "kind": "ref", + "label": "Server", + "col": 1, + "row": 0, + "dx": 0.5 + }, + { + "id": "john", + "kind": "ref", + "label": "John", + "col": 2, + "row": 0 + }, + { + "id": "jessica", + "kind": "ref", + "label": "Jessica", + "col": 0, + "row": 0, + "dx": -1.0 + }, + { + "id": "server-2", + "kind": "ref", + "label": "Server", + "col": 1, + "row": 1, + "dx": 0.5 + }, + { + "id": "john-2", + "kind": "ref", + "label": "John", + "col": 2, + "row": 1 + }, + { + "id": "jessica-2", + "kind": "ref", + "label": "Jessica", + "col": 0, + "row": 1, + "dx": 1.0 + } + ], + "edges": [] +} diff --git a/figures/smudge.json b/figures/smudge.json new file mode 100644 index 0000000..1fbdede --- /dev/null +++ b/figures/smudge.json @@ -0,0 +1,67 @@ +{ + "$schema": "./_schema.json", + "title": "smudge", + "grid": { + "x": 150.2, + "y": 53.0 + }, + "nodes": [ + { + "id": "filea-txt", + "kind": "commit", + "label": "fileA.txt", + "col": 0, + "row": 0 + }, + { + "id": "filea-txt-2", + "kind": "blob", + "label": "fileA.txt'", + "col": 2, + "row": 0 + }, + { + "id": "fileb-txt", + "kind": "blob", + "label": "fileB.txt'", + "col": 2, + "row": 1 + }, + { + "id": "fileb-txt-2", + "kind": "commit", + "label": "fileB.txt", + "col": 0, + "row": 1 + }, + { + "id": "filec-rb", + "kind": "commit", + "label": "fileC.rb", + "col": 0, + "row": 2 + }, + { + "id": "filec-rb-2", + "kind": "commit", + "label": "fileC.rb", + "col": 2, + "row": 2 + }, + { + "id": "smudge", + "kind": "ref", + "label": "smudge", + "col": 1, + "row": 0 + }, + { + "id": "clean", + "kind": "ref", + "label": "clean", + "col": 1, + "row": 1 + } + ], + "edges": [] +} diff --git a/figures/snapshots.json b/figures/snapshots.json new file mode 100644 index 0000000..40013f8 --- /dev/null +++ b/figures/snapshots.json @@ -0,0 +1,169 @@ +{ + "$schema": "./_schema.json", + "title": "snapshots", + "grid": { + "x": 116.0, + "y": 52.3 + }, + "nodes": [ + { + "id": "version-1", + "kind": "blob", + "label": "Version 1", + "col": 0, + "row": 0 + }, + { + "id": "version-2", + "kind": "blob", + "label": "Version 2", + "col": 1, + "row": 0 + }, + { + "id": "version-3", + "kind": "blob", + "label": "Version 3", + "col": 2, + "row": 0 + }, + { + "id": "version-4", + "kind": "blob", + "label": "Version 4", + "col": 3, + "row": 0 + }, + { + "id": "version-5", + "kind": "blob", + "label": "Version 5", + "col": 4, + "row": 0 + }, + { + "id": "file-a", + "kind": "commit", + "label": "File A", + "col": 0, + "row": 1, + "dy": 6.7 + }, + { + "id": "file-a-2", + "kind": "commit", + "label": "File A", + "col": 0, + "row": 1, + "dy": 6.7 + }, + { + "id": "a1", + "kind": "commit", + "label": "A1", + "col": 1, + "row": 1, + "dy": 6.7 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 1, + "row": 3 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 2, + "row": 3 + }, + { + "id": "b1", + "kind": "commit", + "label": "B1", + "col": 3, + "row": 2, + "dy": 3.4 + }, + { + "id": "a2", + "kind": "commit", + "label": "A2", + "col": 3, + "row": 1, + "dy": 6.7 + }, + { + "id": "a2-2", + "kind": "commit", + "label": "A2", + "col": 4, + "row": 1, + "dy": 6.71 + }, + { + "id": "b2", + "kind": "commit", + "label": "B2", + "col": 4, + "row": 2, + "dy": 3.4 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 4, + "row": 3 + }, + { + "id": "file-b", + "kind": "commit", + "label": "File B", + "col": 0, + "row": 2, + "dy": 3.4 + }, + { + "id": "file-c", + "kind": "commit", + "label": "File C", + "col": 0, + "row": 3 + }, + { + "id": "b", + "kind": "commit", + "label": "B", + "col": 2, + "row": 2, + "dy": 3.4 + }, + { + "id": "a1-2", + "kind": "commit", + "label": "A1", + "col": 2, + "row": 1, + "dy": 6.71 + }, + { + "id": "c2-2", + "kind": "commit", + "label": "C2", + "col": 3, + "row": 3 + }, + { + "id": "b-2", + "kind": "commit", + "label": "B", + "col": 1, + "row": 2, + "dy": 3.4 + } + ], + "edges": [] +} diff --git a/figures/symbols.json b/figures/symbols.json new file mode 100644 index 0000000..57d07f3 --- /dev/null +++ b/figures/symbols.json @@ -0,0 +1,197 @@ +{ + "$schema": "./_schema.json", + "title": "symbols", + "grid": { + "x": 119.0, + "y": 89.2 + }, + "nodes": [ + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 0, + "row": 0, + "dx": -6.7 + }, + { + "id": "v1-0", + "kind": "ref", + "label": "v1.0", + "col": 2, + "row": 0, + "dx": 18.8 + }, + { + "id": "head", + "kind": "symref", + "label": "HEAD", + "col": 4, + "row": 0, + "dx": 25.8 + }, + { + "id": "tree", + "kind": "tree", + "label": "tree", + "col": 6, + "row": 0, + "dx": 44.3 + }, + { + "id": "version-5", + "kind": "blob", + "label": "Version 5", + "col": 9, + "row": 0, + "dx": -57.7 + }, + { + "id": "integration", + "kind": "ref", + "label": [ + "integration", + "manager" + ], + "col": 0, + "row": 2, + "dx": 4.09, + "dy": -27.9 + }, + { + "id": "developer", + "kind": "tree", + "label": [ + "developer", + "public" + ], + "col": 2, + "row": 2, + "dx": 21.09, + "dy": -27.9 + }, + { + "id": "staging", + "kind": "commit", + "label": [ + "Staging", + "Area" + ], + "col": 4, + "row": 2, + "dx": 32.3, + "dy": -27.9 + }, + { + "id": "node_9c68f", + "kind": "commit", + "label": "9c68f", + "col": 6, + "row": 2, + "dx": 55.09, + "dy": -18.4 + }, + { + "id": "c2b9e", + "kind": "commit", + "label": "c2b9e", + "col": 9, + "row": 2, + "dx": -59.2, + "dy": -30.4 + }, + { + "id": "head-2", + "kind": "goldref", + "label": "HEAD", + "col": 0, + "row": 3, + "dx": 2.8, + "dy": 28.4 + }, + { + "id": "working", + "kind": "blob", + "label": [ + "Working", + "Directory" + ], + "col": 2, + "row": 3, + "dx": 21.09, + "dy": 30.9 + }, + { + "id": "size", + "kind": "commit", + "label": [ + "size", + "92ec2", + "Scott", + "Scott" + ], + "col": 5, + "row": 4, + "dx": -33.7, + "dy": -28.3 + }, + { + "id": "size-2", + "kind": "tree", + "label": [ + "size", + "5b1d3 README", + "911e7 LICENSE", + "cba0a test.rb" + ], + "col": 7, + "row": 4, + "dx": -16.7, + "dy": -28.3 + }, + { + "id": "size-3", + "kind": "blob", + "label": "size", + "col": 9, + "row": 4, + "dy": -28.3 + }, + { + "id": "hello-mundo", + "kind": "commit", + "label": "hello mundo", + "col": 0, + "row": 5, + "dy": 5.0 + }, + { + "id": "fbff5", + "kind": "jessica", + "label": "fbff5", + "col": 2, + "row": 5, + "dx": 10.3, + "dy": -2.0 + }, + { + "id": "node_738ee", + "kind": "john", + "label": "738ee", + "col": 4, + "row": 5, + "dx": 27.3, + "dy": -2.0 + }, + { + "id": "fba9a", + "kind": "josie", + "label": "fba9a", + "col": 6, + "row": 5, + "dx": 44.3, + "dy": -2.0 + } + ], + "edges": [] +} diff --git a/figures/topic-branches-1.json b/figures/topic-branches-1.json new file mode 100644 index 0000000..aebb8ed --- /dev/null +++ b/figures/topic-branches-1.json @@ -0,0 +1,152 @@ +{ + "$schema": "./_schema.json", + "title": "topic branches 1", + "grid": { + "x": 136.0, + "y": 40.1 + }, + "nodes": [ + { + "id": "c0", + "kind": "commit", + "label": "C0", + "col": 1, + "row": 9 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 1, + "row": 8, + "dy": -12.79 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 1, + "row": 6, + "dy": 14.41 + }, + { + "id": "c9", + "kind": "commit", + "label": "C9", + "col": 1, + "row": 5, + "dy": 1.51 + }, + { + "id": "c10", + "kind": "commit", + "label": "C10", + "col": 1, + "row": 4, + "dy": -11.39 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 2, + "row": 6, + "dy": 14.41 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 2, + "row": 5, + "dy": 1.51 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 4, + "dy": -11.39 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 2, + "row": 2, + "dy": 15.81 + }, + { + "id": "c12", + "kind": "commit", + "label": "C12", + "col": 0, + "row": 2, + "dy": 15.81 + }, + { + "id": "c13", + "kind": "commit", + "label": "C13", + "col": 0, + "row": 1, + "dy": 2.91 + }, + { + "id": "c7", + "kind": "commit", + "label": "C7", + "col": 3, + "row": 4, + "dy": -11.39 + }, + { + "id": "c8", + "kind": "commit", + "label": "C8", + "col": 3, + "row": 2, + "dy": 15.81 + }, + { + "id": "c11", + "kind": "commit", + "label": "C11", + "col": 3, + "row": 1, + "dy": 2.91 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 3, + "dy": -14.39 + }, + { + "id": "iss91", + "kind": "ref", + "label": "iss91", + "col": 2, + "row": 1, + "dy": 12.91 + }, + { + "id": "iss91v2", + "kind": "ref", + "label": "iss91v2", + "col": 3, + "row": 0 + }, + { + "id": "dumbidea", + "kind": "ref", + "label": "dumbidea", + "col": 0, + "row": 0 + } + ], + "edges": [] +} diff --git a/figures/topic-branches-2.json b/figures/topic-branches-2.json new file mode 100644 index 0000000..720f3f0 --- /dev/null +++ b/figures/topic-branches-2.json @@ -0,0 +1,151 @@ +{ + "$schema": "./_schema.json", + "title": "topic branches 2", + "grid": { + "x": 111.7, + "y": 51.7 + }, + "nodes": [ + { + "id": "c0", + "kind": "commit", + "label": "C0", + "col": 1, + "row": 8, + "dx": -12.68 + }, + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 1, + "row": 7, + "dx": -12.68, + "dy": -0.92 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 1, + "row": 6, + "dx": -12.68, + "dy": -2.22 + }, + { + "id": "c9", + "kind": "commit", + "label": "C9", + "col": 1, + "row": 5, + "dx": -12.68, + "dy": -3.52 + }, + { + "id": "c10", + "kind": "commit", + "label": "C10", + "col": 1, + "row": 4, + "dx": -12.68, + "dy": -4.82 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 2, + "row": 6, + "dx": 12.62, + "dy": -2.22 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 2, + "row": 5, + "dx": 12.62, + "dy": -3.52 + }, + { + "id": "c13", + "kind": "commit", + "label": "C13", + "col": 1, + "row": 2, + "dx": -12.68, + "dy": -7.42 + }, + { + "id": "c14", + "kind": "commit", + "label": "C14", + "col": 1, + "row": 1, + "dx": -12.68, + "dy": -8.72 + }, + { + "id": "c12", + "kind": "commit", + "label": "C12", + "col": 1, + "row": 3, + "dx": -12.68, + "dy": -6.12 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 1, + "row": 0, + "dx": -12.68 + }, + { + "id": "c7", + "kind": "commit", + "label": "C7", + "col": 2, + "row": 4, + "dx": 12.62, + "dy": -4.82 + }, + { + "id": "c8", + "kind": "commit", + "label": "C8", + "col": 2, + "row": 3, + "dx": 12.62, + "dy": -6.12 + }, + { + "id": "c11", + "kind": "commit", + "label": "C11", + "col": 2, + "row": 2, + "dx": 12.62, + "dy": -7.42 + }, + { + "id": "iss91v2", + "kind": "ref", + "label": "iss91v2", + "col": 3, + "row": 2, + "dy": -7.42 + }, + { + "id": "dumbidea", + "kind": "ref", + "label": "dumbidea", + "col": 0, + "row": 2, + "dy": -7.42 + } + ], + "edges": [] +} diff --git a/figures/undomerge-reset.json b/figures/undomerge-reset.json new file mode 100644 index 0000000..5bbb45f --- /dev/null +++ b/figures/undomerge-reset.json @@ -0,0 +1,84 @@ +{ + "$schema": "./_schema.json", + "title": "undomerge reset", + "grid": { + "x": 119.0, + "y": 53.0 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 2 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 2 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 2 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 3 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 3 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 3, + "row": 2 + }, + { + "id": "m", + "kind": "commit", + "label": "M", + "col": 4, + "row": 2 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 3, + "row": 1, + "dx": -0.5 + }, + { + "id": "head", + "kind": "symref", + "label": "HEAD", + "col": 3, + "row": 0, + "dx": -0.5 + }, + { + "id": "topic", + "kind": "ref", + "label": "topic", + "col": 3, + "row": 4, + "dx": -0.5 + } + ], + "edges": [] +} diff --git a/figures/undomerge-revert.json b/figures/undomerge-revert.json new file mode 100644 index 0000000..5b89e3c --- /dev/null +++ b/figures/undomerge-revert.json @@ -0,0 +1,94 @@ +{ + "$schema": "./_schema.json", + "title": "undomerge revert", + "grid": { + "x": 118.7, + "y": 53.0 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 2 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 2 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 2, + "dx": 0.6 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 3, + "dx": 0.6 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 3, + "dx": 0.9 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 3, + "row": 2, + "dx": 0.9 + }, + { + "id": "m", + "kind": "commit", + "label": "M", + "col": 4, + "row": 2, + "dx": 1.2 + }, + { + "id": "m-2", + "kind": "commit", + "label": "^M", + "col": 5, + "row": 2, + "dx": 0.5 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 5, + "row": 1 + }, + { + "id": "head", + "kind": "symref", + "label": "HEAD", + "col": 5, + "row": 0 + }, + { + "id": "topic", + "kind": "ref", + "label": "topic", + "col": 3, + "row": 4 + } + ], + "edges": [] +} diff --git a/figures/undomerge-revert2.json b/figures/undomerge-revert2.json new file mode 100644 index 0000000..8712162 --- /dev/null +++ b/figures/undomerge-revert2.json @@ -0,0 +1,105 @@ +{ + "$schema": "./_schema.json", + "title": "undomerge revert2", + "grid": { + "x": 118.9, + "y": 53.0 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 2 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 2 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 2 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 3 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 3 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 3, + "row": 2 + }, + { + "id": "c7", + "kind": "commit", + "label": "C7", + "col": 4, + "row": 3, + "dx": -1.6 + }, + { + "id": "c8", + "kind": "commit", + "label": "C8", + "col": 6, + "row": 2 + }, + { + "id": "m", + "kind": "commit", + "label": "M", + "col": 4, + "row": 2 + }, + { + "id": "m-2", + "kind": "commit", + "label": "^M", + "col": 5, + "row": 2, + "dx": -0.5 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 6, + "row": 1 + }, + { + "id": "head", + "kind": "symref", + "label": "HEAD", + "col": 6, + "row": 0 + }, + { + "id": "topic", + "kind": "ref", + "label": "topic", + "col": 4, + "row": 4, + "dx": -1.7 + } + ], + "edges": [] +} diff --git a/figures/undomerge-revert3.json b/figures/undomerge-revert3.json new file mode 100644 index 0000000..df34490 --- /dev/null +++ b/figures/undomerge-revert3.json @@ -0,0 +1,112 @@ +{ + "$schema": "./_schema.json", + "title": "undomerge revert3", + "grid": { + "x": 118.9, + "y": 53.0 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 2 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 2 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 2 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 3 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 3 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 3, + "row": 2 + }, + { + "id": "c7", + "kind": "commit", + "label": "C7", + "col": 4, + "row": 3, + "dx": -1.6 + }, + { + "id": "m", + "kind": "commit", + "label": "^^M", + "col": 6, + "row": 2 + }, + { + "id": "c8", + "kind": "commit", + "label": "C8", + "col": 7, + "row": 2 + }, + { + "id": "m-2", + "kind": "commit", + "label": "M", + "col": 4, + "row": 2 + }, + { + "id": "m-3", + "kind": "commit", + "label": "^M", + "col": 5, + "row": 2, + "dx": -0.5 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 7, + "row": 1 + }, + { + "id": "head", + "kind": "symref", + "label": "HEAD", + "col": 7, + "row": 0 + }, + { + "id": "topic", + "kind": "ref", + "label": "topic", + "col": 4, + "row": 4, + "dx": -1.6 + } + ], + "edges": [] +} diff --git a/figures/undomerge-start.json b/figures/undomerge-start.json new file mode 100644 index 0000000..1fbf26c --- /dev/null +++ b/figures/undomerge-start.json @@ -0,0 +1,82 @@ +{ + "$schema": "./_schema.json", + "title": "undomerge start", + "grid": { + "x": 119.0, + "y": 53.0 + }, + "nodes": [ + { + "id": "c1", + "kind": "commit", + "label": "C1", + "col": 0, + "row": 2 + }, + { + "id": "c2", + "kind": "commit", + "label": "C2", + "col": 1, + "row": 2 + }, + { + "id": "c5", + "kind": "commit", + "label": "C5", + "col": 2, + "row": 2 + }, + { + "id": "c3", + "kind": "commit", + "label": "C3", + "col": 2, + "row": 3 + }, + { + "id": "c4", + "kind": "commit", + "label": "C4", + "col": 3, + "row": 3 + }, + { + "id": "c6", + "kind": "commit", + "label": "C6", + "col": 3, + "row": 2 + }, + { + "id": "m", + "kind": "commit", + "label": "M", + "col": 4, + "row": 2 + }, + { + "id": "master", + "kind": "ref", + "label": "master", + "col": 4, + "row": 1 + }, + { + "id": "head", + "kind": "symref", + "label": "HEAD", + "col": 4, + "row": 0, + "dx": 0.5 + }, + { + "id": "topic", + "kind": "ref", + "label": "topic", + "col": 3, + "row": 4 + } + ], + "edges": [] +} From cd48344e2412cbba0e282949a56ce948f6740d11 Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Tue, 4 Aug 2026 12:03:03 -0700 Subject: [PATCH 07/15] Phase 3 batch 1: add edges to 16 ch02/ch03 DAG figures Adds edges to: basic-branching-3..6, basic-merging-1, basic-rebase-1..4, head-to-{testing,master}, checkout-master, commits-and-parents, commit-and-tree, rebasing-1..2. Co-Authored-By: Claude Sonnet 4.6 --- figures/basic-branching-3.json | 8 ++- figures/basic-branching-4.json | 10 ++- figures/basic-branching-5.json | 10 ++- figures/basic-branching-6.json | 10 ++- figures/basic-merging-1.json | 10 ++- figures/basic-rebase-1.json | 9 ++- figures/basic-rebase-2.json | 10 ++- figures/basic-rebase-3.json | 10 ++- figures/basic-rebase-4.json | 9 ++- figures/checkout-master.json | 9 ++- figures/commit-and-tree.json | 7 ++- figures/commits-and-parents.json | 8 ++- figures/head-to-master.json | 8 ++- figures/head-to-testing.json | 8 ++- figures/rebasing-1.json | 9 ++- figures/rebasing-2.json | 10 ++- images/basic-branching-3.svg | 67 ++++++++------------ images/basic-branching-4.svg | 101 ++++++++++++------------------ images/basic-branching-5.svg | 101 ++++++++++++------------------ images/basic-branching-6.svg | 103 ++++++++++++------------------- images/basic-merging-1.svg | 102 ++++++++++++------------------ images/basic-rebase-1.svg | 79 +++++++++--------------- images/basic-rebase-2.svg | 102 ++++++++++++------------------ images/basic-rebase-3.svg | 101 ++++++++++++------------------ images/basic-rebase-4.svg | 77 +++++++++-------------- images/checkout-master.svg | 85 +++++++++++-------------- images/commit-and-tree.svg | 83 ++++++++----------------- images/commits-and-parents.svg | 78 ++++++++--------------- images/head-to-master.svg | 63 ++++++++----------- images/head-to-testing.svg | 63 ++++++++----------- images/rebasing-1.svg | 77 +++++++++-------------- images/rebasing-2.svg | 98 +++++++++++------------------ 32 files changed, 656 insertions(+), 869 deletions(-) diff --git a/figures/basic-branching-3.json b/figures/basic-branching-3.json index 312ffde..3993561 100644 --- a/figures/basic-branching-3.json +++ b/figures/basic-branching-3.json @@ -49,5 +49,11 @@ "row": 2 } ], - "edges": [] + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c2", "to": "c1" }, + { "from": "c3", "to": "c2" }, + { "from": "master", "to": "c2", "arrow": "forward" }, + { "from": "iss53", "to": "c3", "arrow": "forward" } + ] } diff --git a/figures/basic-branching-4.json b/figures/basic-branching-4.json index 384f194..4fd20e8 100644 --- a/figures/basic-branching-4.json +++ b/figures/basic-branching-4.json @@ -68,5 +68,13 @@ "row": 3 } ], - "edges": [] + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c2", "to": "c1" }, + { "from": "c4", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "master", "to": "c4", "arrow": "forward" }, + { "from": "hotfix", "to": "c4", "arrow": "forward" }, + { "from": "iss53", "to": "c3", "arrow": "forward" } + ] } diff --git a/figures/basic-branching-5.json b/figures/basic-branching-5.json index 25ddbf2..54d4f01 100644 --- a/figures/basic-branching-5.json +++ b/figures/basic-branching-5.json @@ -65,5 +65,13 @@ "row": 4 } ], - "edges": [] + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c2", "to": "c1" }, + { "from": "c4", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "master", "to": "c4", "arrow": "forward" }, + { "from": "hotfix", "to": "c4", "arrow": "forward" }, + { "from": "iss53", "to": "c3", "arrow": "forward" } + ] } diff --git a/figures/basic-branching-6.json b/figures/basic-branching-6.json index 6cb8762..e82ae1b 100644 --- a/figures/basic-branching-6.json +++ b/figures/basic-branching-6.json @@ -73,5 +73,13 @@ "row": 3 } ], - "edges": [] + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c2", "to": "c1" }, + { "from": "c4", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c5", "to": "c3" }, + { "from": "master", "to": "c4", "arrow": "forward" }, + { "from": "iss53", "to": "c5", "arrow": "forward" } + ] } diff --git a/figures/basic-merging-1.json b/figures/basic-merging-1.json index 271073e..93bd74f 100644 --- a/figures/basic-merging-1.json +++ b/figures/basic-merging-1.json @@ -72,5 +72,13 @@ "row": 3 } ], - "edges": [] + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c2", "to": "c1" }, + { "from": "c4", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c5", "to": "c3" }, + { "from": "master", "to": "c4", "arrow": "forward" }, + { "from": "iss53", "to": "c5", "arrow": "forward" } + ] } diff --git a/figures/basic-rebase-1.json b/figures/basic-rebase-1.json index 63f92a0..bcbe95c 100644 --- a/figures/basic-rebase-1.json +++ b/figures/basic-rebase-1.json @@ -61,5 +61,12 @@ "row": 3 } ], - "edges": [] + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c2", "to": "c1" }, + { "from": "c3", "to": "c2" }, + { "from": "c4", "to": "c2", "route": "diagonal" }, + { "from": "experiment", "to": "c4", "arrow": "forward" }, + { "from": "master", "to": "c3", "arrow": "forward" } + ] } diff --git a/figures/basic-rebase-2.json b/figures/basic-rebase-2.json index 162da09..6ec3c27 100644 --- a/figures/basic-rebase-2.json +++ b/figures/basic-rebase-2.json @@ -73,5 +73,13 @@ "row": 3 } ], - "edges": [] + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c2", "to": "c1" }, + { "from": "c3", "to": "c2" }, + { "from": "c4", "to": "c2", "route": "diagonal" }, + { "from": "c5", "to": "c4", "route": "diagonal" }, + { "from": "experiment", "to": "c5", "arrow": "forward" }, + { "from": "master", "to": "c4", "arrow": "forward" } + ] } diff --git a/figures/basic-rebase-3.json b/figures/basic-rebase-3.json index 28861d5..266b300 100644 --- a/figures/basic-rebase-3.json +++ b/figures/basic-rebase-3.json @@ -74,5 +74,13 @@ "row": 2 } ], - "edges": [] + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c2", "to": "c1" }, + { "from": "c3", "to": "c2" }, + { "from": "c4", "to": "c2", "route": "diagonal" }, + { "from": "c4-2", "to": "c3" }, + { "from": "experiment", "to": "c4-2", "arrow": "forward" }, + { "from": "master", "to": "c3", "arrow": "forward" } + ] } diff --git a/figures/basic-rebase-4.json b/figures/basic-rebase-4.json index 95aee0d..e31e479 100644 --- a/figures/basic-rebase-4.json +++ b/figures/basic-rebase-4.json @@ -64,5 +64,12 @@ "row": 2 } ], - "edges": [] + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c2", "to": "c1" }, + { "from": "c3", "to": "c2" }, + { "from": "c4", "to": "c3" }, + { "from": "experiment", "to": "c4", "arrow": "forward" }, + { "from": "master", "to": "c4", "arrow": "forward" } + ] } diff --git a/figures/checkout-master.json b/figures/checkout-master.json index a3a764f..607d0c6 100644 --- a/figures/checkout-master.json +++ b/figures/checkout-master.json @@ -60,5 +60,12 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "node_34ac2", "to": "node_98ca9" }, + { "from": "f30ab", "to": "node_34ac2" }, + { "from": "node_87ab2", "to": "f30ab" }, + { "from": "master", "to": "f30ab", "arrow": "forward" }, + { "from": "testing", "to": "node_87ab2", "arrow": "forward" }, + { "from": "head", "to": "master", "arrow": "forward" } + ] } diff --git a/figures/commit-and-tree.json b/figures/commit-and-tree.json index 5b42bcc..f315844 100644 --- a/figures/commit-and-tree.json +++ b/figures/commit-and-tree.json @@ -42,5 +42,10 @@ "row": 2 } ], - "edges": [] + "edges": [ + { "from": "the-initial-commit-of-my-project", "to": "node_92ec2", "arrow": "forward" }, + { "from": "node_92ec2", "to": "node_5b1d3", "arrow": "forward" }, + { "from": "node_92ec2", "to": "node_911e7", "arrow": "forward" }, + { "from": "node_92ec2", "to": "cba0a", "route": "diagonal" } + ] } diff --git a/figures/commits-and-parents.json b/figures/commits-and-parents.json index 2fcc0cf..cc31720 100644 --- a/figures/commits-and-parents.json +++ b/figures/commits-and-parents.json @@ -56,5 +56,11 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "fixed-bug-1328-stack-overflow", "to": "the-initial-commit-of-my-project", "arrow": "back" }, + { "from": "add-feature-32-ability-to-add-new", "to": "fixed-bug-1328-stack-overflow", "arrow": "back" }, + { "from": "the-initial-commit-of-my-project", "to": "snapshot-a", "arrow": "forward" }, + { "from": "fixed-bug-1328-stack-overflow", "to": "snapshot-b", "arrow": "forward" }, + { "from": "add-feature-32-ability-to-add-new", "to": "snapshot-c", "arrow": "forward" } + ] } diff --git a/figures/head-to-master.json b/figures/head-to-master.json index 51cf377..de9e61a 100644 --- a/figures/head-to-master.json +++ b/figures/head-to-master.json @@ -53,5 +53,11 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "node_34ac2", "to": "node_98ca9" }, + { "from": "f30ab", "to": "node_34ac2" }, + { "from": "master", "to": "f30ab", "arrow": "forward" }, + { "from": "testing", "to": "f30ab", "arrow": "forward" }, + { "from": "head", "to": "master", "arrow": "forward" } + ] } diff --git a/figures/head-to-testing.json b/figures/head-to-testing.json index e15b31c..ca7e606 100644 --- a/figures/head-to-testing.json +++ b/figures/head-to-testing.json @@ -49,5 +49,11 @@ "row": 3 } ], - "edges": [] + "edges": [ + { "from": "node_34ac2", "to": "node_98ca9" }, + { "from": "f30ab", "to": "node_34ac2" }, + { "from": "master", "to": "f30ab", "arrow": "forward" }, + { "from": "testing", "to": "f30ab", "arrow": "forward" }, + { "from": "head", "to": "testing", "arrow": "forward" } + ] } diff --git a/figures/rebasing-1.json b/figures/rebasing-1.json index 39aaacc..ecdb9f4 100644 --- a/figures/rebasing-1.json +++ b/figures/rebasing-1.json @@ -61,5 +61,12 @@ "row": 3 } ], - "edges": [] + "edges": [ + { "from": "a6b4c", "to": "node_0b743" }, + { "from": "f42c5", "to": "a6b4c" }, + { "from": "e43a6", "to": "f42c5", "route": "diagonal" }, + { "from": "node_5ddae", "to": "e43a6" }, + { "from": "master", "to": "f42c5", "arrow": "forward" }, + { "from": "ruby-client", "to": "node_5ddae", "arrow": "forward" } + ] } diff --git a/figures/rebasing-2.json b/figures/rebasing-2.json index fe31213..b8784c2 100644 --- a/figures/rebasing-2.json +++ b/figures/rebasing-2.json @@ -71,5 +71,13 @@ "dx": 0.6 } ], - "edges": [] + "edges": [ + { "from": "a6b4c", "to": "node_0b743" }, + { "from": "f42c5", "to": "a6b4c" }, + { "from": "a0a41", "to": "f42c5" }, + { "from": "e43a6", "to": "f42c5", "route": "diagonal" }, + { "from": "node_5ddae", "to": "e43a6" }, + { "from": "master", "to": "a0a41", "arrow": "forward" }, + { "from": "ruby-client", "to": "node_5ddae", "arrow": "forward" } + ] } diff --git a/images/basic-branching-3.svg b/images/basic-branching-3.svg index 0192c1b..308f1d1 100644 --- a/images/basic-branching-3.svg +++ b/images/basic-branching-3.svg @@ -1,50 +1,33 @@ - - - - - image/svg+xml - - images/basic-branching-3 - - - - - images/basic-branching-3 - Created with Sketch. - - - - - + + basic branching 3 + + + + + + + + C0 - - - C0 + + + C1 - - - C1 + + + C2 - - - C2 + + + C3 - - - C3 + + + master - - - - master + + + iss53 - - - - - iss53 - - - diff --git a/images/basic-branching-4.svg b/images/basic-branching-4.svg index 59691bd..cb517a7 100644 --- a/images/basic-branching-4.svg +++ b/images/basic-branching-4.svg @@ -1,64 +1,43 @@ - - - - - image/svg+xml - - images/basic-branching-4 - - - - - images/basic-branching-4 - Created with Sketch. - - - - - - - - - - C0 - - - - C1 - - - - C2 - - - - - master - - - - - - - hotfix - - - - - C4 - - - - C3 - - - - - iss53 - - - + + basic branching 4 + + + + + + + + + + C0 + + + + C1 + + + + C2 + + + + master + + + + hotfix + + + + C4 + + + + C3 + + + + iss53 - diff --git a/images/basic-branching-5.svg b/images/basic-branching-5.svg index d3d8e87..b6afbc0 100644 --- a/images/basic-branching-5.svg +++ b/images/basic-branching-5.svg @@ -1,62 +1,43 @@ - - - - - image/svg+xml - - images/basic-branching-5 - - - - - images/basic-branching-5 - Created with Sketch. - - - - - - - C0 - - - - C1 - - - - C2 - - - - - master - - - - - - - hotfix - - - - - C4 - - - - - C3 - - - - - - - iss53 - - - + + basic branching 5 + + + + + + + + + + C0 + + + + C1 + + + + C2 + + + + master + + + + hotfix + + + + C4 + + + + C3 + + + + iss53 + diff --git a/images/basic-branching-6.svg b/images/basic-branching-6.svg index feaf578..f6ac7b5 100644 --- a/images/basic-branching-6.svg +++ b/images/basic-branching-6.svg @@ -1,66 +1,43 @@ - - - - - image/svg+xml - - images/basic-branching-6 - - - - - images/basic-branching-6 - Created with Sketch. - - - - - C0 - - - - C1 - - - - C2 - - - - - - - - - - - - master - - - - - C4 - - - - - - C5 - - - - - C3 - - - - - - iss53 - - + + basic branching 6 + + + + + + + + + + C0 + + + + C1 + + + + C2 + + + + master + + + + C4 + + + + C5 + + + + C3 + + + + iss53 - diff --git a/images/basic-merging-1.svg b/images/basic-merging-1.svg index 012bc1d..7528a9c 100644 --- a/images/basic-merging-1.svg +++ b/images/basic-merging-1.svg @@ -1,63 +1,43 @@ - - - - - image/svg+xml - - images/basic-merging-1 - - - - - images/basic-merging-1 - Created with Sketch. - - - - - - - - C0 - - - - C1 - - - - C2 - - - - - - master - - Snapshot toMerge Into - - - C4 - - - - - C5 - - - - C3 - - - - - - iss53 - - - Common Ancestor - Snapshot toMerge In - - + + basic merging 1 + + + + + + + + + + C0 + + + + C1 + + + + C2 + + + + master + + + + C4 + + + + C5 + + + + C3 + + + + iss53 + diff --git a/images/basic-rebase-1.svg b/images/basic-rebase-1.svg index 111bbf0..9e0cac8 100644 --- a/images/basic-rebase-1.svg +++ b/images/basic-rebase-1.svg @@ -1,57 +1,38 @@ - - - - - image/svg+xml - - images/basic-rebase-1 - - - - - images/basic-rebase-1 - Created with Sketch. - - - - - - - C0 + + basic rebase 1 + + + + + + + + + C0 - - - C1 + + + C1 - - - C2 + + + C2 - - - - - - experiment - + + + experiment - - - - C4 - - - - C3 - + + + C4 - - - - - master - + + + C3 + + + + master - diff --git a/images/basic-rebase-2.svg b/images/basic-rebase-2.svg index 6c10851..08334a1 100644 --- a/images/basic-rebase-2.svg +++ b/images/basic-rebase-2.svg @@ -1,63 +1,43 @@ - - - - - image/svg+xml - - images/basic-rebase-2 - - - - - images/basic-rebase-2 - Created with Sketch. - - - - - - C0 - - - - C1 - - - - C2 - - - - - - - - experiment - - - - - C4 - - - - - - C3 - - - - - - C5 - - - - - - master - - - + + basic rebase 2 + + + + + + + + + + C0 + + + + C1 + + + + C2 + + + + experiment + + + + C4 + + + + C3 + + + + C5 + + + + master + diff --git a/images/basic-rebase-3.svg b/images/basic-rebase-3.svg index 9bb11f9..23c8991 100644 --- a/images/basic-rebase-3.svg +++ b/images/basic-rebase-3.svg @@ -1,64 +1,43 @@ - - - - - image/svg+xml - - images/basic-rebase-3 - - - - - images/basic-rebase-3 - Created with Sketch. - - - - - - C0 + + basic rebase 3 + + + + + + + + + + C0 + + + + C1 + + + + C2 + + + + experiment + + + + C4 + + + + C3 + + + + C4' + + + + master - - - C1 - - - - C2 - - - - - - experiment - - - - - - - C4 - - - - - - - C3 - - - - - - C4' - - - - - - master - - - diff --git a/images/basic-rebase-4.svg b/images/basic-rebase-4.svg index f7ce55a..62eb4e6 100644 --- a/images/basic-rebase-4.svg +++ b/images/basic-rebase-4.svg @@ -1,57 +1,38 @@ - - - - - image/svg+xml - - images/basic-rebase-4 - - - - - images/basic-rebase-4 - Created with Sketch. - - - - - - C0 + + basic rebase 4 + + + + + + + + + C0 - - - C1 + + + C1 - - - C2 + + + C2 - - - - - experiment - + + + experiment - - - - - C3 - + + + C3 - - - - C4' + + + C4' - - - - - master - + + + master - diff --git a/images/checkout-master.svg b/images/checkout-master.svg index 04a1a20..be96336 100644 --- a/images/checkout-master.svg +++ b/images/checkout-master.svg @@ -1,53 +1,38 @@ - - - - - image/svg+xml - - images/checkout-master - - - - - images/checkout-master - Created with Sketch. - - - - - - - - - master - - - - f30ab - - - - 87ab2 - - - - 34ac2 - - - - 98ca9 - - - - - testing - - - - - HEAD - + + checkout master + + + + + + + + + master + + + + f30ab + + + + 87ab2 + + + + 34ac2 + + + + 98ca9 + + + + testing + + + + HEAD - diff --git a/images/commit-and-tree.svg b/images/commit-and-tree.svg index 3c3112b..9e97ec3 100644 --- a/images/commit-and-tree.svg +++ b/images/commit-and-tree.svg @@ -1,61 +1,28 @@ - - - - - image/svg+xml - - images/commit-and-tree - - - - - images/commit-and-tree - Created with Sketch. - - - - - size 5b1d3 README 911e7 LICENSE cba0a test.rb - treeblobblobblob - - - - The initial commit of my project - - size 92ec2 Scott Scott - committreeauthorcommitter - - 98ca9 - - 92ec2 - - - size - blob - == Testing library This library is used to test Ruby projects. - 5b1d3 - - - - size - blob - The MIT License Copyright (c) 2008 Scott Chacon Permission is hereby granted, free of charge, to any person - 911e7 - - - - size - blob - require 'logger' require 'test/unit' class Test::Unit::TestCase - cba0a - - - - - - - + + commit and tree + + + + + + + 92ec2 + + + + The initial commit of my project + + + + 5b1d3 + + + + 911e7 + + + + cba0a - diff --git a/images/commits-and-parents.svg b/images/commits-and-parents.svg index ee786da..a0c712c 100644 --- a/images/commits-and-parents.svg +++ b/images/commits-and-parents.svg @@ -1,59 +1,33 @@ - - - - - image/svg+xml - - images/commits-and-parents - - - - - images/commits-and-parents - Created with Sketch. - - - Snapshot A - - - - Snapshot B + + commits and parents + + + + + + + + Snapshot A - - 98ca9 - 34ac2 - - - - Snapshot C + + + Snapshot B - - f30ab - - - - Fixed bug #1328 - stack overflow under certain conditions - - size 184ca 98ca9 Scott Scott - committreeparentauthorcommitter - + + + Snapshot C - - - The initial commit of my project - - size 92ec2 Scott Scott - committreeparentauthorcommitter - + + + Fixed bug #1328 - stack overflowunder certain conditions - - - add feature #32 - ability to add new formats to the central interface - - size 0de24 34ac2 Scott Scott - committreeparentauthorcommitter - + + + The initial commit of my project + + + + add feature #32 - ability to add newformats to the central interface - diff --git a/images/head-to-master.svg b/images/head-to-master.svg index 285833a..dbd12e4 100644 --- a/images/head-to-master.svg +++ b/images/head-to-master.svg @@ -1,46 +1,33 @@ - - - - - image/svg+xml - - images/head-to-master - - - - - images/head-to-master - Created with Sketch. - - - - - - - - - master + + head to master + + + + + + + + master - - - testing + + + testing - - - f30ab + + + f30ab - - - 34ac2 + + + 34ac2 - - - 98ca9 + + + 98ca9 - - - HEAD + + + HEAD - diff --git a/images/head-to-testing.svg b/images/head-to-testing.svg index 0ea2c50..6602aca 100644 --- a/images/head-to-testing.svg +++ b/images/head-to-testing.svg @@ -1,46 +1,33 @@ - - - - - image/svg+xml - - images/head-to-testing - - - - - images/head-to-testing - Created with Sketch. - - - - - - - - master + + head to testing + + + + + + + + master - - - testing + + + testing - - - f30ab + + + f30ab - - - 34ac2 + + + 34ac2 - - - 98ca9 + + + 98ca9 - - - - HEAD + + + HEAD - diff --git a/images/rebasing-1.svg b/images/rebasing-1.svg index 85d75a4..a828db3 100644 --- a/images/rebasing-1.svg +++ b/images/rebasing-1.svg @@ -1,57 +1,38 @@ - - - - - image/svg+xml - - images/rebasing-1 - - - - - images/rebasing-1 - Created with Sketch. - - - - - 0b743 - + + rebasing 1 + + + + + + + + + 0b743 - - - - a6b4c + + + a6b4c - - - - f42c5 + + + f42c5 - - - - - e43a6 - + + + e43a6 - - - - 5ddae + + + 5ddae - - - - master + + + master - - - - - ruby_client - + + + ruby_client - diff --git a/images/rebasing-2.svg b/images/rebasing-2.svg index 087b845..669f2f8 100644 --- a/images/rebasing-2.svg +++ b/images/rebasing-2.svg @@ -1,71 +1,43 @@ - - - - - image/svg+xml - - images/rebasing-2 - - - - - images/rebasing-2 - Created with Sketch. - - - - - 0b743 - + + rebasing 2 + + + + + + + + + + 0b743 - - - - a6b4c + + + a6b4c - - - - - f42c5 - + + + f42c5 - - - - a0a41 + + + a0a41 - - - - - master - + + + master - - - - - - - e43a6 - - - - - - - 5ddae - - - - - - - ruby_client - - + + + e43a6 + + + + 5ddae + + + + ruby_client - From ea2d19a209ab3118ee84330136ced807ebbbdc2c Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Tue, 4 Aug 2026 15:44:15 -0700 Subject: [PATCH 08/15] Phase 3 batch 2: add edges to interesting-rebase, double-dot, lr-branches, merging-workflows Co-Authored-By: Claude Sonnet 4.6 --- figures/double-dot.json | 10 +- figures/interesting-rebase-1.json | 14 +- figures/interesting-rebase-2.json | 16 +- figures/interesting-rebase-3.json | 14 +- figures/interesting-rebase-4.json | 17 +- figures/interesting-rebase-5.json | 12 +- figures/lr-branches-1.json | 12 +- figures/lr-branches-2.json | 9 +- figures/merging-workflows-1.json | 12 +- figures/merging-workflows-2.json | 14 +- figures/merging-workflows-3.json | 10 +- figures/merging-workflows-4.json | 11 +- figures/merging-workflows-5.json | 11 +- images/double-dot.svg | 369 ++++-------------------------- images/interesting-rebase-1.svg | 155 +++++-------- images/interesting-rebase-2.svg | 153 +++++-------- images/interesting-rebase-3.svg | 149 +++++------- images/interesting-rebase-4.svg | 157 +++++-------- images/interesting-rebase-5.svg | 121 ++++------ images/lr-branches-1.svg | 119 ++++------ images/lr-branches-2.svg | 95 +++----- images/merging-workflows-1.svg | 131 ++++------- images/merging-workflows-2.svg | 157 +++++-------- images/merging-workflows-3.svg | 103 ++++----- images/merging-workflows-4.svg | 116 ++++------ images/merging-workflows-5.svg | 116 ++++------ 26 files changed, 805 insertions(+), 1298 deletions(-) diff --git a/figures/double-dot.json b/figures/double-dot.json index 4c59e3e..5a3a562 100644 --- a/figures/double-dot.json +++ b/figures/double-dot.json @@ -68,5 +68,13 @@ "row": 1 } ], - "edges": [] + "edges": [ + { "from": "b", "to": "a" }, + { "from": "e", "to": "b" }, + { "from": "f", "to": "e" }, + { "from": "c", "to": "b" }, + { "from": "d", "to": "c" }, + { "from": "master", "to": "f", "arrow": "forward" }, + { "from": "experiment", "to": "d", "arrow": "forward" } + ] } diff --git a/figures/interesting-rebase-1.json b/figures/interesting-rebase-1.json index d70741e..b06e516 100644 --- a/figures/interesting-rebase-1.json +++ b/figures/interesting-rebase-1.json @@ -97,5 +97,17 @@ "row": 5 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c5", "to": "c2" }, + { "from": "c6", "to": "c5" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c10", "to": "c4" }, + { "from": "c8", "to": "c3", "route": "diagonal" }, + { "from": "c9", "to": "c8" }, + { "from": "master", "to": "c6", "arrow": "forward" }, + { "from": "server", "to": "c10", "arrow": "forward" }, + { "from": "client", "to": "c9", "arrow": "forward" } + ] } diff --git a/figures/interesting-rebase-2.json b/figures/interesting-rebase-2.json index c7ce2a1..7d37f55 100644 --- a/figures/interesting-rebase-2.json +++ b/figures/interesting-rebase-2.json @@ -110,5 +110,19 @@ "dy": 1.3 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c5", "to": "c2" }, + { "from": "c6", "to": "c5" }, + { "from": "c8", "to": "c6" }, + { "from": "c9", "to": "c8" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c10", "to": "c4" }, + { "from": "c8-2", "to": "c3", "route": "diagonal" }, + { "from": "c9-2", "to": "c8-2" }, + { "from": "master", "to": "c6", "arrow": "forward" }, + { "from": "server", "to": "c10", "arrow": "forward" }, + { "from": "client", "to": "c9", "arrow": "forward" } + ] } diff --git a/figures/interesting-rebase-3.json b/figures/interesting-rebase-3.json index 38418d6..25129ae 100644 --- a/figures/interesting-rebase-3.json +++ b/figures/interesting-rebase-3.json @@ -98,5 +98,17 @@ "dy": -1.9 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c5", "to": "c2" }, + { "from": "c6", "to": "c5" }, + { "from": "c8", "to": "c6" }, + { "from": "c9", "to": "c8" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c10", "to": "c4" }, + { "from": "master", "to": "c9", "arrow": "forward" }, + { "from": "server", "to": "c10", "arrow": "forward" }, + { "from": "client", "to": "c9", "arrow": "forward" } + ] } diff --git a/figures/interesting-rebase-4.json b/figures/interesting-rebase-4.json index 746d2d9..ab3ffd8 100644 --- a/figures/interesting-rebase-4.json +++ b/figures/interesting-rebase-4.json @@ -135,5 +135,20 @@ "dy": -1.3 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c5", "to": "c2" }, + { "from": "c6", "to": "c5" }, + { "from": "c8", "to": "c6" }, + { "from": "c9", "to": "c8" }, + { "from": "c3", "to": "c9", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c10", "to": "c4" }, + { "from": "c3-2", "to": "c2", "route": "diagonal" }, + { "from": "c4-2", "to": "c3-2" }, + { "from": "c10-2", "to": "c4-2" }, + { "from": "master", "to": "c10", "arrow": "forward" }, + { "from": "server", "to": "c10-2", "arrow": "forward" }, + { "from": "client", "to": "c9", "arrow": "forward" } + ] } diff --git a/figures/interesting-rebase-5.json b/figures/interesting-rebase-5.json index 4b91e02..5a9902b 100644 --- a/figures/interesting-rebase-5.json +++ b/figures/interesting-rebase-5.json @@ -83,5 +83,15 @@ "row": 1 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c5", "to": "c2" }, + { "from": "c6", "to": "c5" }, + { "from": "c8", "to": "c6" }, + { "from": "c9", "to": "c8" }, + { "from": "c3", "to": "c9", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c10", "to": "c4" }, + { "from": "master", "to": "c10", "arrow": "forward" } + ] } diff --git a/figures/lr-branches-1.json b/figures/lr-branches-1.json index 25cdc43..d1e565e 100644 --- a/figures/lr-branches-1.json +++ b/figures/lr-branches-1.json @@ -77,5 +77,15 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c3", "to": "c2" }, + { "from": "c4", "to": "c3" }, + { "from": "c5", "to": "c4" }, + { "from": "c6", "to": "c5" }, + { "from": "c7", "to": "c6" }, + { "from": "master", "to": "c1", "arrow": "forward" }, + { "from": "develop", "to": "c5", "arrow": "forward" }, + { "from": "topic", "to": "c7", "arrow": "forward" } + ] } diff --git a/figures/lr-branches-2.json b/figures/lr-branches-2.json index 301fb0c..748a49f 100644 --- a/figures/lr-branches-2.json +++ b/figures/lr-branches-2.json @@ -65,5 +65,12 @@ "row": 2 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1", "route": "diagonal" }, + { "from": "c3", "to": "c2" }, + { "from": "c4", "to": "c3" }, + { "from": "c5", "to": "c4" }, + { "from": "c6", "to": "c5", "route": "diagonal" }, + { "from": "c7", "to": "c6" } + ] } diff --git a/figures/merging-workflows-1.json b/figures/merging-workflows-1.json index 08351cf..fd9a1ba 100644 --- a/figures/merging-workflows-1.json +++ b/figures/merging-workflows-1.json @@ -90,5 +90,15 @@ "row": 3 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c7", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c5", "to": "c3", "route": "diagonal" }, + { "from": "c6", "to": "c5" }, + { "from": "master", "to": "c7", "arrow": "forward" }, + { "from": "ruby-client", "to": "c4", "arrow": "forward" }, + { "from": "php-client", "to": "c6", "arrow": "forward" } + ] } diff --git a/figures/merging-workflows-2.json b/figures/merging-workflows-2.json index a1b6d93..de50bd4 100644 --- a/figures/merging-workflows-2.json +++ b/figures/merging-workflows-2.json @@ -110,5 +110,17 @@ "dx": 1.8 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c7", "to": "c2" }, + { "from": "c8", "to": "c7" }, + { "from": "c9", "to": "c8" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c5", "to": "c3", "route": "diagonal" }, + { "from": "c6", "to": "c5" }, + { "from": "master", "to": "c9", "arrow": "forward" }, + { "from": "ruby-client", "to": "c4", "arrow": "forward" }, + { "from": "php-client", "to": "c6", "arrow": "forward" } + ] } diff --git a/figures/merging-workflows-3.json b/figures/merging-workflows-3.json index 3ce441c..8fa6c22 100644 --- a/figures/merging-workflows-3.json +++ b/figures/merging-workflows-3.json @@ -68,5 +68,13 @@ "row": 3 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c5", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "master", "to": "c2", "arrow": "forward" }, + { "from": "develop", "to": "c5", "arrow": "forward" }, + { "from": "ruby-client", "to": "c4", "arrow": "forward" } + ] } diff --git a/figures/merging-workflows-4.json b/figures/merging-workflows-4.json index 5f08b54..3abc920 100644 --- a/figures/merging-workflows-4.json +++ b/figures/merging-workflows-4.json @@ -80,5 +80,14 @@ "dx": 0.9 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c5", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c6", "to": "c5" }, + { "from": "master", "to": "c2", "arrow": "forward" }, + { "from": "develop", "to": "c6", "arrow": "forward" }, + { "from": "ruby-client", "to": "c4", "arrow": "forward" } + ] } diff --git a/figures/merging-workflows-5.json b/figures/merging-workflows-5.json index fda397d..997119d 100644 --- a/figures/merging-workflows-5.json +++ b/figures/merging-workflows-5.json @@ -83,5 +83,14 @@ "dx": 7.8 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c5", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c6", "to": "c5" }, + { "from": "master", "to": "c6", "arrow": "forward" }, + { "from": "develop", "to": "c6", "arrow": "forward" }, + { "from": "ruby-client", "to": "c4", "arrow": "forward" } + ] } diff --git a/images/double-dot.svg b/images/double-dot.svg index 465b050..ab2345f 100644 --- a/images/double-dot.svg +++ b/images/double-dot.svg @@ -1,330 +1,43 @@ - - - - - - image/svg+xml - - images/double-dot - - - - - - - - - images/double-dot - Created with Sketch. - - - - - A - - - - - - - - B - - - - - - - - - E - - - - - - - - - - F - - - - - - - - - C - - - - - - - - - D - - - - - - - - - master - - - - - - - - - experiment - - - + + + double dot + + + + + + + + + + A + + + + B + + + + E + + + + F + + + + C + + + + D + + + + master + + + + experiment diff --git a/images/interesting-rebase-1.svg b/images/interesting-rebase-1.svg index 5c520bf..5ae0e14 100644 --- a/images/interesting-rebase-1.svg +++ b/images/interesting-rebase-1.svg @@ -1,98 +1,63 @@ - - - - - image/svg+xml - - images/interesting-rebase-1 - - - - - images/interesting-rebase-1 - Created with Sketch. - - - - C1 + + interesting rebase 1 + + + + + + + + + + + + + + C1 + + + + C2 + + + + C5 + + + + master + + + + C6 + + + + C3 + + + + C4 + + + + C8 + + + + C9 + + + + C10 + + + + server + + + + client - - - - - C2 - - - - - - - C5 - - - - - - - master - - - - - - - C6 - - - - - - - C3 - - - - - - - C4 - - - - - - - - - C8 - - - - - - - C9 - - - - - - - C10 - - - - - - - server - - - - - - client - - diff --git a/images/interesting-rebase-2.svg b/images/interesting-rebase-2.svg index fb5feec..8b0c0fd 100644 --- a/images/interesting-rebase-2.svg +++ b/images/interesting-rebase-2.svg @@ -1,110 +1,73 @@ - - - - - image/svg+xml - - images/interesting-rebase-2 - - - - - images/interesting-rebase-2 - Created with Sketch. - - - - C1 + + interesting rebase 2 + + + + + + + + + + + + + + + + C1 - - - - - C2 - + + + C2 - - - - - C5 - + + + C5 - - - - - master - + + + master - - - - - C6 - + + + C6 - - - - - C8' - + + + C8' - - - - - C9' - + + + C9' - - - - - C3 - + + + C3 - - - - - C4 - + + + C4 - - - - - C8 - - - - - C9 - + + + C8 - - - - - C10 - + + + C9 - - - - - server - + + + C10 - - - - - client - + + + server + + + + client - diff --git a/images/interesting-rebase-3.svg b/images/interesting-rebase-3.svg index cb5e2e6..0e91e65 100644 --- a/images/interesting-rebase-3.svg +++ b/images/interesting-rebase-3.svg @@ -1,92 +1,63 @@ - - - - - image/svg+xml - - images/interesting-rebase-3 - - - - - images/interesting-rebase-3 - Created with Sketch. - - - - C1 + + interesting rebase 3 + + + + + + + + + + + + + + C1 + + + + C2 + + + + C5 + + + + master + + + + C6 + + + + C8' + + + + C9' + + + + C3 + + + + C4 + + + + C10 + + + + server + + + + client - - - - - C2 - - - - - - - C5 - - - - - - - master - - - - - - - C6 - - - - - - - C8' - - - - - - C9' - - - - - C3 - - - - - - C4 - - - - - - C10 - - - - - - server - - - - - - - client - - - diff --git a/images/interesting-rebase-4.svg b/images/interesting-rebase-4.svg index df0604b..4a9ff1c 100644 --- a/images/interesting-rebase-4.svg +++ b/images/interesting-rebase-4.svg @@ -1,109 +1,78 @@ - - - - - image/svg+xml - - images/interesting-rebase-4 - - - - - images/interesting-rebase-4 - Created with Sketch. - - - - C1 + + interesting rebase 4 + + + + + + + + + + + + + + + + + C1 - - - - - C2 - + + + C2 - - - - - C5 - + + + C5 - - - - - master - + + + master - - - - - C6 - + + + C6 - - - - C8' + + + C8' - - - - C9' + + + C9' - - - - C3' + + + C3' - - - - - C4' - + + + C4' - - - - C10' + + + C10' - - - - - C3 - - - - - - C4 - - - - - - C10 - + + + C3 - - - - - server - + + + C4 - - - - - client - + + + C10 + + + + server + + + + client - diff --git a/images/interesting-rebase-5.svg b/images/interesting-rebase-5.svg index 18907ad..6f4be82 100644 --- a/images/interesting-rebase-5.svg +++ b/images/interesting-rebase-5.svg @@ -1,74 +1,53 @@ - - - - - image/svg+xml - - images/interesting-rebase-5 - - - - - images/interesting-rebase-5 - Created with Sketch. - - - - C1 + + interesting rebase 5 + + + + + + + + + + + + C1 + + + + C2 + + + + C5 + + + + master + + + + C6 + + + + C8' + + + + C9' + + + + C3' + + + + C4' + + + + C10' - - - - - C2 - - - - - - - C5 - - - - - - - master - - - - - - - C6 - - - - - C8' - - - - C9' - - - - - C3' - - - - - - C4' - - - - - - C10' - - diff --git a/images/lr-branches-1.svg b/images/lr-branches-1.svg index ad05029..47f138e 100644 --- a/images/lr-branches-1.svg +++ b/images/lr-branches-1.svg @@ -1,72 +1,53 @@ - - - - - image/svg+xml - - images/lr-branches-1 - - - - - images/lr-branches-1 - Created with Sketch. - - - - C1 + + lr branches 1 + + + + + + + + + + + + C1 + + + + C2 + + + + C3 + + + + C4 + + + + C5 + + + + C6 + + + + C7 + + + + master + + + + develop + + + + topic - - - - C2 - - - - - C3 - - - - - C4 - - - - - C5 - - - - - C6 - - - - - C7 - - - - - - master - - - - - - - develop - - - - - - - topic - - - diff --git a/images/lr-branches-2.svg b/images/lr-branches-2.svg index cafaedd..926a631 100644 --- a/images/lr-branches-2.svg +++ b/images/lr-branches-2.svg @@ -1,65 +1,38 @@ - - - - - image/svg+xml - - images/lr-branches-2 - - - - - images/lr-branches-2 - Created with Sketch. - - - - - - - - - master - develop - topic - + + lr branches 2 + + + + + + + + + C1 - - - - C1 - - - - - - C2 - - - - - C3 - - - - - C4 - - - - - C5 - - - - - C6 - - - - C7 - + + + C2 + + + + C3 + + + + C4 + + + + C5 + + + + C6 + + + + C7 - diff --git a/images/merging-workflows-1.svg b/images/merging-workflows-1.svg index 622cb69..03bb373 100644 --- a/images/merging-workflows-1.svg +++ b/images/merging-workflows-1.svg @@ -1,84 +1,53 @@ - - - - - image/svg+xml - - images/merging-workflows-1 - - - - - images/merging-workflows-1 - Created with Sketch. - - - - - C1 - + + merging workflows 1 + + + + + + + + + + + + C1 + + + + C2 + + + + C7 + + + + C3 + + + + C4 + + + + C5 + + + + C6 + + + + master + + + + ruby_client + + + + php_client - - - - - C2 - - - - - - C7 - - - - - - C3 - - - - - - - C4 - - - - - - - C5 - - - - - - - C6 - - - - - - - master - - - - - - - ruby_client - - - - - - - php_client - - - diff --git a/images/merging-workflows-2.svg b/images/merging-workflows-2.svg index a96571c..5a6c260 100644 --- a/images/merging-workflows-2.svg +++ b/images/merging-workflows-2.svg @@ -1,100 +1,63 @@ - - - - - image/svg+xml - - images/merging-workflows-2 - - - - - images/merging-workflows-2 - Created with Sketch. - - - - - C1 - + + merging workflows 2 + + + + + + + + + + + + + + C1 + + + + C2 + + + + C7 + + + + C3 + + + + C4 + + + + C9 + + + + C8 + + + + C5 + + + + C6 + + + + master + + + + ruby_client + + + + php_client - - - - - C2 - - - - - - - C7 - - - - - - - C3 - - - - - - - C4 - - - - - - - - C9 - - - - - - - - C8 - - - - - - - C5 - - - - - - - C6 - - - - - - - master - - - - - - - ruby_client - - - - - php_client - - - diff --git a/images/merging-workflows-3.svg b/images/merging-workflows-3.svg index 4d96149..3a82d76 100644 --- a/images/merging-workflows-3.svg +++ b/images/merging-workflows-3.svg @@ -1,66 +1,43 @@ - - - - - image/svg+xml - - images/merging-workflows-3 - - - - - images/merging-workflows-3 - Created with Sketch. - - - - - C1 - + + merging workflows 3 + + + + + + + + + + C1 + + + + C2 + + + + C5 + + + + C3 + + + + C4 + + + + develop + + + + master + + + + ruby_client - - - - C2 - - - - - C5 - - - - - - C3 - - - - - - C4 - - - - - - develop - - - - - - - master - - - - - - - ruby_client - - - diff --git a/images/merging-workflows-4.svg b/images/merging-workflows-4.svg index 03d27b9..3e6d221 100644 --- a/images/merging-workflows-4.svg +++ b/images/merging-workflows-4.svg @@ -1,74 +1,48 @@ - - - - - image/svg+xml - - images/merging-workflows-4 - - - - - images/merging-workflows-4 - Created with Sketch. - - - - - C1 - + + merging workflows 4 + + + + + + + + + + + C1 + + + + C2 + + + + C5 + + + + C3 + + + + C4 + + + + C6 + + + + develop + + + + master + + + + ruby_client - - - - C2 - - - - - C5 - - - - - - C3 - - - - - - - C4 - - - - - - - C6 - - - - - - develop - - - - - - - master - - - - - - - ruby_client - - - diff --git a/images/merging-workflows-5.svg b/images/merging-workflows-5.svg index d817f71..1d9e73d 100644 --- a/images/merging-workflows-5.svg +++ b/images/merging-workflows-5.svg @@ -1,74 +1,48 @@ - - - - - image/svg+xml - - images/merging-workflows-5 - - - - - images/merging-workflows-5 - Created with Sketch. - - - - - C1 - + + merging workflows 5 + + + + + + + + + + + C1 + + + + C2 + + + + C5 + + + + C3 + + + + C4 + + + + C6 + + + + develop + + + + master + + + + ruby_client - - - - C2 - - - - - C5 - - - - - - C3 - - - - - - - C4 - - - - - - - C6 - - - - - - develop - - - - - - - master - - - - - - - ruby_client - - - From 7c960c2b0686259c71c714c03164371d5fb8b57c Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Tue, 4 Aug 2026 16:58:07 -0700 Subject: [PATCH 09/15] Phase 3 batch 3: add edges to small-team, managed-team, public-small, remote-branches, local, rerere, undomerge, replace figures Co-Authored-By: Claude Sonnet 4.6 --- figures/local.json | 6 +- figures/managed-team-1.json | 10 +- figures/managed-team-2.json | 16 ++- figures/managed-team-3.json | 18 ++- figures/public-small-1.json | 12 +- figures/public-small-2.json | 12 +- figures/public-small-3.json | 14 ++- figures/remote-branches-1.json | 10 +- figures/remote-branches-2.json | 14 ++- figures/remote-branches-3.json | 16 ++- figures/remote-branches-4.json | 18 ++- figures/remote-branches-5.json | 19 ++- figures/replace1.json | 8 +- figures/replace2.json | 9 +- figures/replace3.json | 10 +- figures/replace4.json | 12 +- figures/replace5.json | 11 +- figures/rerere1.json | 7 +- figures/rerere2.json | 8 +- figures/rerere3.json | 12 +- figures/small-team-1.json | 8 +- figures/small-team-2.json | 9 +- figures/small-team-3.json | 9 +- figures/small-team-4.json | 11 +- figures/small-team-5.json | 13 +- figures/small-team-6.json | 14 ++- figures/small-team-7.json | 14 ++- figures/undomerge-reset.json | 13 +- figures/undomerge-revert.json | 14 ++- figures/undomerge-revert2.json | 17 ++- figures/undomerge-revert3.json | 18 ++- figures/undomerge-start.json | 13 +- images/local.svg | 57 +++------ images/managed-team-1.svg | 95 +++++++-------- images/managed-team-2.svg | 150 +++++++++-------------- images/managed-team-3.svg | 195 +++++++++++++----------------- images/public-small-1.svg | 129 ++++++++------------ images/public-small-2.svg | 123 ++++++++----------- images/public-small-3.svg | 165 ++++++++++---------------- images/remote-branches-1.svg | 119 +++++++------------ images/remote-branches-2.svg | 154 ++++++++++-------------- images/remote-branches-3.svg | 147 ++++++++++------------- images/remote-branches-4.svg | 192 +++++++++++++----------------- images/remote-branches-5.svg | 211 ++++++++++++++------------------- images/replace1.svg | 70 ++++------- images/replace2.svg | 84 +++++-------- images/replace3.svg | 110 +++++++---------- images/replace4.svg | 142 ++++++++-------------- images/replace5.svg | 131 +++++++------------- images/rerere1.svg | 66 ++++------- images/rerere2.svg | 99 +++++----------- images/rerere3.svg | 174 +++++++++------------------ images/small-team-1.svg | 73 ++++-------- images/small-team-2.svg | 84 +++++-------- images/small-team-3.svg | 84 +++++-------- images/small-team-4.svg | 117 +++++++----------- images/small-team-5.svg | 142 +++++++++------------- images/small-team-6.svg | 157 ++++++++++-------------- images/small-team-7.svg | 157 ++++++++++-------------- images/undomerge-reset.svg | 131 ++++++++------------ images/undomerge-revert.svg | 141 +++++++++------------- images/undomerge-revert2.svg | 141 +++++++++------------- images/undomerge-revert3.svg | 151 ++++++++++------------- images/undomerge-start.svg | 127 ++++++++------------ 64 files changed, 1925 insertions(+), 2588 deletions(-) diff --git a/figures/local.json b/figures/local.json index 5777441..a1b5b37 100644 --- a/figures/local.json +++ b/figures/local.json @@ -35,5 +35,9 @@ "row": 2 } ], - "edges": [] + "edges": [ + { "from": "version-3", "to": "file", "arrow": "forward" }, + { "from": "version-2", "to": "version-3", "arrow": "forward" }, + { "from": "version-1", "to": "version-2", "arrow": "forward" } + ] } diff --git a/figures/managed-team-1.json b/figures/managed-team-1.json index 1fcae6d..c2bb374 100644 --- a/figures/managed-team-1.json +++ b/figures/managed-team-1.json @@ -68,5 +68,13 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "node_1edee", "to": "node_4b078" }, + { "from": "node_33009", "to": "node_1edee" }, + { "from": "e5b0f", "to": "node_1edee", "route": "diagonal" }, + { "from": "node_85127", "to": "e5b0f" }, + { "from": "master", "to": "node_1edee", "arrow": "forward" }, + { "from": "featurea", "to": "node_33009", "arrow": "forward" }, + { "from": "featureb", "to": "node_85127", "arrow": "forward" } + ] } diff --git a/figures/managed-team-2.json b/figures/managed-team-2.json index 3a7e865..fff7c1a 100644 --- a/figures/managed-team-2.json +++ b/figures/managed-team-2.json @@ -130,5 +130,19 @@ "row": 6 } ], - "edges": [] + "edges": [ + { "from": "node_1edee", "to": "node_4b078" }, + { "from": "node_33009", "to": "node_1edee" }, + { "from": "aad88", "to": "node_33009" }, + { "from": "node_774b3", "to": "aad88" }, + { "from": "e5b0f", "to": "node_33009", "route": "diagonal" }, + { "from": "fba9a", "to": "e5b0f" }, + { "from": "node_85127", "to": "e5b0f" }, + { "from": "cd685", "to": "node_85127" }, + { "from": "master", "to": "node_1edee", "arrow": "forward" }, + { "from": "featurea", "to": "node_774b3", "arrow": "forward" }, + { "from": "origin", "to": "node_774b3", "arrow": "forward" }, + { "from": "featureb", "to": "cd685", "arrow": "forward" }, + { "from": "origin-2", "to": "cd685", "arrow": "forward" } + ] } diff --git a/figures/managed-team-3.json b/figures/managed-team-3.json index 67a9f80..6017251 100644 --- a/figures/managed-team-3.json +++ b/figures/managed-team-3.json @@ -155,5 +155,21 @@ "dy": 12.29 } ], - "edges": [] + "edges": [ + { "from": "node_1edee", "to": "node_4b078" }, + { "from": "node_33009", "to": "node_1edee" }, + { "from": "aad88", "to": "node_33009" }, + { "from": "node_774b3", "to": "aad88" }, + { "from": "node_5399e", "to": "node_774b3" }, + { "from": "e5b0f", "to": "node_33009", "route": "diagonal" }, + { "from": "fba9a", "to": "e5b0f" }, + { "from": "node_85127", "to": "e5b0f" }, + { "from": "cd685", "to": "node_85127" }, + { "from": "master", "to": "node_1edee", "arrow": "forward" }, + { "from": "featurea", "to": "node_5399e", "arrow": "forward" }, + { "from": "origin", "to": "cd685", "arrow": "forward" }, + { "from": "origin-2", "to": "node_5399e", "arrow": "forward" }, + { "from": "origin-3", "to": "node_5399e", "arrow": "forward" }, + { "from": "featureb", "to": "cd685", "arrow": "forward" } + ] } diff --git a/figures/public-small-1.json b/figures/public-small-1.json index ffd9641..839a14b 100644 --- a/figures/public-small-1.json +++ b/figures/public-small-1.json @@ -86,5 +86,15 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "node_1edee", "to": "node_4b078" }, + { "from": "node_33009", "to": "node_1edee" }, + { "from": "a2de3", "to": "node_33009", "route": "diagonal" }, + { "from": "node_0d708", "to": "a2de3" }, + { "from": "e5b0f", "to": "node_33009", "route": "diagonal" }, + { "from": "master", "to": "node_33009", "arrow": "forward" }, + { "from": "origin", "to": "node_33009", "arrow": "forward" }, + { "from": "featurea", "to": "node_0d708", "arrow": "forward" }, + { "from": "featureb", "to": "e5b0f", "arrow": "forward" } + ] } diff --git a/figures/public-small-2.json b/figures/public-small-2.json index 76c9c8c..cd266f8 100644 --- a/figures/public-small-2.json +++ b/figures/public-small-2.json @@ -86,5 +86,15 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "node_1edee", "to": "node_4b078" }, + { "from": "node_33009", "to": "node_1edee" }, + { "from": "dee6b", "to": "node_33009", "route": "diagonal" }, + { "from": "node_5399e", "to": "dee6b" }, + { "from": "e5b0f", "to": "node_33009", "route": "diagonal" }, + { "from": "master", "to": "node_33009", "arrow": "forward" }, + { "from": "origin", "to": "node_33009", "arrow": "forward" }, + { "from": "featurea", "to": "node_5399e", "arrow": "forward" }, + { "from": "featureb", "to": "e5b0f", "arrow": "forward" } + ] } diff --git a/figures/public-small-3.json b/figures/public-small-3.json index a7a9f61..6354dea 100644 --- a/figures/public-small-3.json +++ b/figures/public-small-3.json @@ -102,5 +102,17 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "node_1edee", "to": "node_4b078" }, + { "from": "node_33009", "to": "node_1edee" }, + { "from": "node_17f4d", "to": "node_33009", "route": "diagonal" }, + { "from": "featurebv2", "to": "node_17f4d", "arrow": "forward" }, + { "from": "dee6b", "to": "node_33009", "route": "diagonal" }, + { "from": "node_5399e", "to": "dee6b" }, + { "from": "e5b0f", "to": "node_33009", "route": "diagonal" }, + { "from": "master", "to": "node_33009", "arrow": "forward" }, + { "from": "origin", "to": "node_33009", "arrow": "forward" }, + { "from": "featurea", "to": "node_5399e", "arrow": "forward" }, + { "from": "featureb", "to": "e5b0f", "arrow": "forward" } + ] } diff --git a/figures/remote-branches-1.json b/figures/remote-branches-1.json index 403e7a8..a854bbc 100644 --- a/figures/remote-branches-1.json +++ b/figures/remote-branches-1.json @@ -77,5 +77,13 @@ "dy": -33.0 } ], - "edges": [] + "edges": [ + { "from": "a6b4c", "to": "node_0b743" }, + { "from": "f4265", "to": "a6b4c" }, + { "from": "master", "to": "f4265", "arrow": "forward" }, + { "from": "a6b4c-2", "to": "node_0b743-2" }, + { "from": "f4265-2", "to": "a6b4c-2" }, + { "from": "origin-master", "to": "f4265-2", "arrow": "forward" }, + { "from": "master-2", "to": "f4265-2", "arrow": "forward" } + ] } diff --git a/figures/remote-branches-2.json b/figures/remote-branches-2.json index ece7b0a..8a53779 100644 --- a/figures/remote-branches-2.json +++ b/figures/remote-branches-2.json @@ -119,5 +119,17 @@ "dy": -33.0 } ], - "edges": [] + "edges": [ + { "from": "a6b4c", "to": "node_0b743" }, + { "from": "f4265", "to": "a6b4c" }, + { "from": "node_31b8e", "to": "f4265" }, + { "from": "node_190a3", "to": "node_31b8e" }, + { "from": "master", "to": "node_190a3", "arrow": "forward" }, + { "from": "a6b4c-2", "to": "node_0b743-2" }, + { "from": "f4265-2", "to": "a6b4c-2" }, + { "from": "a38de", "to": "f4265-2" }, + { "from": "node_893cf", "to": "a38de" }, + { "from": "origin-master", "to": "f4265-2", "arrow": "forward" }, + { "from": "master-2", "to": "node_893cf", "arrow": "forward" } + ] } diff --git a/figures/remote-branches-3.json b/figures/remote-branches-3.json index c49fe99..3abd07e 100644 --- a/figures/remote-branches-3.json +++ b/figures/remote-branches-3.json @@ -127,5 +127,19 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "a6b4c", "to": "node_0b743" }, + { "from": "f4265", "to": "a6b4c" }, + { "from": "node_31b8e", "to": "f4265" }, + { "from": "node_190a3", "to": "node_31b8e" }, + { "from": "origin-master", "to": "node_190a3", "arrow": "forward" }, + { "from": "a38de", "to": "node_190a3" }, + { "from": "node_893cf", "to": "a38de" }, + { "from": "master", "to": "node_893cf", "arrow": "forward" }, + { "from": "a6b4c-2", "to": "node_0b743-2" }, + { "from": "f4265-2", "to": "a6b4c-2" }, + { "from": "node_31b8e-2", "to": "f4265-2" }, + { "from": "node_190a3-2", "to": "node_31b8e-2" }, + { "from": "master-2", "to": "node_190a3-2", "arrow": "forward" } + ] } diff --git a/figures/remote-branches-4.json b/figures/remote-branches-4.json index 611b08d..952af7f 100644 --- a/figures/remote-branches-4.json +++ b/figures/remote-branches-4.json @@ -146,5 +146,21 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "a6b4c", "to": "node_0b743" }, + { "from": "f4265", "to": "a6b4c" }, + { "from": "node_31b8e", "to": "f4265" }, + { "from": "node_190a3", "to": "node_31b8e" }, + { "from": "origin-master", "to": "node_190a3", "arrow": "forward" }, + { "from": "a38de", "to": "node_190a3" }, + { "from": "node_893cf", "to": "a38de" }, + { "from": "master", "to": "node_893cf", "arrow": "forward" }, + { "from": "f4265-2", "to": "a6b4c" }, + { "from": "node_31b8e-2", "to": "f4265-2" }, + { "from": "node_190a3-2", "to": "node_31b8e-2" }, + { "from": "master-2", "to": "node_190a3-2", "arrow": "forward" }, + { "from": "f4265-3", "to": "node_31b8e-2" }, + { "from": "node_31b8e-3", "to": "f4265-3" }, + { "from": "master-3", "to": "node_31b8e-3", "arrow": "forward" } + ] } diff --git a/figures/remote-branches-5.json b/figures/remote-branches-5.json index ab0c04c..a35bd26 100644 --- a/figures/remote-branches-5.json +++ b/figures/remote-branches-5.json @@ -155,5 +155,22 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "a6b4c", "to": "node_0b743" }, + { "from": "f4265", "to": "a6b4c" }, + { "from": "node_31b8e", "to": "f4265" }, + { "from": "node_190a3", "to": "node_31b8e" }, + { "from": "origin-master", "to": "node_190a3", "arrow": "forward" }, + { "from": "teamone-master", "to": "node_190a3", "arrow": "forward" }, + { "from": "a38de", "to": "node_190a3" }, + { "from": "node_893cf", "to": "a38de" }, + { "from": "master", "to": "node_893cf", "arrow": "forward" }, + { "from": "f4265-2", "to": "a6b4c" }, + { "from": "node_31b8e-2", "to": "f4265-2" }, + { "from": "node_190a3-2", "to": "node_31b8e-2" }, + { "from": "master-2", "to": "node_190a3-2", "arrow": "forward" }, + { "from": "f4265-3", "to": "node_31b8e-2" }, + { "from": "node_31b8e-3", "to": "f4265-3" }, + { "from": "master-3", "to": "node_31b8e-3", "arrow": "forward" } + ] } diff --git a/figures/replace1.json b/figures/replace1.json index 0189769..9028324 100644 --- a/figures/replace1.json +++ b/figures/replace1.json @@ -50,5 +50,11 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "c6e1e", "to": "ef989" }, + { "from": "node_9c68f", "to": "c6e1e" }, + { "from": "node_94570", "to": "node_9c68f" }, + { "from": "c1822", "to": "node_94570" }, + { "from": "master", "to": "ef989", "arrow": "forward" } + ] } diff --git a/figures/replace2.json b/figures/replace2.json index 206cd49..17c3cbb 100644 --- a/figures/replace2.json +++ b/figures/replace2.json @@ -57,5 +57,12 @@ "dy": 1.0 } ], - "edges": [] + "edges": [ + { "from": "c6e1e", "to": "ef989" }, + { "from": "node_9c68f", "to": "c6e1e" }, + { "from": "node_94570", "to": "node_9c68f" }, + { "from": "c1822", "to": "node_94570" }, + { "from": "master", "to": "ef989", "arrow": "forward" }, + { "from": "history", "to": "c6e1e", "arrow": "forward" } + ] } diff --git a/figures/replace3.json b/figures/replace3.json index 794dd65..346447f 100644 --- a/figures/replace3.json +++ b/figures/replace3.json @@ -70,5 +70,13 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "c6e1e", "to": "ef989" }, + { "from": "node_9c68f", "to": "c6e1e" }, + { "from": "node_94570", "to": "node_9c68f" }, + { "from": "c1822", "to": "node_94570" }, + { "from": "master", "to": "ef989", "arrow": "forward" }, + { "from": "history", "to": "c6e1e", "arrow": "forward" }, + { "from": "node_622e8", "to": "c6e1e", "route": "diagonal" } + ] } diff --git a/figures/replace4.json b/figures/replace4.json index e1082ce..43735d8 100644 --- a/figures/replace4.json +++ b/figures/replace4.json @@ -87,5 +87,15 @@ "dx": 2.91 } ], - "edges": [] + "edges": [ + { "from": "e146b", "to": "master", "arrow": "forward" }, + { "from": "ef989", "to": "e146b" }, + { "from": "c6e1e", "to": "ef989" }, + { "from": "node_9c68f", "to": "c6e1e" }, + { "from": "node_94570", "to": "node_9c68f" }, + { "from": "c1822", "to": "node_94570" }, + { "from": "history", "to": "c6e1e", "arrow": "forward" }, + { "from": "node_81a70", "to": "e146b", "route": "diagonal" }, + { "from": "node_622e8", "to": "node_81a70" } + ] } diff --git a/figures/replace5.json b/figures/replace5.json index 028014f..7d52a07 100644 --- a/figures/replace5.json +++ b/figures/replace5.json @@ -83,5 +83,14 @@ "dx": -25.09 } ], - "edges": [] + "edges": [ + { "from": "e146b", "to": "master", "arrow": "forward" }, + { "from": "node_81a70", "to": "e146b" }, + { "from": "node_622e8", "to": "node_81a70" }, + { "from": "c6e1e", "to": "node_622e8", "route": "diagonal" }, + { "from": "node_9c68f", "to": "c6e1e" }, + { "from": "node_94570", "to": "node_9c68f" }, + { "from": "c1822", "to": "node_94570" }, + { "from": "history", "to": "c6e1e", "arrow": "forward" } + ] } diff --git a/figures/rerere1.json b/figures/rerere1.json index f43227e..2b49823 100644 --- a/figures/rerere1.json +++ b/figures/rerere1.json @@ -45,5 +45,10 @@ "row": 3 } ], - "edges": [] + "edges": [ + { "from": "world", "to": "hello-world" }, + { "from": "hello", "to": "hello-world" }, + { "from": "master", "to": "world", "arrow": "forward" }, + { "from": "i18n-world", "to": "hello", "arrow": "forward" } + ] } diff --git a/figures/rerere2.json b/figures/rerere2.json index 1bfc8dc..dcbf08a 100644 --- a/figures/rerere2.json +++ b/figures/rerere2.json @@ -53,5 +53,11 @@ "row": 3 } ], - "edges": [] + "edges": [ + { "from": "hola-world", "to": "hello-world" }, + { "from": "hola-mundo", "to": "hola-world" }, + { "from": "hello-mundo", "to": "hola-world" }, + { "from": "master", "to": "hola-mundo", "arrow": "forward" }, + { "from": "i18-world", "to": "hello-mundo", "arrow": "forward" } + ] } diff --git a/figures/rerere3.json b/figures/rerere3.json index d279677..6561485 100644 --- a/figures/rerere3.json +++ b/figures/rerere3.json @@ -102,5 +102,15 @@ "dy": 3.99 } ], - "edges": [] + "edges": [ + { "from": "hola-world", "to": "hello-world" }, + { "from": "hola-mundo", "to": "hola-world" }, + { "from": "master", "to": "hola-mundo", "arrow": "forward" }, + { "from": "i18-world", "to": "hola-mundo", "arrow": "forward" }, + { "from": "hola-world-2", "to": "hello-world-2" }, + { "from": "hello-mundo", "to": "hola-world-2" }, + { "from": "hola-mundo-2", "to": "hello-mundo" }, + { "from": "master-2", "to": "hola-mundo-2", "arrow": "forward" }, + { "from": "i18-world-2", "to": "hola-mundo-2", "arrow": "forward" } + ] } diff --git a/figures/small-team-1.json b/figures/small-team-1.json index b657418..704c05f 100644 --- a/figures/small-team-1.json +++ b/figures/small-team-1.json @@ -53,5 +53,11 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "node_1edee", "to": "node_4b078" }, + { "from": "node_738ee", "to": "node_1edee" }, + { "from": "fbff5", "to": "node_1edee" }, + { "from": "master", "to": "node_738ee", "arrow": "forward" }, + { "from": "origin-master", "to": "fbff5", "arrow": "forward" } + ] } diff --git a/figures/small-team-2.json b/figures/small-team-2.json index e0958fb..fd2d72f 100644 --- a/figures/small-team-2.json +++ b/figures/small-team-2.json @@ -61,5 +61,12 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "node_1edee", "to": "node_4b078" }, + { "from": "node_738ee", "to": "node_1edee" }, + { "from": "node_72bbc", "to": "node_738ee" }, + { "from": "fbff5", "to": "node_1edee" }, + { "from": "master", "to": "node_72bbc", "arrow": "forward" }, + { "from": "origin-master", "to": "fbff5", "arrow": "forward" } + ] } diff --git a/figures/small-team-3.json b/figures/small-team-3.json index 07dea0e..fdff8b1 100644 --- a/figures/small-team-3.json +++ b/figures/small-team-3.json @@ -61,5 +61,12 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "node_1edee", "to": "node_4b078" }, + { "from": "node_738ee", "to": "node_1edee" }, + { "from": "node_72bbc", "to": "node_738ee" }, + { "from": "fbff5", "to": "node_1edee" }, + { "from": "master", "to": "node_72bbc", "arrow": "forward" }, + { "from": "origin-master", "to": "node_72bbc", "arrow": "forward" } + ] } diff --git a/figures/small-team-4.json b/figures/small-team-4.json index cb517d3..352cfff 100644 --- a/figures/small-team-4.json +++ b/figures/small-team-4.json @@ -70,5 +70,14 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "node_1edee", "to": "node_4b078" }, + { "from": "fbff5", "to": "node_1edee" }, + { "from": "node_8149a", "to": "fbff5" }, + { "from": "node_23ac6", "to": "node_8149a" }, + { "from": "node_4af42", "to": "node_23ac6" }, + { "from": "master", "to": "fbff5", "arrow": "forward" }, + { "from": "origin-master", "to": "fbff5", "arrow": "forward" }, + { "from": "issue54", "to": "node_4af42", "arrow": "forward" } + ] } diff --git a/figures/small-team-5.json b/figures/small-team-5.json index 8db1ef3..13b4100 100644 --- a/figures/small-team-5.json +++ b/figures/small-team-5.json @@ -92,5 +92,16 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "node_1edee", "to": "node_4b078" }, + { "from": "fbff5", "to": "node_1edee" }, + { "from": "node_738ee", "to": "node_1edee" }, + { "from": "node_72bbc", "to": "node_738ee" }, + { "from": "node_8149a", "to": "fbff5" }, + { "from": "node_23ac6", "to": "node_8149a" }, + { "from": "node_4af42", "to": "node_23ac6" }, + { "from": "master", "to": "fbff5", "arrow": "forward" }, + { "from": "origin-master", "to": "node_72bbc", "arrow": "forward" }, + { "from": "issue54", "to": "node_4af42", "arrow": "forward" } + ] } diff --git a/figures/small-team-6.json b/figures/small-team-6.json index e3463c6..883091d 100644 --- a/figures/small-team-6.json +++ b/figures/small-team-6.json @@ -106,5 +106,17 @@ "dx": -1.0 } ], - "edges": [] + "edges": [ + { "from": "node_1edee", "to": "node_4b078" }, + { "from": "fbff5", "to": "node_1edee" }, + { "from": "node_738ee", "to": "node_1edee" }, + { "from": "node_72bbc", "to": "node_738ee" }, + { "from": "node_8149a", "to": "fbff5" }, + { "from": "node_23ac6", "to": "node_8149a" }, + { "from": "node_4af42", "to": "node_23ac6" }, + { "from": "node_8059c", "to": "node_72bbc", "route": "diagonal" }, + { "from": "master", "to": "node_8059c", "arrow": "forward" }, + { "from": "origin-master", "to": "node_72bbc", "arrow": "forward" }, + { "from": "issue54", "to": "node_4af42", "arrow": "forward" } + ] } diff --git a/figures/small-team-7.json b/figures/small-team-7.json index 791bdf1..6122c73 100644 --- a/figures/small-team-7.json +++ b/figures/small-team-7.json @@ -105,5 +105,17 @@ "dx": -1.0 } ], - "edges": [] + "edges": [ + { "from": "node_1edee", "to": "node_4b078" }, + { "from": "fbff5", "to": "node_1edee" }, + { "from": "node_738ee", "to": "node_1edee" }, + { "from": "node_72bbc", "to": "node_738ee" }, + { "from": "node_8149a", "to": "fbff5" }, + { "from": "node_23ac6", "to": "node_8149a" }, + { "from": "node_4af42", "to": "node_23ac6" }, + { "from": "node_8059c", "to": "node_72bbc", "route": "diagonal" }, + { "from": "master", "to": "node_8059c", "arrow": "forward" }, + { "from": "origin-master", "to": "node_8059c", "arrow": "forward" }, + { "from": "issue54", "to": "node_4af42", "arrow": "forward" } + ] } diff --git a/figures/undomerge-reset.json b/figures/undomerge-reset.json index 5bbb45f..b5f293c 100644 --- a/figures/undomerge-reset.json +++ b/figures/undomerge-reset.json @@ -80,5 +80,16 @@ "dx": -0.5 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c5", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c6", "to": "c5" }, + { "from": "m", "to": "c6" }, + { "from": "m", "to": "c4", "route": "diagonal" }, + { "from": "master", "to": "c6", "arrow": "forward" }, + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "topic", "to": "c4", "arrow": "forward" } + ] } diff --git a/figures/undomerge-revert.json b/figures/undomerge-revert.json index 5b89e3c..f203077 100644 --- a/figures/undomerge-revert.json +++ b/figures/undomerge-revert.json @@ -90,5 +90,17 @@ "row": 4 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c5", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c6", "to": "c5" }, + { "from": "m", "to": "c6" }, + { "from": "m", "to": "c4", "route": "diagonal" }, + { "from": "m-2", "to": "m" }, + { "from": "master", "to": "m-2", "arrow": "forward" }, + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "topic", "to": "c4", "arrow": "forward" } + ] } diff --git a/figures/undomerge-revert2.json b/figures/undomerge-revert2.json index 8712162..e867ec6 100644 --- a/figures/undomerge-revert2.json +++ b/figures/undomerge-revert2.json @@ -101,5 +101,20 @@ "dx": -1.7 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c5", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c6", "to": "c5" }, + { "from": "m", "to": "c6" }, + { "from": "m", "to": "c4", "route": "diagonal" }, + { "from": "m-2", "to": "m" }, + { "from": "c7", "to": "c4" }, + { "from": "c8", "to": "m-2" }, + { "from": "c8", "to": "c7", "route": "diagonal" }, + { "from": "master", "to": "c8", "arrow": "forward" }, + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "topic", "to": "c7", "arrow": "forward" } + ] } diff --git a/figures/undomerge-revert3.json b/figures/undomerge-revert3.json index df34490..8338cc9 100644 --- a/figures/undomerge-revert3.json +++ b/figures/undomerge-revert3.json @@ -108,5 +108,21 @@ "dx": -1.6 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c5", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c6", "to": "c5" }, + { "from": "m-2", "to": "c6" }, + { "from": "m-2", "to": "c4", "route": "diagonal" }, + { "from": "m-3", "to": "m-2" }, + { "from": "c7", "to": "c4" }, + { "from": "m", "to": "m-3" }, + { "from": "m", "to": "c7", "route": "diagonal" }, + { "from": "c8", "to": "m" }, + { "from": "master", "to": "c8", "arrow": "forward" }, + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "topic", "to": "c7", "arrow": "forward" } + ] } diff --git a/figures/undomerge-start.json b/figures/undomerge-start.json index 1fbf26c..99ca881 100644 --- a/figures/undomerge-start.json +++ b/figures/undomerge-start.json @@ -78,5 +78,16 @@ "row": 4 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "c5", "to": "c2" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "c6", "to": "c5" }, + { "from": "m", "to": "c6" }, + { "from": "m", "to": "c4", "route": "diagonal" }, + { "from": "master", "to": "m", "arrow": "forward" }, + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "topic", "to": "c4", "arrow": "forward" } + ] } diff --git a/images/local.svg b/images/local.svg index dcc3a07..36e58ed 100644 --- a/images/local.svg +++ b/images/local.svg @@ -1,44 +1,23 @@ - - - - - image/svg+xml - - images/local - - - - images/local - Created with Sketch. - - - - Local Computer - - Version Database - Checkout + + local + + + + + + File - - File - - - - Version 3 - - - - Version 2 - - - - Version 1 - + + + Version 3 - - - - + + + Version 2 + + + + Version 1 - diff --git a/images/managed-team-1.svg b/images/managed-team-1.svg index 12bffd3..46b62a4 100644 --- a/images/managed-team-1.svg +++ b/images/managed-team-1.svg @@ -1,56 +1,43 @@ - - - - - image/svg+xml - - images/managed-team-1 - - - - - images/managed-team-1 - Created with Sketch. - - - - 4b078 - - - - - 1edee - - - - - - 33009 - - - - - - 85127 - - - - - e5b0f - - - - - featureB - - - - - master - - - - featureA - + + managed team 1 + + + + + + + + + + 4b078 + + + + 1edee + + + + 33009 + + + + 85127 + + + + e5b0f + + + + featureB + + + + master + + + + featureA + diff --git a/images/managed-team-2.svg b/images/managed-team-2.svg index 7318ac6..0927008 100644 --- a/images/managed-team-2.svg +++ b/images/managed-team-2.svg @@ -1,109 +1,73 @@ - - - - - image/svg+xml - - images/managed-team-2 - - - - - images/managed-team-2 - Created with Sketch. - - - - - 4b078 + + managed team 2 + + + + + + + + + + + + + + + + 4b078 - - - - 1edee + + + 1edee - - - - - 33009 - + + + 33009 - - - - - aad88 - + + + aad88 - - - - - 774b3 - + + + 774b3 - - - - - 85127 - + + + 85127 - - - - cd685 + + + cd685 - - - - fba9a + + + fba9a - - - - e5b0f + + + e5b0f - - - - - - - - - - featureB - + + + featureB - - - - - master - + + + master - - - - - - - - - - featureA - + + + featureA - - - origin/featureA + + + origin/featureA - - - origin/featureBee + + + origin/featureBee - diff --git a/images/managed-team-3.svg b/images/managed-team-3.svg index bb65880..68ce3f7 100644 --- a/images/managed-team-3.svg +++ b/images/managed-team-3.svg @@ -1,116 +1,83 @@ - - - - - image/svg+xml - - images/managed-team-3 - - - - - images/managed-team-3 - Created with Sketch. - - - - - - 4b078 - - - - - 1edee - - - - - - 33009 - - - - - - - aad88 - - - - - - - 774b3 - - - - - - 5399e - - - - - - 85127 - - - - - - cd685 - - - - - fba9a - - - - - e5b0f - - - - - - - - - featureB - - - - - - - master - - - - - - - - - - featureA - - - origin/featureBee - - - - origin/featureA - - - - - - - - origin/master - + + managed team 3 + + + + + + + + + + + + + + + + + + 4b078 + + + + 1edee + + + + 33009 + + + + aad88 + + + + 774b3 + + + + 5399e + + + + 85127 + + + + cd685 + + + + fba9a + + + + e5b0f + + + + featureB + + + + master + + + + featureA + + + + origin/featureBee + + + + origin/featureA + + + + origin/master + diff --git a/images/public-small-1.svg b/images/public-small-1.svg index b938422..650de1d 100644 --- a/images/public-small-1.svg +++ b/images/public-small-1.svg @@ -1,82 +1,53 @@ - - - - - image/svg+xml - - images/public-small-1 - - - - - images/public-small-1 - Created with Sketch. - - - - 4b078 + + public small 1 + + + + + + + + + + + + 4b078 + + + + 1edee + + + + 33009 + + + + 0d708 + + + + e5b0f + + + + a2de3 + + + + master + + + + featureA + + + + featureB + + + + origin/master - - - - - 1edee - - - - - - - 33009 - - - - - - - 0d708 - - - - - - e5b0f - - - - - a2de3 - - - - - - master - - - - - - - featureA - - - - - - - featureB - - - - - - - - - origin/master - - - diff --git a/images/public-small-2.svg b/images/public-small-2.svg index d1aa124..02e0733 100644 --- a/images/public-small-2.svg +++ b/images/public-small-2.svg @@ -1,76 +1,53 @@ - - - - - image/svg+xml - - images/public-small-2 - - - - - images/public-small-2 - Created with Sketch. - - - - 4b078 + + public small 2 + + + + + + + + + + + + 4b078 + + + + 1edee + + + + 33009 + + + + 5399e + + + + e5b0f + + + + dee6b + + + + master + + + + featureA + + + + featureB + + + + origin/master - - - - 1edee - - - - - 33009 - - - - - - 5399e - - - - - - e5b0f - - - - - dee6b - - - - - master - - - - - - featureA - - - - - - - featureB - - - - - - - - - origin/master - - - diff --git a/images/public-small-3.svg b/images/public-small-3.svg index 2f31fcc..54d3772 100644 --- a/images/public-small-3.svg +++ b/images/public-small-3.svg @@ -1,108 +1,63 @@ - - - - - image/svg+xml - - images/public-small-3 - - - - - - - - - - images/public-small-3 - Created with Sketch. - - - - - - 4b078 - - - - - - 1edee - - - - - - - 33009 - - - - - - - 5399e - - - - - - - 17f4d - - - - - - - e5b0f - - - - - - - dee6b - - - - - - - master - - - - - - - featureA - - - - - - - featureB - - - - - - - featureBv2 - - - - - - - - - origin/master - - + + public small 3 + + + + + + + + + + + + + + 4b078 + + + + 1edee + + + + 33009 + + + + 5399e + + + + 17f4d + + + + e5b0f + + + + dee6b + + + + master + + + + featureA + + + + featureB + + + + featureBv2 + + + + origin/master - diff --git a/images/remote-branches-1.svg b/images/remote-branches-1.svg index 1e46642..749d22e 100644 --- a/images/remote-branches-1.svg +++ b/images/remote-branches-1.svg @@ -1,78 +1,47 @@ - - - - - image/svg+xml - - images/remote-branches-1 - - - - - images/remote-branches-1 - Created with Sketch. - - - - - - 0b743 + + remote branches 1 + + + + + + + + + + 0b743 + + + + a6b4c + + + + f4265 + + + + master + + + + 0b743 + + + + a6b4c + + + + f4265 + + + + master + + + + origin/master - - - - a6b4c - - - - - f4265 - - - - - - master - - - git.ourcompany.com - git clone janedoe@git.ourcompany.com:project.git - - - - 0b743 - - - - - - a6b4c - - - - - - - f4265 - - - - - - - master - - - - - - - origin/master - - - My Computer - Remote branch - Local branch - diff --git a/images/remote-branches-2.svg b/images/remote-branches-2.svg index b76e0fc..fa6c17f 100644 --- a/images/remote-branches-2.svg +++ b/images/remote-branches-2.svg @@ -1,95 +1,67 @@ - - - - - image/svg+xml - - images/remote-branches-2 - - - - - images/remote-branches-2 - Created with Sketch. - - - - - 0b743 - - - - - a6b4c - - - - - f4265 - - - - - 31b8e - - - - - 190a3 - - - - - - master - - + + remote branches 2 + + + + + + + + + + + + + + 0b743 - - - - 0b743 - - - - - a6b4c - - - - - f4265 - - - - - a38de - - - - - 893cf - - - - - - master - - - - - - - origin/master - - + + + a6b4c + + + + f4265 + + + + 31b8e + + + + 190a3 + + + + master + + + + 0b743 + + + + a6b4c + + + + f4265 + + + + a38de + + + + 893cf + + + + master + + + + origin/master - - - My Computer - git.ourcompany.com - Someone else pushes - diff --git a/images/remote-branches-3.svg b/images/remote-branches-3.svg index 452ae22..b0f3e4a 100644 --- a/images/remote-branches-3.svg +++ b/images/remote-branches-3.svg @@ -1,104 +1,77 @@ - - - - - image/svg+xml - - images/remote-branches-3 - - - - - images/remote-branches-3 - Created with Sketch. - - - - 0b743 + + remote branches 3 + + + + + + + + + + + + + + + + 0b743 - - - - a6b4c + + + a6b4c - - - - - f4265 - + + + f4265 - - - - - 31b8e + + + 31b8e - - - - 190a3 + + + 190a3 - - - a38de + + + a38de - - - - 893cf + + + 893cf - - - - - master - + + + master - - - - - origin/master - + + + origin/master - - My Computer - - - 0b743 + + + 0b743 - - - - a6b4c + + + a6b4c - - - - f4265 + + + f4265 - - - - 31b8e + + + 31b8e - - - - 190a3 + + + 190a3 - - - - - master - + + + master - - git.ourcompany.com - git fetch origin - - diff --git a/images/remote-branches-4.svg b/images/remote-branches-4.svg index 8b7bd0c..338df1b 100644 --- a/images/remote-branches-4.svg +++ b/images/remote-branches-4.svg @@ -1,113 +1,83 @@ - - - - - image/svg+xml - - images/remote-branches-4 - - - - - images/remote-branches-4 - Created with Sketch. - - - - 0b743 - - - - - a6b4c - - - - - - f4265 - - - - - - - 31b8e - - - - - 190a3 - - - - a38de - - - - - 893cf - - - - - master - - - - - - origin/master - - - - My Computer - git remote add teamone git://git.team1.ourcompany.com - - - - f4265 - - - - - 31b8e - - - - - 190a3 - - - - - - master - - - - git.ourcompany.com - origin - - - - f4265 - - - - - 31b8e - - - - - - master - - - - git.team1.ourcompany.com - teamone - + + remote branches 4 + + + + + + + + + + + + + + + + + + 0b743 + + + + a6b4c + + + + f4265 + + + + 31b8e + + + + 190a3 + + + + a38de + + + + 893cf + + + + master + + + + origin/master + + + + f4265 + + + + 31b8e + + + + 190a3 + + + + master + + + + f4265 + + + + 31b8e + + + + master + diff --git a/images/remote-branches-5.svg b/images/remote-branches-5.svg index 0ba0a04..c73aeda 100644 --- a/images/remote-branches-5.svg +++ b/images/remote-branches-5.svg @@ -1,127 +1,88 @@ - - - - - image/svg+xml - - images/remote-branches-5 - - - - - images/remote-branches-5 - Created with Sketch. - - - - - - 0b743 - - - - - a6b4c - - - - - - f4265 - - - - - - - 31b8e - - - - - 190a3 - - - - a38de - - - - - 893cf - - - - - - master - - - - - - - origin/master - - - - - - teamone/master - - - - My Computer - git fetch teamone - - - - - f4265 - - - - - 31b8e - - - - - 190a3 - - - - - - master - - - - - git.ourcompany.com - origin - - - - - f4265 - - - - - 31b8e - - - - - - master - - - - - git.team1.ourcompany.com - teamone - + + remote branches 5 + + + + + + + + + + + + + + + + + + + 0b743 + + + + a6b4c + + + + f4265 + + + + 31b8e + + + + 190a3 + + + + a38de + + + + 893cf + + + + master + + + + origin/master + + + + teamone/master + + + + f4265 + + + + 31b8e + + + + 190a3 + + + + master + + + + f4265 + + + + 31b8e + + + + master + diff --git a/images/replace1.svg b/images/replace1.svg index 7475392..be2c5a8 100644 --- a/images/replace1.svg +++ b/images/replace1.svg @@ -1,53 +1,33 @@ - - - - - image/svg+xml - - images/replace1 - - - - - images/replace1 - Created with Sketch. - - - - - ef989 - fifth + + replace1 + + + + + + + + ef989 - - - c6e1e - fourth + + + c6e1e - - - - 9c68f - third + + + 9c68f - - - - 94570 - second + + + 94570 - - - - c1822 - first + + + c1822 - - - - - master - + + + master - diff --git a/images/replace2.svg b/images/replace2.svg index 30410b0..3f24ed8 100644 --- a/images/replace2.svg +++ b/images/replace2.svg @@ -1,64 +1,38 @@ - - - - - image/svg+xml - - images/replace2 - - - - - images/replace2 - Created with Sketch. - - - - - ef989 - fifth + + replace2 + + + + + + + + + ef989 - - - - - c6e1e - fourth - + + + c6e1e - - - - - 9c68f - third - + + + 9c68f - - - - 94570 - second + + + 94570 - - - c1822 - first + + + c1822 - - - - - master - + + + master - - - - - history - + + + history - diff --git a/images/replace3.svg b/images/replace3.svg index 193ac79..433d26d 100644 --- a/images/replace3.svg +++ b/images/replace3.svg @@ -1,73 +1,43 @@ - - - - - image/svg+xml - - images/replace3 - - - - - images/replace3 - Created with Sketch. - - - - - 622e8 - instructions - - - - - - c6e1e - fourth - - - - - - - 9c68f - third - - - - - - 94570 - second - - - - c1822 - first - - - - - - history - - - - - - - ef989 - fifth - - - - - - master - - - + + replace3 + + + + + + + + + + 622e8 + + + + c6e1e + + + + 9c68f + + + + 94570 + + + + c1822 + + + + history + + + + ef989 + + + + master - diff --git a/images/replace4.svg b/images/replace4.svg index 9181110..88c63d1 100644 --- a/images/replace4.svg +++ b/images/replace4.svg @@ -1,95 +1,53 @@ - - - - - image/svg+xml - - images/replace4 - - - - - images/replace4 - Created with Sketch. - - - - - - - rebase - - - - - - - - ef989 - fifth - - - - - - - master - - - - - - - e146b - fifth - - - - - c6e1e - fourth - - - - - - - history - - - - - - - 81a70 - fourth - - - - - 622e8 - instructions - - - - - - 9c68f - third - - - - - - 94570 - second - - - - c1822 - first - + + replace4 + + + + + + + + + + + + ef989 + + + + master + + + + e146b + + + + c6e1e + + + + history + + + + 81a70 + + + + 622e8 + + + + 9c68f + + + + 94570 + + + + c1822 - diff --git a/images/replace5.svg b/images/replace5.svg index dae52b6..0647849 100644 --- a/images/replace5.svg +++ b/images/replace5.svg @@ -1,89 +1,48 @@ - - - - - image/svg+xml - - images/replace5 - - - - - images/replace5 - Created with Sketch. - - - - - - - master - - - - - - - e146b - fifth - - - - - replace - - - - - - - 81a70 - fourth - - - - - 622e8 - instructions - - - - - - - - c6e1e - fourth - - - - - - - history - - - - - - - 9c68f - third - - - - - - 94570 - second - - - - c1822 - first - - + + replace5 + + + + + + + + + + + master + + + + e146b + + + + 81a70 + + + + 622e8 + + + + c6e1e + + + + history + + + + 9c68f + + + + 94570 + + + + c1822 - diff --git a/images/rerere1.svg b/images/rerere1.svg index 7bf25b2..c3ff928 100644 --- a/images/rerere1.svg +++ b/images/rerere1.svg @@ -1,52 +1,28 @@ - - - - - image/svg+xml - - images/rerere1 - - - - - images/rerere1 - Created with Sketch. - - - - - - master - + + rerere1 + + + + + + + master - - - - - hello world - + + + hello world - - - - - hola world - + + + world - - - - - hello mundo - + + + hello - - - - - i18n-world - + + + i18n-world - diff --git a/images/rerere2.svg b/images/rerere2.svg index 041e268..7454e92 100644 --- a/images/rerere2.svg +++ b/images/rerere2.svg @@ -1,72 +1,33 @@ - - - - - image/svg+xml - - images/rerere2 - - - - - images/rerere2 - Created with Sketch. - - - - - - - hello world - - - - - - - hola world - - - - - - - - hola mundo - - - - - hello mundo - - - - - - - - rerere cache - - - - - puts ‘hola world’ - puts ‘hello mundo’ ++ puts ‘hola mundo’ - - - - - - - master - - - - - - - i18-world - - + + rerere2 + + + + + + + + hello world + + + + hola world + + + + hola mundo + + + + hello mundo + + + + master + + + + i18-world - diff --git a/images/rerere3.svg b/images/rerere3.svg index 61bd342..9d78ac6 100644 --- a/images/rerere3.svg +++ b/images/rerere3.svg @@ -1,123 +1,57 @@ - - - - - image/svg+xml - - images/rerere3 - - - - - images/rerere3 - Created with Sketch. - - - - - - diff --git a/images/small-team-1.svg b/images/small-team-1.svg index e33ae1b..ae4271d 100644 --- a/images/small-team-1.svg +++ b/images/small-team-1.svg @@ -1,56 +1,33 @@ - - - - - image/svg+xml - - images/small-team-1 - - - - - images/small-team-1 - Created with Sketch. - - - - 4b078 + + small team 1 + + + + + + + + 4b078 - - - - - 1edee - + + + 1edee - - - - - 738ee - + + + 738ee - - - - - fbff5 - + + + fbff5 - - - - - origin/master - + + + origin/master - - - - - master - + + + master - diff --git a/images/small-team-2.svg b/images/small-team-2.svg index 78e7d23..0f0a625 100644 --- a/images/small-team-2.svg +++ b/images/small-team-2.svg @@ -1,64 +1,38 @@ - - - - - image/svg+xml - - images/small-team-2 - - - - - images/small-team-2 - Created with Sketch. - - - - 4b078 + + small team 2 + + + + + + + + + 4b078 - - - - - 1edee - + + + 1edee - - - - - 738ee - + + + 738ee - - - - - - 72bbc - + + + 72bbc - - - - - fbff5 - + + + fbff5 - - - - - origin/master - + + + origin/master - - - - - master - + + + master - diff --git a/images/small-team-3.svg b/images/small-team-3.svg index 1a2dbd4..501d904 100644 --- a/images/small-team-3.svg +++ b/images/small-team-3.svg @@ -1,64 +1,38 @@ - - - - - image/svg+xml - - images/small-team-3 - - - - - images/small-team-3 - Created with Sketch. - - - - 4b078 + + small team 3 + + + + + + + + + 4b078 - - - - - 1edee - + + + 1edee - - - - - 738ee - + + + 738ee - - - - - - 72bbc - + + + 72bbc - - - - - fbff5 - + + + fbff5 - - - - - origin/master - + + + origin/master - - - - - master - + + + master - diff --git a/images/small-team-4.svg b/images/small-team-4.svg index 3cd495e..e83cc1d 100644 --- a/images/small-team-4.svg +++ b/images/small-team-4.svg @@ -1,75 +1,48 @@ - - - - - image/svg+xml - - images/small-team-4 - - - - - images/small-team-4 - Created with Sketch. - - - - 4b078 + + small team 4 + + + + + + + + + + + 4b078 + + + + 1edee + + + + fbff5 + + + + 8149a + + + + 23ac6 + + + + 4af42 + + + + origin/master + + + + master + + + + issue54 - - - - - 1edee - - - - - - - fbff5 - - - - - - - 8149a - - - - - - - 23ac6 - - - - - - - 4af42 - - - - - - - origin/master - - - - - - master - - - - - - issue54 - - - diff --git a/images/small-team-5.svg b/images/small-team-5.svg index 8279e68..fa5306f 100644 --- a/images/small-team-5.svg +++ b/images/small-team-5.svg @@ -1,90 +1,58 @@ - - - - - image/svg+xml - - images/small-team-5 - - - - - images/small-team-5 - Created with Sketch. - - - - 4b078 + + small team 5 + + + + + + + + + + + + + 4b078 + + + + 1edee + + + + fbff5 + + + + 738ee + + + + 72bbc + + + + 8149a + + + + 23ac6 + + + + 4af42 + + + + origin/master + + + + master + + + + issue54 - - - - - 1edee - - - - - - fbff5 - - - - - - 738ee - - - - - - - - 72bbc - - - - - - - 8149a - - - - - - - 23ac6 - - - - - - - 4af42 - - - - - - - origin/master - - - - - - - master - - - - - - - issue54 - - - diff --git a/images/small-team-6.svg b/images/small-team-6.svg index 0c0804b..354777f 100644 --- a/images/small-team-6.svg +++ b/images/small-team-6.svg @@ -1,100 +1,63 @@ - - - - - image/svg+xml - - images/small-team-6 - - - - - images/small-team-6 - Created with Sketch. - - - - 4b078 + + small team 6 + + + + + + + + + + + + + + 4b078 + + + + 1edee + + + + fbff5 + + + + 738ee + + + + 72bbc + + + + 8059c + + + + 8149a + + + + 23ac6 + + + + 4af42 + + + + origin/master + + + + master + + + + issue54 - - - - - 1edee - - - - - - - fbff5 - - - - - - - 738ee - - - - - - - - 72bbc - - - - - - - - 8059c - - - - - - - 8149a - - - - - - - 23ac6 - - - - - - - 4af42 - - - - - - - origin/master - - - - - - - master - - - - - - - issue54 - - - diff --git a/images/small-team-7.svg b/images/small-team-7.svg index 7260762..dc01c6e 100644 --- a/images/small-team-7.svg +++ b/images/small-team-7.svg @@ -1,100 +1,63 @@ - - - - - image/svg+xml - - images/small-team-7 - - - - - images/small-team-7 - Created with Sketch. - - - - 4b078 + + small team 7 + + + + + + + + + + + + + + 4b078 + + + + 1edee + + + + fbff5 + + + + 738ee + + + + 72bbc + + + + 8059c + + + + 8149a + + + + 23ac6 + + + + 4af42 + + + + origin/master + + + + master + + + + issue54 - - - - - 1edee - - - - - - - fbff5 - - - - - - - 738ee - - - - - - - - 72bbc - - - - - - - - 8059c - - - - - - - 8149a - - - - - - - 23ac6 - - - - - - - 4af42 - - - - - - - origin/master - - - - - - - master - - - - - - - issue54 - - - diff --git a/images/undomerge-reset.svg b/images/undomerge-reset.svg index e9a0f8a..aa5b6c5 100644 --- a/images/undomerge-reset.svg +++ b/images/undomerge-reset.svg @@ -1,83 +1,54 @@ - - - - - image/svg+xml - - images/undomerge-reset - - - - - images/undomerge-reset - Created with Sketch. - - - - C1 + + undomerge reset + + + + + + + + + + + + + C1 + + + + C2 + + + + C5 + + + + C3 + + + + C4 + + + + C6 + + + + M + + + + master + + + + HEAD + + + + topic - - - - - - C2 - - - - - - - C5 - - - - - C3 - - - - - C4 - - - - - - C6 - - - - - - - - M - - - - - - - - master - - - - - - - HEAD - - - - - - - - topic - - - diff --git a/images/undomerge-revert.svg b/images/undomerge-revert.svg index df81ae2..df44a57 100644 --- a/images/undomerge-revert.svg +++ b/images/undomerge-revert.svg @@ -1,88 +1,59 @@ - - - - - image/svg+xml - - images/undomerge-revert - - - - - images/undomerge-revert - Created with Sketch. - - - - C1 + + undomerge revert + + + + + + + + + + + + + + C1 + + + + C2 + + + + C5 + + + + C3 + + + + C4 + + + + C6 + + + + M + + + + ^M + + + + master + + + + HEAD + + + + topic - - - - - - - C2 - - - - - - - C5 - - - - - C3 - - - - - C4 - - - - - - C6 - - - - - - - M - - - - - - ^M - - - - - - - master - - - - - - - HEAD - - - - - - - - topic - - - diff --git a/images/undomerge-revert2.svg b/images/undomerge-revert2.svg index 146d80e..388fb33 100644 --- a/images/undomerge-revert2.svg +++ b/images/undomerge-revert2.svg @@ -1,99 +1,70 @@ - - - - - image/svg+xml - - images/undomerge-revert2 - - - - - images/undomerge-revert2 - Created with Sketch. - - - - C1 + + undomerge revert2 + + + + + + + + + + + + + + + + + C1 - - - - - - - C2 - + + + C2 - - - - - C5 - + + + C5 - - - C3 + + + C3 - - - - C4 + + + C4 - - - - - C6 - + + + C6 - - - - C7 + + + C7 - - - - - C8 + + + C8 - - - - - M - + + + M - - - - ^M + + + ^M - - - - - - master - - - - - - - HEAD - - + + + master - - - - - topic - + + + HEAD + + + + topic - diff --git a/images/undomerge-revert3.svg b/images/undomerge-revert3.svg index 7459de4..5389c01 100644 --- a/images/undomerge-revert3.svg +++ b/images/undomerge-revert3.svg @@ -1,106 +1,75 @@ - - - - - image/svg+xml - - images/undomerge-revert3 - - - - - images/undomerge-revert3 - Created with Sketch. - - - - C1 + + undomerge revert3 + + + + + + + + + + + + + + + + + + C1 - - - - - - - C2 - + + + C2 - - - - - C5 - + + + C5 - - - C3 + + + C3 - - - - C4 + + + C4 - - - - - C6 - + + + C6 - - - - C7 + + + C7 - - - - - ^^M - + + + ^^M - - - - - C8 + + + C8 - - - - - M - + + + M - - - - ^M + + + ^M - - - - - - master - - - - - - - HEAD - - + + + master - - - - - topic - + + + HEAD + + + + topic - diff --git a/images/undomerge-start.svg b/images/undomerge-start.svg index 8a9e3bb..93d2992 100644 --- a/images/undomerge-start.svg +++ b/images/undomerge-start.svg @@ -1,79 +1,54 @@ - - - - - image/svg+xml - - images/undomerge-start - - - - - images/undomerge-start - Created with Sketch. - - - - C1 + + undomerge start + + + + + + + + + + + + + C1 + + + + C2 + + + + C5 + + + + C3 + + + + C4 + + + + C6 + + + + M + + + + master + + + + HEAD + + + + topic - - - - - - - C2 - - - - - - - C5 - - - - - C3 - - - - - C4 - - - - - - C6 - - - - - - M - - - - - - master - - - - - - - HEAD - - - - - - - topic - - - From f23d5bec4008833b9b57c403f585502f113bbee3 Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Tue, 4 Aug 2026 18:45:17 -0700 Subject: [PATCH 10/15] Phase 3 batch 4: add edges to advance, branch-and-history, topic-branches, large-merges, perils-of-rebasing, reset series, centralized_workflow Co-Authored-By: Claude Sonnet 4.6 --- figures/advance-master.json | 10 +- figures/advance-testing.json | 9 +- figures/branch-and-history.json | 11 +- figures/centralized_workflow.json | 6 +- figures/large-merges-1.json | 20 +- figures/large-merges-2.json | 27 ++- figures/perils-of-rebasing-1.json | 8 +- figures/perils-of-rebasing-2.json | 15 +- figures/perils-of-rebasing-3.json | 17 +- figures/perils-of-rebasing-4.json | 18 +- figures/perils-of-rebasing-5.json | 14 +- figures/reset-checkout.json | 15 +- figures/reset-ex1.json | 4 +- figures/reset-ex2.json | 4 +- figures/reset-ex3.json | 5 +- figures/reset-ex4.json | 5 +- figures/reset-ex5.json | 5 +- figures/reset-ex6.json | 5 +- figures/reset-hard.json | 6 +- figures/reset-mixed.json | 6 +- figures/reset-path1.json | 5 +- figures/reset-path2.json | 5 +- figures/reset-path3.json | 5 +- figures/reset-soft.json | 6 +- figures/reset-squash-r1.json | 5 +- figures/reset-squash-r2.json | 6 +- figures/reset-squash-r3.json | 6 +- figures/reset-start.json | 5 +- figures/reset-workflow.json | 4 +- figures/topic-branches-1.json | 20 +- figures/topic-branches-2.json | 18 +- images/advance-master.svg | 100 +++++----- images/advance-testing.svg | 78 ++++---- images/branch-and-history.svg | 105 +++++------ images/centralized_workflow.svg | 54 ++---- images/large-merges-1.svg | 215 +++++++++------------- images/large-merges-2.svg | 296 +++++++++++++----------------- images/perils-of-rebasing-1.svg | 79 +++----- images/perils-of-rebasing-2.svg | 170 +++++++---------- images/perils-of-rebasing-3.svg | 216 ++++++++-------------- images/perils-of-rebasing-4.svg | 227 +++++++++-------------- images/perils-of-rebasing-5.svg | 150 ++++++--------- images/reset-checkout.svg | 184 +++++++------------ images/reset-ex1.svg | 73 +++----- images/reset-ex2.svg | 90 +++------ images/reset-ex3.svg | 123 ++++--------- images/reset-ex4.svg | 111 ++++------- images/reset-ex5.svg | 111 ++++------- images/reset-ex6.svg | 134 ++++---------- images/reset-hard.svg | 160 +++++----------- images/reset-mixed.svg | 150 ++++----------- images/reset-path1.svg | 112 ++++------- images/reset-path2.svg | 108 ++++------- images/reset-path3.svg | 131 ++++--------- images/reset-soft.svg | 139 ++++---------- images/reset-squash-r1.svg | 178 ++++++------------ images/reset-squash-r2.svg | 206 +++++++-------------- images/reset-squash-r3.svg | 218 ++++++++-------------- images/reset-start.svg | 116 +++--------- images/reset-workflow.svg | 59 ++---- images/topic-branches-1.svg | 191 +++++++++---------- images/topic-branches-2.svg | 197 ++++++++------------ 62 files changed, 1843 insertions(+), 2933 deletions(-) diff --git a/figures/advance-master.json b/figures/advance-master.json index f86cefc..24936df 100644 --- a/figures/advance-master.json +++ b/figures/advance-master.json @@ -69,5 +69,13 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "node_34ac2", "to": "node_98ca9" }, + { "from": "f30ab", "to": "node_34ac2" }, + { "from": "c2b9e", "to": "f30ab", "route": "diagonal" }, + { "from": "node_87ab2", "to": "f30ab", "route": "diagonal" }, + { "from": "master", "to": "c2b9e", "arrow": "forward" }, + { "from": "testing", "to": "node_87ab2", "arrow": "forward" }, + { "from": "head", "to": "master", "arrow": "forward" } + ] } diff --git a/figures/advance-testing.json b/figures/advance-testing.json index 1f9d93b..8272fca 100644 --- a/figures/advance-testing.json +++ b/figures/advance-testing.json @@ -62,5 +62,12 @@ "dx": 0.5 } ], - "edges": [] + "edges": [ + { "from": "node_34ac2", "to": "node_98ca9" }, + { "from": "f30ab", "to": "node_34ac2" }, + { "from": "node_87ab2", "to": "f30ab" }, + { "from": "master", "to": "f30ab", "arrow": "forward" }, + { "from": "testing", "to": "node_87ab2", "arrow": "forward" }, + { "from": "head", "to": "testing", "arrow": "forward" } + ] } diff --git a/figures/branch-and-history.json b/figures/branch-and-history.json index 9caa6f3..bb8debd 100644 --- a/figures/branch-and-history.json +++ b/figures/branch-and-history.json @@ -80,5 +80,14 @@ "dy": -8.7 } ], - "edges": [] + "edges": [ + { "from": "node_34ac2", "to": "node_98ca9" }, + { "from": "f30ab", "to": "node_34ac2" }, + { "from": "f30ab", "to": "snapshot-c", "arrow": "forward" }, + { "from": "node_34ac2", "to": "snapshot-b", "arrow": "forward" }, + { "from": "node_98ca9", "to": "snapshot-a", "arrow": "forward" }, + { "from": "master", "to": "f30ab", "arrow": "forward", "route": "diagonal" }, + { "from": "v1-0", "to": "f30ab", "arrow": "forward", "route": "diagonal" }, + { "from": "head", "to": "master", "arrow": "forward" } + ] } diff --git a/figures/centralized_workflow.json b/figures/centralized_workflow.json index 1a3a293..a667057 100644 --- a/figures/centralized_workflow.json +++ b/figures/centralized_workflow.json @@ -40,5 +40,9 @@ "dx": -0.8 } ], - "edges": [] + "edges": [ + { "from": "shared", "to": "developer", "arrow": "forward" }, + { "from": "shared", "to": "developer-2", "arrow": "forward", "route": "diagonal" }, + { "from": "shared", "to": "developer-3", "arrow": "forward", "route": "diagonal" } + ] } diff --git a/figures/large-merges-1.json b/figures/large-merges-1.json index 2e98760..2000e62 100644 --- a/figures/large-merges-1.json +++ b/figures/large-merges-1.json @@ -145,5 +145,23 @@ "dx": -11.6 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "master", "to": "c2", "arrow": "forward" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "tv-rebase-stat", "to": "c4", "arrow": "forward" }, + { "from": "c5", "to": "c2", "route": "diagonal" }, + { "from": "c6", "to": "c5" }, + { "from": "jk-clone-checkout", "to": "c6", "arrow": "forward" }, + { "from": "c7", "to": "c2", "route": "diagonal" }, + { "from": "c8", "to": "c7" }, + { "from": "db-push-cleanup", "to": "c8", "arrow": "forward" }, + { "from": "c9", "to": "c2", "route": "diagonal" }, + { "from": "c10", "to": "c9" }, + { "from": "js-notes", "to": "c10", "arrow": "forward" }, + { "from": "c11", "to": "c2", "route": "diagonal" }, + { "from": "c12", "to": "c11" }, + { "from": "ps-blame", "to": "c12", "arrow": "forward" } + ] } diff --git a/figures/large-merges-2.json b/figures/large-merges-2.json index 5bf83aa..0538810 100644 --- a/figures/large-merges-2.json +++ b/figures/large-merges-2.json @@ -223,5 +223,30 @@ "dy": 2.6 } ], - "edges": [] + "edges": [ + { "from": "c2", "to": "c1" }, + { "from": "master", "to": "c2", "arrow": "forward" }, + { "from": "c3", "to": "c2", "route": "diagonal" }, + { "from": "c4", "to": "c3" }, + { "from": "tv-rebase-stat", "to": "c4", "arrow": "forward" }, + { "from": "c5", "to": "c2", "route": "diagonal" }, + { "from": "c6", "to": "c5" }, + { "from": "jk-clone-checkout", "to": "c6", "arrow": "forward" }, + { "from": "c7", "to": "c2", "route": "diagonal" }, + { "from": "c8", "to": "c7" }, + { "from": "db-push-cleanup", "to": "c8", "arrow": "forward" }, + { "from": "c9", "to": "c2", "route": "diagonal" }, + { "from": "c10", "to": "c9" }, + { "from": "js-notes", "to": "c10", "arrow": "forward" }, + { "from": "c11", "to": "c2", "route": "diagonal" }, + { "from": "c12", "to": "c11" }, + { "from": "ps-blame", "to": "c12", "arrow": "forward" }, + { "from": "c16", "to": "c2", "route": "diagonal" }, + { "from": "c17", "to": "c16" }, + { "from": "seen", "to": "c17", "arrow": "forward" }, + { "from": "c13", "to": "c2", "route": "diagonal" }, + { "from": "c14", "to": "c13" }, + { "from": "c15", "to": "c14" }, + { "from": "next", "to": "c15", "arrow": "forward" } + ] } diff --git a/figures/perils-of-rebasing-1.json b/figures/perils-of-rebasing-1.json index fb7f90d..bc43880 100644 --- a/figures/perils-of-rebasing-1.json +++ b/figures/perils-of-rebasing-1.json @@ -62,5 +62,11 @@ "dy": 46.5 } ], - "edges": [] + "edges": [ + { "from": "master", "to": "c1", "arrow": "forward" }, + { "from": "c2", "to": "c1-2", "route": "diagonal" }, + { "from": "c3", "to": "c2" }, + { "from": "master-2", "to": "c3", "arrow": "forward" }, + { "from": "teamone-master", "to": "c2", "arrow": "forward" } + ] } diff --git a/figures/perils-of-rebasing-2.json b/figures/perils-of-rebasing-2.json index 23c744d..8e76e92 100644 --- a/figures/perils-of-rebasing-2.json +++ b/figures/perils-of-rebasing-2.json @@ -125,5 +125,18 @@ "dx": 21.6 } ], - "edges": [] + "edges": [ + { "from": "c4", "to": "c1" }, + { "from": "c5", "to": "c4", "route": "diagonal" }, + { "from": "c6", "to": "c4", "route": "diagonal" }, + { "from": "master", "to": "c6", "arrow": "forward" }, + { "from": "c4-2", "to": "c1-2" }, + { "from": "c5-2", "to": "c4-2", "route": "diagonal" }, + { "from": "c6-2", "to": "c4-2", "route": "diagonal" }, + { "from": "teamone-master", "to": "c6-2", "arrow": "forward" }, + { "from": "c2", "to": "c1-2", "route": "diagonal" }, + { "from": "c3", "to": "c2" }, + { "from": "c7", "to": "c3", "route": "diagonal" }, + { "from": "master-2", "to": "c7", "arrow": "forward" } + ] } diff --git a/figures/perils-of-rebasing-3.json b/figures/perils-of-rebasing-3.json index 3c549fd..bd407cf 100644 --- a/figures/perils-of-rebasing-3.json +++ b/figures/perils-of-rebasing-3.json @@ -141,5 +141,20 @@ "dy": 31.9 } ], - "edges": [] + "edges": [ + { "from": "c4-2", "to": "c1" }, + { "from": "c5", "to": "c4-2", "route": "diagonal" }, + { "from": "c6", "to": "c4-2", "route": "diagonal" }, + { "from": "c4", "to": "c5", "route": "diagonal" }, + { "from": "master", "to": "c4", "arrow": "forward" }, + { "from": "c4-4", "to": "c1-2" }, + { "from": "c5-2", "to": "c4-4", "route": "diagonal" }, + { "from": "c6-2", "to": "c4-4", "route": "diagonal" }, + { "from": "c4-3", "to": "c5-2", "route": "diagonal" }, + { "from": "teamone-master", "to": "c4-3", "arrow": "forward" }, + { "from": "c2", "to": "c1-2", "route": "diagonal" }, + { "from": "c3", "to": "c2" }, + { "from": "c7", "to": "c3", "route": "diagonal" }, + { "from": "master-2", "to": "c7", "arrow": "forward" } + ] } diff --git a/figures/perils-of-rebasing-4.json b/figures/perils-of-rebasing-4.json index 6aba725..ce584a4 100644 --- a/figures/perils-of-rebasing-4.json +++ b/figures/perils-of-rebasing-4.json @@ -149,5 +149,21 @@ "dy": 31.51 } ], - "edges": [] + "edges": [ + { "from": "c4-2", "to": "c1" }, + { "from": "c5", "to": "c4-2", "route": "diagonal" }, + { "from": "c6", "to": "c4-2", "route": "diagonal" }, + { "from": "c4", "to": "c5", "route": "diagonal" }, + { "from": "master", "to": "c4", "arrow": "forward" }, + { "from": "c4-4", "to": "c1-2" }, + { "from": "c5-2", "to": "c4-4", "route": "diagonal" }, + { "from": "c6-2", "to": "c4-4", "route": "diagonal" }, + { "from": "c4-3", "to": "c5-2", "route": "diagonal" }, + { "from": "teamone-master", "to": "c4-3", "arrow": "forward" }, + { "from": "c2", "to": "c1-2", "route": "diagonal" }, + { "from": "c3", "to": "c2" }, + { "from": "c7", "to": "c3", "route": "diagonal" }, + { "from": "c8", "to": "c7" }, + { "from": "master-2", "to": "c8", "arrow": "forward" } + ] } diff --git a/figures/perils-of-rebasing-5.json b/figures/perils-of-rebasing-5.json index 8ec3569..5b12ee7 100644 --- a/figures/perils-of-rebasing-5.json +++ b/figures/perils-of-rebasing-5.json @@ -112,5 +112,17 @@ "dy": 29.39 } ], - "edges": [] + "edges": [ + { "from": "c4-2", "to": "c1" }, + { "from": "c5", "to": "c4-2", "route": "diagonal" }, + { "from": "c6", "to": "c4-2", "route": "diagonal" }, + { "from": "c4", "to": "c5", "route": "diagonal" }, + { "from": "master", "to": "c4", "arrow": "forward" }, + { "from": "c5-2", "to": "c1-2" }, + { "from": "c4-3", "to": "c5-2", "route": "diagonal" }, + { "from": "teamone-master", "to": "c4-3", "arrow": "forward" }, + { "from": "c2", "to": "c4-3", "route": "diagonal" }, + { "from": "c3", "to": "c2" }, + { "from": "master-2", "to": "c3", "arrow": "forward" } + ] } diff --git a/figures/reset-checkout.json b/figures/reset-checkout.json index f1e985c..f713046 100644 --- a/figures/reset-checkout.json +++ b/figures/reset-checkout.json @@ -136,5 +136,18 @@ "dy": -1.21 } ], - "edges": [] + "edges": [ + { "from": "commit-b", "to": "commit-a" }, + { "from": "master", "to": "commit-a", "arrow": "forward" }, + { "from": "develop", "to": "commit-b", "arrow": "forward" }, + { "from": "head", "to": "develop", "arrow": "forward" }, + { "from": "commit-b-2", "to": "commit-a-2" }, + { "from": "master-2", "to": "commit-a-2", "arrow": "forward" }, + { "from": "develop-2", "to": "commit-b-2", "arrow": "forward" }, + { "from": "head-2", "to": "commit-b-2", "arrow": "forward" }, + { "from": "commit-b-3", "to": "commit-a-3" }, + { "from": "master-3", "to": "commit-a-3", "arrow": "forward" }, + { "from": "develop-3", "to": "commit-b-3", "arrow": "forward" }, + { "from": "head-3", "to": "master-3", "arrow": "forward" } + ] } diff --git a/figures/reset-ex1.json b/figures/reset-ex1.json index 98bedac..b13ef84 100644 --- a/figures/reset-ex1.json +++ b/figures/reset-ex1.json @@ -60,5 +60,7 @@ "dy": -41.6 } ], - "edges": [] + "edges": [ + { "from": "head-2", "to": "master", "arrow": "forward" } + ] } diff --git a/figures/reset-ex2.json b/figures/reset-ex2.json index 80be3a1..8235153 100644 --- a/figures/reset-ex2.json +++ b/figures/reset-ex2.json @@ -69,5 +69,7 @@ "dy": -41.3 } ], - "edges": [] + "edges": [ + { "from": "head-2", "to": "master", "arrow": "forward" } + ] } diff --git a/figures/reset-ex3.json b/figures/reset-ex3.json index 8011eaf..b767119 100644 --- a/figures/reset-ex3.json +++ b/figures/reset-ex3.json @@ -87,5 +87,8 @@ "dy": -17.35 } ], - "edges": [] + "edges": [ + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "head-2", "to": "eb43bf8", "arrow": "forward" } + ] } diff --git a/figures/reset-ex4.json b/figures/reset-ex4.json index 244529f..2fee3a7 100644 --- a/figures/reset-ex4.json +++ b/figures/reset-ex4.json @@ -87,5 +87,8 @@ "dy": -25.2 } ], - "edges": [] + "edges": [ + { "from": "head-2", "to": "master", "arrow": "forward" }, + { "from": "head", "to": "eb43bf8", "arrow": "forward" } + ] } diff --git a/figures/reset-ex5.json b/figures/reset-ex5.json index 9d54685..f543046 100644 --- a/figures/reset-ex5.json +++ b/figures/reset-ex5.json @@ -87,5 +87,8 @@ "dy": -25.2 } ], - "edges": [] + "edges": [ + { "from": "head-2", "to": "master", "arrow": "forward" }, + { "from": "head", "to": "eb43bf8", "arrow": "forward" } + ] } diff --git a/figures/reset-ex6.json b/figures/reset-ex6.json index 1a23aa9..09920e6 100644 --- a/figures/reset-ex6.json +++ b/figures/reset-ex6.json @@ -100,5 +100,8 @@ "dy": -25.0 } ], - "edges": [] + "edges": [ + { "from": "head-2", "to": "master", "arrow": "forward" }, + { "from": "file-txt-4", "to": "file-txt-3" } + ] } diff --git a/figures/reset-hard.json b/figures/reset-hard.json index e298807..3747905 100644 --- a/figures/reset-hard.json +++ b/figures/reset-hard.json @@ -99,5 +99,9 @@ "dy": -19.29 } ], - "edges": [] + "edges": [ + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "file-txt-4", "to": "file-txt-3" }, + { "from": "master", "to": "node_9e5e6a4", "arrow": "forward" } + ] } diff --git a/figures/reset-mixed.json b/figures/reset-mixed.json index 16b1bca..3ad763e 100644 --- a/figures/reset-mixed.json +++ b/figures/reset-mixed.json @@ -89,5 +89,9 @@ "dy": -19.29 } ], - "edges": [] + "edges": [ + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "file-txt-3", "to": "file-txt-2" }, + { "from": "master", "to": "node_9e5e6a4", "arrow": "forward" } + ] } diff --git a/figures/reset-path1.json b/figures/reset-path1.json index 9b8b8db..a4378cb 100644 --- a/figures/reset-path1.json +++ b/figures/reset-path1.json @@ -87,5 +87,8 @@ "dy": -25.2 } ], - "edges": [] + "edges": [ + { "from": "head-2", "to": "master", "arrow": "forward" }, + { "from": "head", "to": "eb43bf8", "arrow": "forward" } + ] } diff --git a/figures/reset-path2.json b/figures/reset-path2.json index 7192b90..fd88ff4 100644 --- a/figures/reset-path2.json +++ b/figures/reset-path2.json @@ -77,5 +77,8 @@ "dy": -25.3 } ], - "edges": [] + "edges": [ + { "from": "head-2", "to": "master", "arrow": "forward" }, + { "from": "head", "to": "eb43bf8", "arrow": "forward" } + ] } diff --git a/figures/reset-path3.json b/figures/reset-path3.json index 716137d..1c9d804 100644 --- a/figures/reset-path3.json +++ b/figures/reset-path3.json @@ -87,5 +87,8 @@ "dy": 14.01 } ], - "edges": [] + "edges": [ + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "file-txt-2", "to": "file-txt" } + ] } diff --git a/figures/reset-soft.json b/figures/reset-soft.json index 10715f8..78c9a62 100644 --- a/figures/reset-soft.json +++ b/figures/reset-soft.json @@ -81,5 +81,9 @@ "dy": 14.01 } ], - "edges": [] + "edges": [ + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "file-txt-2", "to": "file-txt" }, + { "from": "master", "to": "node_9e5e6a4", "arrow": "forward" } + ] } diff --git a/figures/reset-squash-r1.json b/figures/reset-squash-r1.json index fd61248..c1f788c 100644 --- a/figures/reset-squash-r1.json +++ b/figures/reset-squash-r1.json @@ -134,5 +134,8 @@ "row": 6 } ], - "edges": [] + "edges": [ + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "file-a-txt-v1", "to": "file-a-txt-v3" } + ] } diff --git a/figures/reset-squash-r2.json b/figures/reset-squash-r2.json index fe59000..ef366d1 100644 --- a/figures/reset-squash-r2.json +++ b/figures/reset-squash-r2.json @@ -149,5 +149,9 @@ "dy": -4.74 } ], - "edges": [] + "edges": [ + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "file-a-txt-v1", "to": "file-a-txt-v3" }, + { "from": "master", "to": "node_38eb946", "arrow": "forward" } + ] } diff --git a/figures/reset-squash-r3.json b/figures/reset-squash-r3.json index 40dfc24..f35f026 100644 --- a/figures/reset-squash-r3.json +++ b/figures/reset-squash-r3.json @@ -148,5 +148,9 @@ "dy": -5.53 } ], - "edges": [] + "edges": [ + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "master", "to": "node_68aef35-2", "arrow": "forward" }, + { "from": "file-a-txt-v1", "to": "node_68aef35", "route": "diagonal" } + ] } diff --git a/figures/reset-start.json b/figures/reset-start.json index a91260b..14f85a0 100644 --- a/figures/reset-start.json +++ b/figures/reset-start.json @@ -73,5 +73,8 @@ "row": 3 } ], - "edges": [] + "edges": [ + { "from": "head", "to": "master", "arrow": "forward" }, + { "from": "file-txt-2", "to": "file-txt" } + ] } diff --git a/figures/reset-workflow.json b/figures/reset-workflow.json index 2cda03e..2254fa6 100644 --- a/figures/reset-workflow.json +++ b/figures/reset-workflow.json @@ -32,5 +32,7 @@ "y": 4.0 } ], - "edges": [] + "edges": [ + { "from": "index", "to": "head", "arrow": "forward" } + ] } diff --git a/figures/topic-branches-1.json b/figures/topic-branches-1.json index aebb8ed..29b01a9 100644 --- a/figures/topic-branches-1.json +++ b/figures/topic-branches-1.json @@ -148,5 +148,23 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c3", "to": "c1" }, + { "from": "c9", "to": "c3" }, + { "from": "c10", "to": "c9" }, + { "from": "c2", "to": "c1", "route": "diagonal" }, + { "from": "c4", "to": "c2" }, + { "from": "c5", "to": "c4" }, + { "from": "c6", "to": "c5" }, + { "from": "c7", "to": "c9", "route": "diagonal" }, + { "from": "c8", "to": "c7" }, + { "from": "c11", "to": "c8" }, + { "from": "c12", "to": "c10", "route": "diagonal" }, + { "from": "c13", "to": "c12" }, + { "from": "master", "to": "c10", "arrow": "forward" }, + { "from": "iss91", "to": "c6", "arrow": "forward" }, + { "from": "iss91v2", "to": "c11", "arrow": "forward" }, + { "from": "dumbidea", "to": "c13", "arrow": "forward" } + ] } diff --git a/figures/topic-branches-2.json b/figures/topic-branches-2.json index 720f3f0..9191f8f 100644 --- a/figures/topic-branches-2.json +++ b/figures/topic-branches-2.json @@ -147,5 +147,21 @@ "dy": -7.42 } ], - "edges": [] + "edges": [ + { "from": "c1", "to": "c0" }, + { "from": "c3", "to": "c1" }, + { "from": "c9", "to": "c3" }, + { "from": "c10", "to": "c9" }, + { "from": "c12", "to": "c10" }, + { "from": "c13", "to": "c12" }, + { "from": "c14", "to": "c13" }, + { "from": "c2", "to": "c1", "route": "diagonal" }, + { "from": "c4", "to": "c2" }, + { "from": "c7", "to": "c4" }, + { "from": "c8", "to": "c7" }, + { "from": "c11", "to": "c8" }, + { "from": "c14", "to": "c11", "route": "diagonal" }, + { "from": "master", "to": "c14", "arrow": "forward" }, + { "from": "iss91v2", "to": "c11", "arrow": "forward" } + ] } diff --git a/images/advance-master.svg b/images/advance-master.svg index 4fede8f..8a4b9d2 100644 --- a/images/advance-master.svg +++ b/images/advance-master.svg @@ -1,61 +1,43 @@ - - - - - image/svg+xml - - images/advance-master - - - - images/advance-master - Created with Sketch. - - - - - - - - - - f30ab - - - - 34ac2 - - - - 98ca9 - - - - 87ab2 - - - - c2b9e - - - - - - - testing - - - - - - - master - - - - - HEAD - - + + advance master + + + + + + + + + + f30ab + + + + 34ac2 + + + + 98ca9 + + + + 87ab2 + + + + c2b9e + + + + testing + + + + master + + + + HEAD + diff --git a/images/advance-testing.svg b/images/advance-testing.svg index 2a061b1..c4e75f6 100644 --- a/images/advance-testing.svg +++ b/images/advance-testing.svg @@ -1,52 +1,38 @@ - - - - - image/svg+xml - - images/advance-testing - - - - images/advance-testing - Created with Sketch. - - - - - - - - - master - - - - - f30ab + + advance testing + + + + + + + + + master - - - 87ab2 + + + f30ab - - - 34ac2 + + + 87ab2 - - - 98ca9 + + + 34ac2 + + + + 98ca9 + + + + testing + + + + HEAD - - - - - testing - - - - - HEAD - diff --git a/images/branch-and-history.svg b/images/branch-and-history.svg index 2996565..d1eef56 100644 --- a/images/branch-and-history.svg +++ b/images/branch-and-history.svg @@ -1,61 +1,48 @@ - - - - - image/svg+xml - - images/branch-and-history - - - - - images/branch-and-history - Created with Sketch. - - - - - Snapshot C - - - - - Snapshot B - - - - - Snapshot A - - - - f30ab - - - - - - - 34ac2 - - - - 98ca9 - - - - - - master - - - - HEAD - - - - v1.0 - - + + branch and history + + + + + + + + + + + Snapshot C + + + + Snapshot B + + + + Snapshot A + + + + f30ab + + + + 34ac2 + + + + 98ca9 + + + + master + + + + HEAD + + + + v1.0 + diff --git a/images/centralized_workflow.svg b/images/centralized_workflow.svg index b5583f1..d4a4b32 100644 --- a/images/centralized_workflow.svg +++ b/images/centralized_workflow.svg @@ -1,39 +1,23 @@ - - - - - image/svg+xml - - images/centralized - - - - images/centralized - Created with Sketch. - - - - - developer - - - - developer - - - - developer - + + centralized_workflow + + + + + + developer - - - - - - sharedrepository - + + + developer + + + + developer + + + + sharedrepository - - diff --git a/images/large-merges-1.svg b/images/large-merges-1.svg index 534f874..ddd7acd 100644 --- a/images/large-merges-1.svg +++ b/images/large-merges-1.svg @@ -1,126 +1,93 @@ - - - - - image/svg+xml - - images/large-merges-1 - - - - - images/large-merges-1 - Created with Sketch. - - - - - master - - - - - - tv/rebase-stat - - - - - - - jk/clone-checkout - - - - - - - db/push-cleanup - - - - - - - js/notes - - - - - - - ps/blame - - - - - C1 - - - - - C2 - - - - - - - - - C3 - - - - C5 - - - - C7 - - - - C9 - - - - C11 - - - - - - C4 - - - - - - - C6 - - - - - - - C8 - - - - - - - C10 - - - - - - - C12 - - - + + large merges 1 + + + + + + + + + + + + + + + + + + + + master + + + + tv/rebase-stat + + + + jk/clone-checkout + + + + db/push-cleanup + + + + js/notes + + + + ps/blame + + + + C1 + + + + C2 + + + + C3 + + + + C5 + + + + C7 + + + + C9 + + + + C11 + + + + C4 + + + + C6 + + + + C8 + + + + C10 + + + + C12 + diff --git a/images/large-merges-2.svg b/images/large-merges-2.svg index 30288ec..da6ea28 100644 --- a/images/large-merges-2.svg +++ b/images/large-merges-2.svg @@ -1,172 +1,128 @@ - - - - - image/svg+xml - - images/large-merges-2 - - - - - images/large-merges-2 - Created with Sketch. - - - - - - master - - - - - - - tv/rebase-stat - - - - - - - jk/clone-checkout - - - - - - - db/push-cleanup - - - - - - - js/notes - - - - - - - seen - - - - - - - next - - - - - - - ps/blame - - - - - C1 - - - - - C2 - - - - - - - - - - - - C3 - - - - C5 - - - - C7 - - - - C9 - - - - C11 - - - - - - C4 - - - - - - C16 - - - - - C17 - - - - - C13 - - - - - C14 - - - - - C15 - - - - - - C6 - - - - - - - C8 - - - - - - - C10 - - - - - - - C12 - - - - - + + large merges 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + master + + + + tv/rebase-stat + + + + jk/clone-checkout + + + + db/push-cleanup + + + + js/notes + + + + seen + + + + next + + + + ps/blame + + + + C1 + + + + C2 + + + + C3 + + + + C5 + + + + C7 + + + + C9 + + + + C11 + + + + C4 + + + + C16 + + + + C17 + + + + C13 + + + + C14 + + + + C15 + + + + C6 + + + + C8 + + + + C10 + + + + C12 + diff --git a/images/perils-of-rebasing-1.svg b/images/perils-of-rebasing-1.svg index ee81330..60cabd1 100644 --- a/images/perils-of-rebasing-1.svg +++ b/images/perils-of-rebasing-1.svg @@ -1,60 +1,37 @@ - - - - - image/svg+xml - - images/perils-of-rebasing-1 - - - - - images/perils-of-rebasing-1 - Created with Sketch. - - - - - - C1 + + perils of rebasing 1 + + + + + + + + C1 - - - - - master - + + + master - - - C1 + + + C1 - - - - C2 + + + C2 - - - - C3 + + + C3 - - - - - master - + + + master - - - - - teamone/master - + + + teamone/master - My Computer - git.team1.ourcompany.com - diff --git a/images/perils-of-rebasing-2.svg b/images/perils-of-rebasing-2.svg index 210dd49..1df0772 100644 --- a/images/perils-of-rebasing-2.svg +++ b/images/perils-of-rebasing-2.svg @@ -1,106 +1,72 @@ - - - - - image/svg+xml - - images/perils-of-rebasing-2 - - - - - images/perils-of-rebasing-2 - Created with Sketch. - - - - - - - C1 - - - - master - - - - C4 - - - - - - C5 - - - - - C6 - + + perils of rebasing 2 + + + + + + + + + + + + + + + C1 - My Computer - git.team1.ourcompany.com - - - - C1 - - - - - C3 - - - - - - - C7 - - - - - - - C4 - - - - - - - - C5 - - - - - - - C6 - - - - - - - master - - - - - teamone/master - - - - - - - C2 - - + + + master + + + + C4 + + + + C5 + + + + C6 + + + + C1 + + + + C3 + + + + C7 + + + + C4 + + + + C5 + + + + C6 + + + + master + + + + teamone/master + + + + C2 - diff --git a/images/perils-of-rebasing-3.svg b/images/perils-of-rebasing-3.svg index 1ad6f7d..2ead058 100644 --- a/images/perils-of-rebasing-3.svg +++ b/images/perils-of-rebasing-3.svg @@ -1,138 +1,82 @@ - - - - - image/svg+xml - - images/perils-of-rebasing-3 - - - - - images/perils-of-rebasing-3 - Created with Sketch. - - - - - - - - C1 - - - - - - master - - - - - - C4' - - - - - - C5 - - - - - - - - C4 - - - - - - - - C6 - - - - - - - - C1 - - - - - - C2 - - - - - - - C3 - - - - - - - - C7 - - - - - - - C4' - - - - - - - C4 - - - - - - - C5 - - - - - - - - - C6 - - - - - - - - master - - - - - - - teamone/master - - - - My Computer - git.team1.ourcompany.com - - + + perils of rebasing 3 + + + + + + + + + + + + + + + + + C1 + + + + master + + + + C4' + + + + C5 + + + + C4 + + + + C6 + + + + C1 + + + + C2 + + + + C3 + + + + C7 + + + + C4' + + + + C4 + + + + C5 + + + + C6 + + + + master + + + + teamone/master + diff --git a/images/perils-of-rebasing-4.svg b/images/perils-of-rebasing-4.svg index f4d24b7..2318bee 100644 --- a/images/perils-of-rebasing-4.svg +++ b/images/perils-of-rebasing-4.svg @@ -1,144 +1,87 @@ - - - - - image/svg+xml - - images/perils-of-rebasing-4 - - - - - images/perils-of-rebasing-4 - Created with Sketch. - - - - - - - C1 - - - - - master - - - - - - C4' - - - - - - - - C5 - - - - - - - C4 - - - - - - - - C6 - - - - - - - - C1 - - - - - - C2 - - - - - - - C3 - - - - - - - - C7 - - - - - - - - C8 - - - - - - - C4' - - - - - - - C4 - - - - - - - - C5 - - - - - - - C6 - - - - - - - master - - - - - - - - - teamone/master - - - - My Computer - git.team1.ourcompany.com - + + perils of rebasing 4 + + + + + + + + + + + + + + + + + + C1 + + + + master + + + + C4' + + + + C5 + + + + C4 + + + + C6 + + + + C1 + + + + C2 + + + + C3 + + + + C7 + + + + C8 + + + + C4' + + + + C4 + + + + C5 + + + + C6 + + + + master + + + + teamone/master + diff --git a/images/perils-of-rebasing-5.svg b/images/perils-of-rebasing-5.svg index fcdf683..0f7af27 100644 --- a/images/perils-of-rebasing-5.svg +++ b/images/perils-of-rebasing-5.svg @@ -1,111 +1,67 @@ - - - - - image/svg+xml - - images/perils-of-rebasing-5 - - - - - images/perils-of-rebasing-5 - Created with Sketch. - - - - - - C1 + + perils of rebasing 5 + + + + + + + + + + + + + + C1 - - - - - master - + + + master - - - - - C4' - + + + C4' - - - - - C5 - + + + C5 - - - - - - C4 - - - - - - - - C6 - - + + + C4 - - - - - - C1 + + + C6 - - - - - C4' - + + + C1 - - - - - - - C2' - + + + C4' - - - - - C3' - + + + C2' - - - - - C5 - + + + C3' - - - - - master - + + + C5 - - - teamone/master + + + master + + + + teamone/master - - My Computer - git.team1.ourcompany.com diff --git a/images/reset-checkout.svg b/images/reset-checkout.svg index c7f619e..5ade9b8 100644 --- a/images/reset-checkout.svg +++ b/images/reset-checkout.svg @@ -1,118 +1,76 @@ - - - - - image/svg+xml - - images/reset-checkout - - - - - images/reset-checkout - Created with Sketch. - - before command - - - commit A - - - - - commit B - - - - - master - - - - - - - develop - - - - - - - HEAD - - + + reset checkout + + + + + + + + + + + + + + + commit A - - - - commit A - - - - - - commit B - - - - - - - HEAD - - - - - - - master - - - - - - - develop - - + + + commit B - after reset - - - after checkout - - - - commit A - - - - - commit B - - - - - - master - - - - - - - develop - - - - - - - HEAD - - + + + master + + + + develop + + + + HEAD + + + + commit A + + + + commit B + + + + HEAD + + + + master + + + + develop + + + + commit A + + + + commit B + + + + master + + + + develop + + + + HEAD - diff --git a/images/reset-ex1.svg b/images/reset-ex1.svg index 768227f..246fe98 100644 --- a/images/reset-ex1.svg +++ b/images/reset-ex1.svg @@ -1,60 +1,29 @@ - - - - - image/svg+xml - - images/reset-ex1 - - - - - images/reset-ex1 - Created with Sketch. - - - - - - Index - + + reset ex1 + + + + Index - - - - - - HEAD - - + + + HEAD - ? - - Git Repository - - - - - - file.txtv1 + + + file.txtv1 - - - - - WorkingDirectory + + + WorkingDirectory - - - - - - HEAD + + + HEAD - - - master + + + master - diff --git a/images/reset-ex2.svg b/images/reset-ex2.svg index 9ba054f..5f885e2 100644 --- a/images/reset-ex2.svg +++ b/images/reset-ex2.svg @@ -1,69 +1,33 @@ - - - - - image/svg+xml - - images/reset-ex2 - - - - - images/reset-ex2 - Created with Sketch. - - - - - - - HEAD - - + + reset ex2 + + + + HEAD - - git add - - - - - file.txtv1 - - - - - - WorkingDirectory - + + + file.txtv1 - - - - - - Index - - - - - file.txtv1 - + + + WorkingDirectory - ? - Git Repository - - - - - - HEAD - - - - master - - + + + Index + + + + file.txtv1 + + + + HEAD + + + + master - diff --git a/images/reset-ex3.svg b/images/reset-ex3.svg index 44c643a..09bd0f0 100644 --- a/images/reset-ex3.svg +++ b/images/reset-ex3.svg @@ -1,87 +1,42 @@ - - - - - image/svg+xml - - images/reset-ex3 - - - - - images/reset-ex3 - Created with Sketch. - - - - - - - - HEAD - - - - master - - - - Git Repository - git commit - - - - - file.txtv1 - - - - - - WorkingDirectory - - - - - - - - - HEAD - - - - eb43bf8 - - - file.txtv1 - - - - - - - - Index - - - - - file.txtv1 - - - - - - eb43bf8 - - - file.txtv1 - - - - + + reset ex3 + + + + + HEAD + + + + master + + + + file.txtv1 + + + + WorkingDirectory + + + + HEAD + + + + eb43bf8 + + + + Index + + + + file.txtv1 + + + + file.txtv1 - diff --git a/images/reset-ex4.svg b/images/reset-ex4.svg index 6fa4a42..27ccdc8 100644 --- a/images/reset-ex4.svg +++ b/images/reset-ex4.svg @@ -1,75 +1,42 @@ - - - - - image/svg+xml - - images/reset-ex4 - - - - - images/reset-ex4 - Created with Sketch. - - - - - - - Index - + + reset ex4 + + + + + Index + + + + HEAD + + + + file.txtv2 + + + + WorkingDirectory + + + + file.txtv1 + + + + eb43bf8 + + + + file.txtv1 + + + + HEAD + + + + master - - - - - - HEAD - - - - - Git Repository - - - file.txtv2 - - - - - - - - WorkingDirectory - - - - - file.txtv1 - - edit file - eb43bf8 - eb43bf8 - - - file.txtv1 - - - - file.txtv1 - - - - - - - HEAD - - - - master - - diff --git a/images/reset-ex5.svg b/images/reset-ex5.svg index fc7067d..97655a1 100644 --- a/images/reset-ex5.svg +++ b/images/reset-ex5.svg @@ -1,75 +1,42 @@ - - - - - image/svg+xml - - images/reset-ex5 - - - - - images/reset-ex5 - Created with Sketch. - - - - - - - Index - + + reset ex5 + + + + + Index + + + + HEAD + + + + file.txtv2 + + + + WorkingDirectory + + + + eb43bf8 + + + + file.txtv1 + + + + file.txtv2 + + + + HEAD + + + + master - - - - - - HEAD - - - - - Git Repository - - - file.txtv2 - - - - - - - - WorkingDirectory - - - git add - eb43bf8 - eb43bf8 - - - file.txtv1 - - - - file.txtv1 - - - - file.txtv2 - - - - - - - HEAD - - - - master - - diff --git a/images/reset-ex6.svg b/images/reset-ex6.svg index 4038dc1..f9ec079 100644 --- a/images/reset-ex6.svg +++ b/images/reset-ex6.svg @@ -1,100 +1,46 @@ - - - - - image/svg+xml - - images/reset-ex6 - - - - - images/reset-ex6 - Created with Sketch. - - - Git Repository - git commit - - - - - file.txtv2 - - - - - - - - WorkingDirectory - - - - - - - - - Index - - - - - file.txtv2 - - - - 9e5e6a4 - - - - - - HEAD - - - - - - file.txtv2 - - + + reset ex6 + + + + + file.txtv2 - - - - - - eb43bf8 - - - - file.txtv1 - - - - - - 9e5e6a4 - - - - file.txtv2 - - + + + WorkingDirectory - - - - - - HEAD + + + Index - - - master + + + file.txtv2 + + + + HEAD + + + + 9e5e6a4 + + + + file.txtv1 + + + + file.txtv2 + + + + HEAD + + + + master - diff --git a/images/reset-hard.svg b/images/reset-hard.svg index f5fe427..bad1ff4 100644 --- a/images/reset-hard.svg +++ b/images/reset-hard.svg @@ -1,119 +1,47 @@ - - - - - image/svg+xml - - images/reset-hard - - - - - images/reset-hard - Created with Sketch. - - - - - - - HEAD - - - - master - - - - git reset --hard HEAD~ - - - 1 - - - - - file.txtv2 - - - - - - - - WorkingDirectory - - - - - - - - - Index - - - - - file.txtv2 - - - - 9e5e6a4 - - - - - - HEAD - - - - - - file.txtv2 - - - - 2 - - - - 3 - - - - - - - - eb43bf8 - - - - file.txtv1 - - - - - - 9e5e6a4 - - - - file.txtv2 - - - - - 38eb946 - - - file.txtv3 - - - Git Repository + + reset hard + + + + + + HEAD + + + + master + + + + file.txtv2 + + + + WorkingDirectory + + + + Index + + + + file.txtv2 + + + + HEAD + + + + 9e5e6a4 + + + + file.txtv1 + + + + file.txtv2 - diff --git a/images/reset-mixed.svg b/images/reset-mixed.svg index c65c0e1..8351ada 100644 --- a/images/reset-mixed.svg +++ b/images/reset-mixed.svg @@ -1,113 +1,43 @@ - - - - - image/svg+xml - - images/reset-mixed - - - - - images/reset-mixed - Created with Sketch. - - git reset [--mixed] HEAD~ - - - - - HEAD - - - - master - + + reset mixed + + + + + + HEAD + + + + master + + + + WorkingDirectory + + + + Index + + + + file.txtv2 + + + + HEAD + + + + 9e5e6a4 + + + + file.txtv1 + + + + file.txtv2 - - - - 1 - - - - - file.txtv3 - - - - - - - - WorkingDirectory - - - - - - - - - Index - - - - - file.txtv2 - - - - 9e5e6a4 - - - - - - HEAD - - - - - - file.txtv2 - - - - 2 - - - - - - - - eb43bf8 - - - - file.txtv1 - - - - - - 9e5e6a4 - - - - file.txtv2 - - - - - 38eb946 - - - file.txtv3 - - - Git Repository - diff --git a/images/reset-path1.svg b/images/reset-path1.svg index f4f774b..3726907 100644 --- a/images/reset-path1.svg +++ b/images/reset-path1.svg @@ -1,76 +1,42 @@ - - - - - image/svg+xml - - images/reset-path1 - - - - - images/reset-path1 - Created with Sketch. - - git reset file.txt - - - - - - Index - + + reset path1 + + + + + Index + + + + HEAD + + + + file.txtv2 + + + + WorkingDirectory + + + + file.txtv1 + + + + eb43bf8 + + + + file.txtv1 + + + + HEAD + + + + master - - - - - - HEAD - - - - - Git Repository - - - file.txtv2 - - - - - - - - WorkingDirectory - - - - - file.txtv1 - - eb43bf8 - eb43bf8 - - - file.txtv1 - - - - file.txtv1 - - - - - - HEAD - - - - master - - - - diff --git a/images/reset-path2.svg b/images/reset-path2.svg index 575e0d6..f2c3260 100644 --- a/images/reset-path2.svg +++ b/images/reset-path2.svg @@ -1,76 +1,38 @@ - - - - - image/svg+xml - - images/reset-path2 - - - - - images/reset-path2 - Created with Sketch. - - git add file.txt - - - - - - Index - + + reset path2 + + + + + Index + + + + HEAD + + + + file.txtv2 + + + + WorkingDirectory + + + + eb43bf8 + + + + file.txtv1 + + + + HEAD + + + + master - - - - - - HEAD - - - - - Git Repository - - - file.txtv2 - - - - - - - - WorkingDirectory - - - - - file.txtv2 - - eb43bf8 - eb43bf8 - - - file.txtv1 - - - - file.txtv1 - - - - - - HEAD - - - - master - - - - diff --git a/images/reset-path3.svg b/images/reset-path3.svg index 9565e24..1fc2a92 100644 --- a/images/reset-path3.svg +++ b/images/reset-path3.svg @@ -1,107 +1,38 @@ - - - - - image/svg+xml - - images/reset-path3 - - - - - images/reset-path3 - Created with Sketch. - - - git reset eb43 -- file.txt - - - - - HEAD - - - - master - + + reset path3 + + + + + HEAD - - - - - - eb43bf8 - - - - file.txtv1 - + + + master - - - - 9e5e6a4 - - - - file.txtv2 - + + + file.txtv1 - - - 38eb946 - - - file.txtv3 - + + + file.txtv2 - Git Repository - - - - - file.txtv3 - - - - - - - - WorkingDirectory - - - - - - - - - Index - - - - - file.txtv1 - - - - 38eb946 - - - - - - HEAD - - - - - - file.txtv3 - - + + + WorkingDirectory + + + + Index + + + + file.txtv1 + + + + HEAD - diff --git a/images/reset-soft.svg b/images/reset-soft.svg index 09fe219..59864e3 100644 --- a/images/reset-soft.svg +++ b/images/reset-soft.svg @@ -1,106 +1,39 @@ - - - - - image/svg+xml - - images/reset-soft - - - - - images/reset-soft - Created with Sketch. - - git reset --soft HEAD~ - - - - - - - - eb43bf8 - - - - file.txtv1 - - - - - 9e5e6a4 - - - - file.txtv2 - - - - 38eb946 - - - file.txtv3 - - + + reset soft + + + + + + file.txtv1 + + + + file.txtv2 + + + + HEAD + + + + master + + + + WorkingDirectory + + + + 9e5e6a4 + + + + HEAD + + + + Index - Git Repository - - - - - - HEAD - - - - master - - - - - - - file.txtv3 - - - - - - - - WorkingDirectory - - - - - 9e5e6a4 - - - file.txtv2 - - - - - - - HEAD - - - - - - - - - - Index - - - - - file.txtv3 - - diff --git a/images/reset-squash-r1.svg b/images/reset-squash-r1.svg index 7aa6bf2..08f33b2 100644 --- a/images/reset-squash-r1.svg +++ b/images/reset-squash-r1.svg @@ -1,132 +1,66 @@ - - - - - image/svg+xml - - images/reset-squash-r1 - - - - - images/reset-squash-r1 - Created with Sketch. - - Git Repository - - - - - - - HEAD + + reset squash r1 + + + + + HEAD - - - master + + + master - - - - - - - file-a.txt v1 - - eb43bf8 + + + file-a.txt v1 - - - 9e5e6a4 - - - file-a.txt v2 - - - - file-b.txt v1 - + + + file-b.txt v1 - - - 38eb946 - - - - file-a.txt v3 - - - - file-b.txt v1 - - + + + file-a.txt v3 - - - - - - - - - - WorkingDirectory - - - - - - file-a.txt v3 - - - - file-b.txt v1 - - + + + file-b.txt v1 - - - - - - Index - - - - - - file-a.txt v3 - - - - file-b.txt v1 - - + + + WorkingDirectory - - 38eb946 - - - - - - - HEAD - - - - - - - - file-a.txt v3 - - - - file-b.txt v1 - - + + + file-a.txt v3 + + + + file-b.txt v1 + + + + Index + + + + file-a.txt v3 + + + + file-b.txt v1 + + + + HEAD + + + + file-a.txt v3 + + + + file-b.txt v1 - diff --git a/images/reset-squash-r2.svg b/images/reset-squash-r2.svg index 4785926..d1d859e 100644 --- a/images/reset-squash-r2.svg +++ b/images/reset-squash-r2.svg @@ -1,139 +1,71 @@ - - - - - image/svg+xml - - images/reset-squash-r2 - - - - - images/reset-squash-r2 - Created with Sketch. - - 38eb946 - - - - file-a.txt v3 - - - - file-b.txt v1 - - - - - git reset --soft HEAD~2 - - - Git Repository - - - - - file-a.txt v1 - - eb43bf8 - - - - - - 9e5e6a4 - - - file-a.txt v2 - - - - file-b.txt v1 - - - - - - - HEAD - - - - master - - - - - 38eb946 - - - - file-a.txt v3 - - - - file-b.txt v1 - - - - - - - - - - - - WorkingDirectory - - - - - - file-a.txt v3 - - - - file-b.txt v1 - - - - - - - - - Index - - - - - - file-a.txt v3 - - - - file-b.txt v1 - - - - - - - - - - HEAD - - - - - - file-a.txt v1 - - eb43bf8 - - - + + reset squash r2 + + + + + + 38eb946 + + + + file-b.txt v1 + + + + file-a.txt v1 + + + + file-b.txt v1 + + + + HEAD + + + + master + + + + file-a.txt v3 + + + + file-b.txt v1 + + + + WorkingDirectory + + + + file-a.txt v3 + + + + file-b.txt v1 + + + + Index + + + + file-a.txt v3 + + + + file-b.txt v1 + + + + HEAD + + + + eb43bf8 + diff --git a/images/reset-squash-r3.svg b/images/reset-squash-r3.svg index 144f095..d50559f 100644 --- a/images/reset-squash-r3.svg +++ b/images/reset-squash-r3.svg @@ -1,147 +1,75 @@ - - - - - image/svg+xml - - images/reset-squash-r3 - - - - - images/reset-squash-r3 - Created with Sketch. - - - git commit - - - - - - - Git Repository - - - - - file-a.txt v1 - - eb43bf8 - - - - 9e5e6a4 - - - file-a.txt v2 - - - - file-b.txt v1 - - - - - - - HEAD - - - - master - - - - - - - - - - WorkingDirectory - - - - - - file-a.txt v3 - - - - file-b.txt v1 - - - - - - - - - Index - - - - - - file-a.txt v3 - - - - file-b.txt v1 - - - - - 68aef35 - - - - file-a.txt v3 - - - - file-b.txt v1 - - - - - - - - HEAD - - - - - - - 68aef35 - - - - file-a.txt v3 - - - - file-b.txt v1 - - - - - - 38eb946 - - - - file-a.txt v3 - - - - file-b.txt v1 - - - - + + reset squash r3 + + + + + + file-a.txt v1 + + + + file-b.txt v1 + + + + HEAD + + + + master + + + + WorkingDirectory + + + + file-a.txt v3 + + + + file-b.txt v1 + + + + Index + + + + file-a.txt v3 + + + + file-b.txt v1 + + + + 68aef35 + + + + file-b.txt v1 + + + + HEAD + + + + 68aef35 + + + + file-b.txt v1 + + + + 68aef35 + + + + file-b.txt v1 + diff --git a/images/reset-start.svg b/images/reset-start.svg index 3804814..bab7a58 100644 --- a/images/reset-start.svg +++ b/images/reset-start.svg @@ -1,100 +1,34 @@ - - - - - image/svg+xml - - images/reset-start - - - - - images/reset-start - Created with Sketch. - - - - - - - eb43bf8 - - - file.txtv1 - + + reset start + + + + + file.txtv1 - - - 9e5e6a4 - - - file.txtv2 - + + + file.txtv2 - - - 38eb946 - - - file.txtv3 - + + + HEAD - Git Repository - - - - - HEAD - - - - master - + + + master - - - - file.txtv3 - - - - - - - - WorkingDirectory - - + + + WorkingDirectory - - - - - - Index - - - - - file.txtv3 - + + + Index - - 38eb946 - - - - - - HEAD - - - - - - file.txtv3 - + + + HEAD - diff --git a/images/reset-workflow.svg b/images/reset-workflow.svg index 35be798..26aae61 100644 --- a/images/reset-workflow.svg +++ b/images/reset-workflow.svg @@ -1,48 +1,17 @@ - - - - - image/svg+xml - - images/reset-workflow - - - - - images/reset-workflow - Created with Sketch. - - - - - - - - - - Index - - - - HEAD - - - - WorkingDirectory - - - - Checkout the project - - - - Commit - - - - Stage Files - + + reset workflow + + + + Index + + + + HEAD + + + + WorkingDirectory - diff --git a/images/topic-branches-1.svg b/images/topic-branches-1.svg index f181fbf..873cb9b 100644 --- a/images/topic-branches-1.svg +++ b/images/topic-branches-1.svg @@ -1,102 +1,93 @@ - - - - - image/svg+xml - - images/topic-branches-1 - - - - - images/topic-branches-1 - Created with Sketch. - - - - C0 - - - - - C1 - - - - - C3 - - - - - C9 - - - - - C10 - - - - - C2 - - - - - C4 - - - - - C5 - - - - - C6 - - - - - C12 - - - - - C13 - - - - - C7 - - - - - C8 - - - - - C11 - - - - master - - - - iss91 - - - - iss91v2 - - - - dumbidea - - + + topic branches 1 + + + + + + + + + + + + + + + + + + + + C0 + + + + C1 + + + + C3 + + + + C9 + + + + C10 + + + + C2 + + + + C4 + + + + C5 + + + + C6 + + + + C12 + + + + C13 + + + + C7 + + + + C8 + + + + C11 + + + + master + + + + iss91 + + + + iss91v2 + + + + dumbidea + diff --git a/images/topic-branches-2.svg b/images/topic-branches-2.svg index a17db5e..e4e5f06 100644 --- a/images/topic-branches-2.svg +++ b/images/topic-branches-2.svg @@ -1,118 +1,83 @@ - - - - - image/svg+xml - - images/topic-branches-2 - - - - - images/topic-branches-2 - Created with Sketch. - - - - C0 - - - - - - C1 - - - - - - - C3 - - - - - - - C9 - - - - - - - C10 - - - - - - - C2 - - - - - - - C4 - - - - - - - C13 - - - - - - - - C14 - - - - - - - C12 - - - - - master - - - - - - C7 - - - - - - - C8 - - - - - - - C11 - - - - - iss91v2 - - - - dumbidea - - + + topic branches 2 + + + + + + + + + + + + + + + + + + C0 + + + + C1 + + + + C3 + + + + C9 + + + + C10 + + + + C2 + + + + C4 + + + + C13 + + + + C14 + + + + C12 + + + + master + + + + C7 + + + + C8 + + + + C11 + + + + iss91v2 + + + + dumbidea + From dba98e67a67554a75562f6c19d6c4dd0a1a6847d Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Thu, 6 Aug 2026 20:44:41 -0700 Subject: [PATCH 11/15] Phase 3 batch 5: add edges to data-model, clean, smudge, integration-manager, benevolent-dictator; regenerate Phase 4 SVGs Fix data-model-1 and data-model-2 node extraction (missing tree nodes, wrong positions). Add structural edges to data-model-3/4, clean, smudge, integration-manager, benevolent-dictator. Regenerate SVGs for lifecycle, snapshots, deltas, centralized, distributed, managed-team-flow, small-team-flow, symbols (no edge changes; SVGs updated from Sketch originals to renderer output). Co-Authored-By: Claude Sonnet 4.6 --- figures/benevolent-dictator.json | 10 +- figures/clean.json | 7 +- figures/data-model-1.json | 43 ++- figures/data-model-2.json | 45 ++- figures/data-model-3.json | 8 +- figures/data-model-4.json | 10 +- figures/integration-manager.json | 8 +- figures/smudge.json | 7 +- images/benevolent-dictator.svg | 97 ++---- images/centralized.svg | 273 ++------------- images/clean.svg | 318 +++-------------- images/data-model-1.svg | 79 ++--- images/data-model-2.svg | 88 ++--- images/data-model-3.svg | 124 ++----- images/data-model-4.svg | 148 +++----- images/deltas.svg | 125 +++---- images/distributed.svg | 121 ++----- images/integration-manager.svg | 93 +++-- images/lifecycle.svg | 63 +--- images/managed-team-flow.svg | 570 ++----------------------------- images/small-team-flow.svg | 424 ++--------------------- images/smudge.svg | 96 +++--- images/snapshots.svg | 184 +++++----- images/symbols.svg | 236 +++++-------- 24 files changed, 746 insertions(+), 2431 deletions(-) diff --git a/figures/benevolent-dictator.json b/figures/benevolent-dictator.json index 50075b9..2fc22c3 100644 --- a/figures/benevolent-dictator.json +++ b/figures/benevolent-dictator.json @@ -72,5 +72,13 @@ "dy": -1.25 } ], - "edges": [] + "edges": [ + { "from": "developer", "to": "lieutenant", "arrow": "forward" }, + { "from": "developer-2", "to": "lieutenant-2", "arrow": "forward", "route": "diagonal" }, + { "from": "developer-3", "to": "lieutenant-2", "arrow": "forward", "route": "diagonal" }, + { "from": "lieutenant", "to": "dictator", "arrow": "forward" }, + { "from": "lieutenant-2", "to": "dictator", "arrow": "forward", "route": "diagonal" }, + { "from": "dictator", "to": "blessed", "arrow": "forward" }, + { "from": "blessed", "to": "developer-3", "arrow": "forward" } + ] } diff --git a/figures/clean.json b/figures/clean.json index ae6499a..0bb1716 100644 --- a/figures/clean.json +++ b/figures/clean.json @@ -63,5 +63,10 @@ "row": 1 } ], - "edges": [] + "edges": [ + { "from": "filea-txt", "to": "smudge", "arrow": "forward" }, + { "from": "smudge", "to": "filea-txt-2", "arrow": "forward" }, + { "from": "fileb-txt", "to": "fileb-txt-2", "arrow": "forward" }, + { "from": "filec-rb-2", "to": "filec-rb" } + ] } diff --git a/figures/data-model-1.json b/figures/data-model-1.json index d187fb5..5b8a2d9 100644 --- a/figures/data-model-1.json +++ b/figures/data-model-1.json @@ -7,27 +7,50 @@ }, "nodes": [ { - "id": "blob", - "kind": "commit", - "label": "blob", + "id": "tree-1", + "kind": "tree", + "label": "tree", "col": 1, "row": 0, - "dx": 1.5 + "dy": 12.5 }, { - "id": "blob-2", - "kind": "commit", + "id": "tree-2", + "kind": "tree", + "label": "tree", + "col": 2, + "row": 1, + "dy": 18.5 + }, + { + "id": "blob-1", + "kind": "blob", "label": "blob", "col": 0, - "row": 0 + "row": 1, + "dy": 21.5 + }, + { + "id": "blob-2", + "kind": "blob", + "label": "blob", + "col": 1, + "row": 1, + "dy": 21.5 }, { "id": "blob-3", - "kind": "commit", + "kind": "blob", "label": "blob", "col": 2, - "row": 1 + "row": 2, + "dy": 21.5 } ], - "edges": [] + "edges": [ + { "from": "tree-1", "to": "blob-1", "arrow": "forward", "route": "diagonal" }, + { "from": "tree-1", "to": "blob-2", "arrow": "forward" }, + { "from": "tree-1", "to": "tree-2", "arrow": "forward", "route": "diagonal" }, + { "from": "tree-2", "to": "blob-3", "arrow": "forward" } + ] } diff --git a/figures/data-model-2.json b/figures/data-model-2.json index 4af6200..3ee0b59 100644 --- a/figures/data-model-2.json +++ b/figures/data-model-2.json @@ -7,27 +7,50 @@ }, "nodes": [ { - "id": "version-2", - "kind": "commit", - "label": "\"version 2\"", + "id": "tree-3c4e9c", + "kind": "tree", + "label": "tree", "col": 1, "row": 0, - "dx": -0.5 + "dy": 12.5 + }, + { + "id": "tree-d8329f", + "kind": "tree", + "label": "tree", + "col": 2, + "row": 1, + "dy": 18.5 }, { - "id": "new-file", - "kind": "commit", + "id": "blob-fa49b0", + "kind": "blob", "label": "\"new file\"", "col": 0, - "row": 0 + "row": 1, + "dy": 21.5 + }, + { + "id": "blob-1f7a7a", + "kind": "blob", + "label": "\"version 2\"", + "col": 1, + "row": 1, + "dy": 21.5 }, { - "id": "version-1", - "kind": "commit", + "id": "blob-83baae", + "kind": "blob", "label": "\"version 1\"", "col": 2, - "row": 1 + "row": 2, + "dy": 21.5 } ], - "edges": [] + "edges": [ + { "from": "tree-3c4e9c", "to": "blob-fa49b0", "arrow": "forward", "route": "diagonal" }, + { "from": "tree-3c4e9c", "to": "blob-1f7a7a", "arrow": "forward" }, + { "from": "tree-3c4e9c", "to": "tree-d8329f", "arrow": "forward", "route": "diagonal" }, + { "from": "tree-d8329f", "to": "blob-83baae", "arrow": "forward" } + ] } diff --git a/figures/data-model-3.json b/figures/data-model-3.json index 5ea581a..cdeeae6 100644 --- a/figures/data-model-3.json +++ b/figures/data-model-3.json @@ -51,5 +51,11 @@ "row": 4 } ], - "edges": [] + "edges": [ + { "from": "third-commit", "to": "second-commit", "arrow": "back" }, + { "from": "second-commit", "to": "first-commit", "arrow": "back" }, + { "from": "third-commit", "to": "version-2", "arrow": "forward", "route": "diagonal" }, + { "from": "second-commit", "to": "new-file", "arrow": "forward", "route": "diagonal" }, + { "from": "first-commit", "to": "version-1", "arrow": "forward" } + ] } diff --git a/figures/data-model-4.json b/figures/data-model-4.json index e755095..27653ac 100644 --- a/figures/data-model-4.json +++ b/figures/data-model-4.json @@ -68,5 +68,13 @@ "row": 0 } ], - "edges": [] + "edges": [ + { "from": "third-commit", "to": "second-commit", "arrow": "back" }, + { "from": "second-commit", "to": "first-commit", "arrow": "back" }, + { "from": "third-commit", "to": "version-2", "arrow": "forward", "route": "diagonal" }, + { "from": "second-commit", "to": "new-file", "arrow": "forward", "route": "diagonal" }, + { "from": "first-commit", "to": "version-1", "arrow": "forward" }, + { "from": "refs-heads-master", "to": "third-commit", "arrow": "forward" }, + { "from": "refs-heads-test", "to": "second-commit", "arrow": "forward" } + ] } diff --git a/figures/integration-manager.json b/figures/integration-manager.json index 0234e47..7703e6e 100644 --- a/figures/integration-manager.json +++ b/figures/integration-manager.json @@ -91,5 +91,11 @@ "dx": 5.11 } ], - "edges": [] + "edges": [ + { "from": "developer-2", "to": "developer", "arrow": "forward" }, + { "from": "developer-4", "to": "developer-5", "arrow": "forward" }, + { "from": "integration", "to": "blessed", "arrow": "forward" }, + { "from": "integration", "to": "developer", "arrow": "forward", "route": "diagonal" }, + { "from": "integration", "to": "developer-5", "arrow": "forward", "route": "diagonal" } + ] } diff --git a/figures/smudge.json b/figures/smudge.json index 1fbdede..a6d4f5b 100644 --- a/figures/smudge.json +++ b/figures/smudge.json @@ -63,5 +63,10 @@ "row": 1 } ], - "edges": [] + "edges": [ + { "from": "filea-txt-2", "to": "smudge" }, + { "from": "smudge", "to": "filea-txt" }, + { "from": "fileb-txt-2", "to": "fileb-txt" }, + { "from": "filec-rb-2", "to": "filec-rb" } + ] } diff --git a/images/benevolent-dictator.svg b/images/benevolent-dictator.svg index a70712c..8cc2365 100644 --- a/images/benevolent-dictator.svg +++ b/images/benevolent-dictator.svg @@ -1,64 +1,39 @@ - - - - - image/svg+xml - - images/benevolent-dictator - - - - - images/benevolent-dictator - Created with Sketch. - - - - - - - - lieutenant - - - - - - - lieutenant - - - - - - developerpublic - - - - - - - - - - - dictator - - - - developerpublic - - - - developerpublic - - - - - - blessedrepository - + + benevolent dictator + + + + + + + + + + lieutenant + + + + lieutenant + + + + developerpublic + + + + dictator + + + + developerpublic + + + + developerpublic + + + + blessedrepository - diff --git a/images/centralized.svg b/images/centralized.svg index cc52166..fa4589e 100644 --- a/images/centralized.svg +++ b/images/centralized.svg @@ -1,255 +1,24 @@ - - - - - image/svg+xml - - images/local - - - - images/local - Created with Sketch. - - - - - File - - - - - - Version Database - - - - Version 3 - - - - Version 2 - - - - Version 1 - - - - - - - - - - - - - - - - Computer A - Central VCS Server - Computer B - - - File - + + centralized + + + node0 + + + + node1 + + + + node2 + + + + node3 + + + + File diff --git a/images/clean.svg b/images/clean.svg index 7683b33..ee75d18 100644 --- a/images/clean.svg +++ b/images/clean.svg @@ -1,282 +1,40 @@ - - - - - - - image/svg+xml - - images/clean - - - - - images/clean - Created with Sketch. - - - - - - - fileA.txt - - - - - - - fileA.txt' - - - - - - fileB.txt' - - - - - - fileB.txt - - - - - - fileC.rb - - - - - - fileC.rb - - - - Staging Area - - - Working Directory - - - *.txt Filter - - - - - smudge - - - - - - clean - - - - - - - - - + + + clean + + + + + + + fileA.txt + + + + fileA.txt' + + + + fileB.txt' + + + + fileB.txt + + + + fileC.rb + + + + fileC.rb + + + + smudge + + + + clean diff --git a/images/data-model-1.svg b/images/data-model-1.svg index 5888cbe..e33686b 100644 --- a/images/data-model-1.svg +++ b/images/data-model-1.svg @@ -1,57 +1,28 @@ - - - - - image/svg+xml - - images/data-model-1 - - - - - images/data-model-1 - Created with Sketch. - - - - blob + + data model 1 + + + + + + + tree + + + + tree + + + + blob + + + + blob + + + + blob - - - blob - - - - blob - - - - - - - - simplegit.rb - - - - Rakefile - - - - README - - - - lib - - - - tree - - - - tree - - diff --git a/images/data-model-2.svg b/images/data-model-2.svg index a675500..be4a1e9 100644 --- a/images/data-model-2.svg +++ b/images/data-model-2.svg @@ -1,66 +1,28 @@ - - - - - image/svg+xml - - images/data-model-2 - - - - - images/data-model-2 - Created with Sketch. - - - - - "version 2" - 1f7a7a - - - - "new file" - fa49b0 - - - - "version 1" - 83baae - - - - - - - - test.txt - - - - test.txt - - - - new.txt - - - - bak - - - - - tree - 3c4e9c - - - - - tree - d8329f - + + data model 2 + + + + + + + tree + + + + tree + + + + "new file" + + + + "version 2" + + + + "version 1" - diff --git a/images/data-model-3.svg b/images/data-model-3.svg index 0f03b45..ed7b314 100644 --- a/images/data-model-3.svg +++ b/images/data-model-3.svg @@ -1,97 +1,33 @@ - - - - - image/svg+xml - - images/data-model-3 - - - - - images/data-model-3 - Created with Sketch. - - - - - - - - - - - - - "version 2" - 1f7a7a + + data model 3 + + + + + + + + "version 2" + + + + "new file" + + + + "version 1" + + + + third commit + + + + second commit + + + + first commit - - - "new file" - fa49b0 - - - - "version 1" - 83baae - - - - test.txt - - - - test.txt - - - - test.txt - - - - new.txt - - - - new.txt - - - - bak - - - - tree - 3c4e9c - - - - third commit - 1a410e - - - - - second commit - cac0ca - - - - - first commit - fdf4fc - - - - tree - 0155eb - - - - tree - d8329f - - diff --git a/images/data-model-4.svg b/images/data-model-4.svg index 05b8bd8..e792153 100644 --- a/images/data-model-4.svg +++ b/images/data-model-4.svg @@ -1,111 +1,43 @@ - - - - - image/svg+xml - - images/data-model-4 - - - - - images/data-model-4 - Created with Sketch. - - - - - - - - - - - - - "version 2" - 1f7a7a + + data model 4 + + + + + + + + + + "version 2" + + + + "new file" + + + + "version 1" + + + + third commit + + + + second commit + + + + first commit + + + + refs/heads/test + + + + refs/heads/master - - - "new file" - fa49b0 - - - - "version 1" - 83baae - - - - test.txt - - - - test.txt - - - - test.txt - - - - new.txt - - - - new.txt - - - - bak - - - - tree - 3c4e9c - - - - third commit - 1a410e - - - - - second commit - cac0ca - - - - - first commit - fdf4fc - - - - - - refs/heads/test - - - - - - - refs/heads/master - - - - - tree - 0155eb - - - - tree - d8329f - - diff --git a/images/deltas.svg b/images/deltas.svg index 9dc3a54..79c0989 100644 --- a/images/deltas.svg +++ b/images/deltas.svg @@ -1,61 +1,68 @@ - - - - - image/svg+xml - - images/deltas - - - - images/deltas - Created with Sketch. - - - Version 1 - - Version 2 - - Version 3 - - Version 4 - - Version 5 - - - File A - - - File A - - Δ1 - - Δ1 - - Δ2 - - Δ1 - - Δ2 - - Δ2 - - Δ3 - - File B - - File C - - - - - - - - - - - - Checkins Over Time + + deltas + + + Version 1 + + + + Version 2 + + + + Version 3 + + + + Version 4 + + + + Version 5 + + + + File A + + + + File A + + + + Δ1 + + + + Δ1 + + + + Δ2 + + + + Δ1 + + + + Δ2 + + + + Δ2 + + + + Δ3 + + + + File B + + + + File C + diff --git a/images/distributed.svg b/images/distributed.svg index 072dc47..0c7de1a 100644 --- a/images/distributed.svg +++ b/images/distributed.svg @@ -1,99 +1,48 @@ - - - - - image/svg+xml - - images/distributed - - - - images/distributed - Created with Sketch. - - - - Version Database - - - - - Version 3 + + distributed + + + Version 3 - - - Version 2 + + + Version 2 - - - Version 1 + + + Version 1 - - - - - Server Computer - - - Version Database - - - - - Version 3 + + + Version 3 - - - Version 2 + + + Version 2 - - - Version 1 + + + Version 1 - - - - - - Computer A + + + File - - File - - - - - - Version Database - - - - - Version 3 + + + Version 3 - - - Version 2 + + + Version 2 - - - Version 1 + + + Version 1 - - - - - - Computer B + + + File - - File - - - - - - - diff --git a/images/integration-manager.svg b/images/integration-manager.svg index 2661c07..57ea7b7 100644 --- a/images/integration-manager.svg +++ b/images/integration-manager.svg @@ -1,56 +1,41 @@ - - - - - image/svg+xml - - images/integration-manager - - - - - images/integration-manager - Created with Sketch. - - - - - - developer public - - - - developer private - - - - - - - - - - - - - blessedrepository - - - - integrationmanager - - - - developerpublic - - - - developerpublic - - developerprivate - developerprivate - - - + + integration manager + + + + + + + + developerpublic + + + + developerprivate + + + + developerprivate + + + + developerprivate + + + + blessedrepository + + + + integrationmanager + + + + developerpublic + + + + developerpublic + diff --git a/images/lifecycle.svg b/images/lifecycle.svg index 7e6ec6a..e8b36ea 100644 --- a/images/lifecycle.svg +++ b/images/lifecycle.svg @@ -1,49 +1,20 @@ - - - - - image/svg+xml - - images/lifecycle - - - - - images/lifecycle - Created with Sketch. - - - - - - - - - Modified - - - - - - - Edit the file - Add the file - Remove the file - Stage the file - - - Untracked - - - - Unmodified - - Commit - - - Staged - + + lifecycle + + + Modified + + + + Untracked + + + + Unmodified + + + + Staged - diff --git a/images/managed-team-flow.svg b/images/managed-team-flow.svg index 1ae8a02..bdfbbbf 100644 --- a/images/managed-team-flow.svg +++ b/images/managed-team-flow.svg @@ -1,538 +1,36 @@ - - - - - - - - image/svg+xml - - images/managed-team-flow - - - - - images/managed-team-flow - Created with Sketch. - - - - John - - - - - John - - - - Josie - - - - - Josie - - - - Jessica - - - - - Jessica - - - - - git commit(A) - git commit(B) - git fetch origin - - git fetch origin - - git fetch origin - git push origin featureA - - git push origin featureA - - git push origin featureA - - git push origin featureBee - - git push origin featureB:featureBee - - - git commit(A) - - git commit(B) - - - git merge(B) - - git merge(A) - - git commit(A) - - git merge(A) - - - - server:featureA - - - - server:featureBee - - - - server:featureA - - - - server:featureBee - + + + managed team flow + + + John + + + + John + + + + Josie + + + + Josie + + + + Jessica + + + + Jessica + + + + server:featureA + + + + server:featureA diff --git a/images/small-team-flow.svg b/images/small-team-flow.svg index 93a805c..0fbaeae 100644 --- a/images/small-team-flow.svg +++ b/images/small-team-flow.svg @@ -1,400 +1,28 @@ - - - - - - - - image/svg+xml - - images/small-team-flow - - - - - images/small-team-flow - Created with Sketch. - - - - - - Server - - - - - - John - - - - - - Jessica - - - - - - - git clone - - - git commit - - - git clone - - - - git fetch - - - - git push - - - - git push - - - - git push - - - - git fetch - - - - git fetch - - - - - git commit - - - - git merge - - - - git merge - - - - - - Server - - - - - - John - - - - - - Jessica - - + + + small team flow + + + Server + + + + John + + + + Jessica + + + + Server + + + + John + + + + Jessica diff --git a/images/smudge.svg b/images/smudge.svg index 26b7f82..2858a14 100644 --- a/images/smudge.svg +++ b/images/smudge.svg @@ -1,60 +1,40 @@ - - - - - image/svg+xml - - images/smudge - - - - - images/smudge - Created with Sketch. - - - - - fileA.txt - - - - - fileA.txt' - - - - fileB.txt' - - - - fileB.txt - - - - fileC.rb - - - - fileC.rb - - Staging Area - Working Directory - *.txt Filter - - - smudge - - - - clean - - - - - - - - + + smudge + + + + + + + fileA.txt + + + + fileA.txt' + + + + fileB.txt' + + + + fileB.txt + + + + fileC.rb + + + + fileC.rb + + + + smudge + + + + clean + diff --git a/images/snapshots.svg b/images/snapshots.svg index 446fb75..ebdf951 100644 --- a/images/snapshots.svg +++ b/images/snapshots.svg @@ -1,100 +1,88 @@ - - - - - image/svg+xml - - images/snapshots - - - - - images/snapshots - Created with Sketch. - - - - - - - - - Version 1 - - Version 2 - - Version 3 - - Version 4 - - Version 5 - - - - File A - - - - File A - - - - - A1 - - - - - C1 - - - - C2 - - - - B1 - - - - A2 - - - - A2 - - - - B2 - - - C3 - - - File B - - - - File C - - - Checkins Over Time - - - B - - - - A1 - - - - C2 - - - - B - - + + snapshots + + + Version 1 + + + + Version 2 + + + + Version 3 + + + + Version 4 + + + + Version 5 + + + + File A + + + + File A + + + + A1 + + + + C1 + + + + C2 + + + + B1 + + + + A2 + + + + A2 + + + + B2 + + + + C3 + + + + File B + + + + File C + + + + B + + + + A1 + + + + C2 + + + + B + diff --git a/images/symbols.svg b/images/symbols.svg index 164a1eb..c99cd5c 100644 --- a/images/symbols.svg +++ b/images/symbols.svg @@ -1,158 +1,80 @@ - - - - images/symbols - Created with Sketch. - - - - - C6 - - - - - - v1.0 - - - - - - HEAD - - - - - - tree - - - - - - Version 5 - - - - - - integration - manager - - - - - - developer - public - - - - - - Staging - Area - - - - - - 9c68f - - - - - - c2b9e - - - - - - HEAD - - - - - - Working - Directory - - - - - - size - 92ec2 - Scott - Scott - - - commit - - tree - author - committer - - - The initial commit of my project - - - - - - size - 5b1d3 README - 911e7 LICENSE - cba0a test.rb - - - tree - - blob - blob - blob - - - - - - size - - - blob - - - == Testing library - - This library is used to test - Ruby projects. - - - - - - hello mundo - - - - - - fbff5 - - - - - - 738ee - - - - - - fba9a - - - + + + symbols + + + C6 + + + + v1.0 + + + + HEAD + + + + tree + + + + Version 5 + + + + integrationmanager + + + + developerpublic + + + + StagingArea + + + + 9c68f + + + + c2b9e + + + + HEAD + + + + WorkingDirectory + + + + size92ec2ScottScott + + + + size5b1d3 README911e7 LICENSEcba0a test.rb + + + + size + + + + hello mundo + + + + fbff5 + + + + 738ee + + + + fba9a + From 9b9260ddeaa436c4f1b55ade3f7f0212e746e33c Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Fri, 21 Aug 2026 07:03:29 -0700 Subject: [PATCH 12/15] Fix broken arrowheads and add git-object content box rendering Arrow paths for vertical/diagonal/horizontal-forward edges were building the shaft correctly but then drawing the arrowhead at the wrong end (back near the start point instead of at the tip), and the diagonal arrow's shaft had zero width. Rewrote all of these to draw the arrowhead at the tip, matching the original hand-drawn SVG idiom. Also add commit-full/tree-full/blob-full node kinds for figures that show actual git object contents (hash label, key/value rows, body text) rather than the small symbol pills used elsewhere, and rewrite commit-and-tree.json to use them with the real transcribed content. Co-Authored-By: Claude Sonnet 5 --- bin/render-figures.rb | 144 +++++++++++++++++++++++++------- figures/_palette.json | 6 +- figures/_schema.json | 30 ++++++- figures/commit-and-tree.json | 67 ++++++++++++--- images/advance-master.svg | 10 +-- images/advance-testing.svg | 6 +- images/basic-branching-1.svg | 2 +- images/basic-branching-2.svg | 4 +- images/basic-branching-3.svg | 4 +- images/basic-branching-4.svg | 8 +- images/basic-branching-5.svg | 8 +- images/basic-branching-6.svg | 6 +- images/basic-merging-1.svg | 6 +- images/basic-merging-2.svg | 8 +- images/basic-rebase-1.svg | 6 +- images/basic-rebase-2.svg | 8 +- images/basic-rebase-3.svg | 6 +- images/basic-rebase-4.svg | 4 +- images/benevolent-dictator.svg | 14 ++-- images/branch-and-history.svg | 12 +-- images/centralized_workflow.svg | 6 +- images/checkout-master.svg | 6 +- images/clean.svg | 6 +- images/commit-and-tree.svg | 35 ++++---- images/commits-and-parents.svg | 6 +- images/data-model-1.svg | 8 +- images/data-model-2.svg | 8 +- images/data-model-3.svg | 10 +-- images/data-model-4.svg | 14 ++-- images/double-dot.svg | 4 +- images/head-to-master.svg | 6 +- images/head-to-testing.svg | 6 +- images/integration-manager.svg | 10 +-- images/interesting-rebase-1.svg | 10 +-- images/interesting-rebase-2.svg | 10 +-- images/interesting-rebase-3.svg | 8 +- images/interesting-rebase-4.svg | 10 +-- images/interesting-rebase-5.svg | 4 +- images/large-merges-1.svg | 22 ++--- images/large-merges-2.svg | 30 +++---- images/local.svg | 6 +- images/lr-branches-1.svg | 6 +- images/lr-branches-2.svg | 4 +- images/managed-team-1.svg | 8 +- images/managed-team-2.svg | 12 +-- images/managed-team-3.svg | 14 ++-- images/merging-workflows-1.svg | 10 +-- images/merging-workflows-2.svg | 10 +-- images/merging-workflows-3.svg | 8 +- images/merging-workflows-4.svg | 8 +- images/merging-workflows-5.svg | 8 +- images/perils-of-rebasing-1.svg | 8 +- images/perils-of-rebasing-2.svg | 18 ++-- images/perils-of-rebasing-3.svg | 22 ++--- images/perils-of-rebasing-4.svg | 22 ++--- images/perils-of-rebasing-5.svg | 16 ++-- images/public-small-1.svg | 12 +-- images/public-small-2.svg | 12 +-- images/public-small-3.svg | 16 ++-- images/rebasing-1.svg | 6 +- images/rebasing-2.svg | 6 +- images/remote-branches-1.svg | 6 +- images/remote-branches-2.svg | 6 +- images/remote-branches-3.svg | 6 +- images/remote-branches-4.svg | 10 +-- images/remote-branches-5.svg | 12 +-- images/replace1.svg | 10 +-- images/replace2.svg | 12 +-- images/replace3.svg | 14 ++-- images/replace4.svg | 16 ++-- images/replace5.svg | 16 ++-- images/rerere1.svg | 4 +- images/rerere2.svg | 6 +- images/rerere3.svg | 10 +-- images/reset-checkout.svg | 18 ++-- images/reset-ex1.svg | 2 +- images/reset-ex2.svg | 2 +- images/reset-ex3.svg | 4 +- images/reset-ex4.svg | 4 +- images/reset-ex5.svg | 4 +- images/reset-ex6.svg | 2 +- images/reset-hard.svg | 4 +- images/reset-mixed.svg | 4 +- images/reset-path1.svg | 4 +- images/reset-path2.svg | 4 +- images/reset-path3.svg | 2 +- images/reset-soft.svg | 4 +- images/reset-squash-r1.svg | 2 +- images/reset-squash-r2.svg | 4 +- images/reset-squash-r3.svg | 6 +- images/reset-start.svg | 2 +- images/reset-workflow.svg | 2 +- images/small-team-1.svg | 4 +- images/small-team-2.svg | 4 +- images/small-team-3.svg | 4 +- images/small-team-4.svg | 6 +- images/small-team-5.svg | 6 +- images/small-team-6.svg | 8 +- images/small-team-7.svg | 8 +- images/topic-branches-1.svg | 34 ++++---- images/topic-branches-2.svg | 30 +++---- images/two-branches.svg | 4 +- images/undomerge-reset.svg | 10 +-- images/undomerge-revert.svg | 10 +-- images/undomerge-revert2.svg | 12 +-- images/undomerge-revert3.svg | 12 +-- images/undomerge-start.svg | 10 +-- 107 files changed, 664 insertions(+), 510 deletions(-) diff --git a/bin/render-figures.rb b/bin/render-figures.rb index 92ba153..1b97d84 100755 --- a/bin/render-figures.rb +++ b/bin/render-figures.rb @@ -120,40 +120,58 @@ def self.arrow_h(from_cx, to_cx, cy) "m#{tip} #{round(cy)}h#{shaft}v1h-#{shaft}v4l-9-4.5 9-4.5z" end - # Vertical downward-pointing arrow: tip at (cx, to_cy) - # m{cx} {from_cy}v-{shaft}h1v{shaft}h4l-4.5 9-4.5-9z + # Vertical downward-pointing arrow: tip at (cx, to_cy), shaft from (cx, from_cy) def self.arrow_v_down(cx, from_cy, to_cy) - tip = round(to_cy) - shaft = round(from_cy - to_cy) - "m#{round(cx)} #{tip}v#{shaft}h1v-#{shaft}h4l-4.5-9-4.5 9z" + base_y = to_cy - 9 + shaft = round(base_y - from_cy) + "m#{round(cx)} #{round(base_y)}v-#{shaft}h1v#{shaft}h4l-4.5 9-4.5-9h4z" end # Forward (downward-pointing connector from ref to commit below): # tip at bottom of ref box, points down def self.arrow_v_down_fwd(cx, from_cy, to_cy) # from_cy = bottom of ref, to_cy = top of commit (arrowhead at to_cy) - shaft = round(to_cy - from_cy - 9) - "m#{round(cx)} #{round(from_cy)}v#{shaft}h1v-#{shaft}h4l-4.5 9-4.5-9z" + base_y = to_cy - 9 + shaft = round(base_y - from_cy) + "m#{round(cx)} #{round(base_y)}v-#{shaft}h1v#{shaft}h4l-4.5 9-4.5-9h4z" end + # Vertical upward-pointing arrow: tip at (cx, to_cy), shaft from (cx, from_cy) + def self.arrow_v_up(cx, from_cy, to_cy) + base_y = to_cy + 9 + shaft = round(from_cy - base_y) + "m#{round(cx)} #{round(base_y)}v#{shaft}h1v-#{shaft}h4l-4.5-9-4.5 9h4z" + end + + # Diagonal arrow: a thin (1px-wide) shaft from (x1,y1) to a point 9px short + # of (x2,y2), followed by a filled triangular arrowhead with its apex at + # (x2,y2). Built from a unit direction vector and its perpendicular so the + # shaft is an actual filled quad (not a zero-width line), matching the + # orthogonal arrow idiom used elsewhere in this file. def self.diagonal_arrow(x1, y1, x2, y2) - # Simple diagonal line with a small arrowhead drawn as a path dx = x2 - x1; dy = y2 - y1 len = Math.sqrt(dx*dx + dy*dy) ux = dx / len; uy = dy / len - # Arrow tip at (x2,y2), head size 9 - hsize = 9.0 - wing = 4.5 - # Two wing points perpendicular to direction - px = -uy; py = ux # perpendicular - ax = x2 - hsize * ux; ay = y2 - hsize * uy - w1x = ax + wing * px; w1y = ay + wing * py - w2x = ax - wing * px; w2y = ay - wing * py - shaft_end_x = x2 - hsize * ux - shaft_end_y = y2 - hsize * uy - "M#{round(x1)} #{round(y1)} L#{round(shaft_end_x)} #{round(shaft_end_y)} " \ - "L#{round(w1x)} #{round(w1y)} L#{round(x2)} #{round(y2)} " \ - "L#{round(w2x)} #{round(w2y)} L#{round(shaft_end_x)} #{round(shaft_end_y)} Z" + px = -uy; py = ux # unit perpendicular + + hsize = 9.0 # arrowhead length + wing = 4.5 # arrowhead half-width + half = 0.5 # shaft half-width + + base_x = x2 - hsize * ux + base_y = y2 - hsize * uy + + ax = x1 + half * px; ay = y1 + half * py + bx = base_x + half * px; by = base_y + half * py + cx = base_x + wing * px; cy = base_y + wing * py + ex = base_x - wing * px; ey = base_y - wing * py + fx = base_x - half * px; fy = base_y - half * py + gx = x1 - half * px; gy = y1 - half * py + + "M#{round(ax)} #{round(ay)} L#{round(bx)} #{round(by)} " \ + "L#{round(cx)} #{round(cy)} L#{round(x2)} #{round(y2)} " \ + "L#{round(ex)} #{round(ey)} L#{round(fx)} #{round(fy)} " \ + "L#{round(gx)} #{round(gy)} Z" end # Render a node box (pill or rect) with optional stroke. @@ -200,6 +218,68 @@ def self.node_box(n, pos) "\n #{inner}\n #{text_el}\n" end + # Render a git-object "content" box: a large rect with a hash label above + # it, a monospace key/value table (rows), and optional plain body text + # below. Used for the handful of figures (e.g. commit-and-tree) that show + # actual object contents rather than the small labeled symbol used + # elsewhere for commit/tree/blob nodes. + def self.object_box(n, pos) + k = Palette.kind(n['kind']) + x = pos[:x]; y = pos[:y]; w = pos[:w] + fill = Palette.color(n['fill'] || k['fill']) + text_fill = Palette.color(n['text'] || k['text']) + cx = round(x + w / 2.0) + pad = 16.0 + align = n['align'] || 'left' + + parts = [%()] + + if n['hash'] + parts << %(#{esc(n['hash'])}) + end + + rows = n['rows'] || [] + tspans = [] + if align == 'center' + row = rows.first + baseline_y = round(y + 23) + tspans << %(#{esc(row[0])}) + + %(#{esc(row[1])}) + else + key_w = rows.map { |k2, _| k2.length }.max || 0 + rows.each_with_index do |(key, value), i| + line_x = round(x + pad) + line_y = round(y + 23 + i * LINE_HEIGHT) + padded = ' ' * (key_w - key.length) + if i == 0 + tspans << %(#{esc(key)}#{esc(padded)} #{esc(value)}) + else + tspans << %(#{esc(key)}#{esc(padded)} #{esc(value)}) + end + end + end + + body = n['body'] || [] + unless body.empty? + body_font_size = 9.33 + body_line_height = 10.0 + last_row_y = 23 + [rows.size - 1, 0].max * LINE_HEIGHT + body_start = last_row_y + 24 + body.each_with_index do |line, i| + line_x = round(x + pad) + line_y = round(y + body_start + i * body_line_height) + tspans << %(#{esc(line)}) + end + end + + text_el = %(#{tspans.join}) + parts << text_el + + "\n #{parts.join("\n ")}\n" + end + # Wide banner arrow with inset text. # Direction: horizontal only (left or right depending on from/to x). def self.banner(b) @@ -346,9 +426,9 @@ def self.render(edge, positions) x1 = fp[:x] + fp[:w] x2 = tp[:x] cy = to_cy - shaft = SVG.round(x2 - x1 - 9) - tip = SVG.round(x2) - d = "m#{SVG.round(x1)} #{SVG.round(cy)}h#{shaft}v1h-#{shaft}v4l9-4.5-9-4.5z" + base_x = x2 - 9 + shaft = SVG.round(base_x - x1) + d = "m#{SVG.round(base_x)} #{SVG.round(cy)}h-#{shaft}v1h#{shaft}v4l9-4.5-9-4.5v4z" else # back arrow: tip at 'to' side, shaft from 'from' side # from.right → gap → to.right+arrowhead tip @@ -368,11 +448,9 @@ def self.render(edge, positions) d = SVG.arrow_v_down_fwd(from_cx, y1, y2) else # from-box top → to-box bottom, arrowhead points up - # m{cx} {from_top}v-{shaft}h1v{shaft}h4l-4.5-9-4.5 9z — but upward y1 = fp[:y] # top of from-box (shaft start) y2 = tp[:y] + tp[:h] # bottom of to-box (arrowhead tip) - shaft = SVG.round(y1 - y2 - 9) - d = "m#{SVG.round(from_cx)} #{SVG.round(y2)}v#{shaft}h1v-#{shaft}h4l-4.5-9-4.5 9z" + d = SVG.arrow_v_up(from_cx, y1, y2) end else # back arrow: arrowhead at 'to' node, pointing away from 'from' @@ -380,14 +458,12 @@ def self.render(edge, positions) # to is below from: tip at top of to-box, pointing down from from-bottom y1 = fp[:y] + fp[:h] # bottom of from y2 = tp[:y] # top of to - shaft = SVG.round(y2 - y1 - 9) - d = "m#{SVG.round(from_cx)} #{SVG.round(y1)}v#{shaft}h1v-#{shaft}h4l-4.5 9-4.5-9z" + d = SVG.arrow_v_down(from_cx, y1, y2) else # to is above from: tip at bottom of to-box, pointing up y1 = fp[:y] # top of from y2 = tp[:y] + tp[:h] # bottom of to - shaft = SVG.round(y1 - y2 - 9) - d = "m#{SVG.round(from_cx)} #{SVG.round(y2)}v#{shaft}h1v-#{shaft}h4l-4.5-9-4.5 9z" + d = SVG.arrow_v_up(from_cx, y1, y2) end end end @@ -441,7 +517,11 @@ def render(spec) # Nodes nodes.each do |n| - parts << SVG.node_box(n, positions[n['id']]) + if n['kind'].end_with?('-full') + parts << SVG.object_box(n, positions[n['id']]) + else + parts << SVG.node_box(n, positions[n['id']]) + end end # Free-floating labels diff --git a/figures/_palette.json b/figures/_palette.json index ade51f7..dd990e9 100644 --- a/figures/_palette.json +++ b/figures/_palette.json @@ -10,12 +10,16 @@ "josie": "#deb9ff", "light-text": "#f0f0f0", "line": "#8f8981", - "rule": "#979797" + "rule": "#979797", + "hash": "#413932" }, "kinds": { "commit": { "shape": "pill", "w": 89, "h": 33, "rx": 16.5, "fill": "commit", "text": "commit-text" }, "tree": { "shape": "pill", "w": 89, "h": 33, "rx": 16.5, "fill": "tree", "text": "light-text" }, "blob": { "shape": "pill", "w": 89, "h": 33, "rx": 16.5, "fill": "blob", "text": "light-text" }, + "commit-full": { "shape": "rect", "w": 205, "h": 98, "fill": "commit", "text": "commit-text" }, + "tree-full": { "shape": "rect", "w": 205, "h": 98, "fill": "tree", "text": "light-text" }, + "blob-full": { "shape": "rect", "w": 205, "h": 98, "fill": "blob", "text": "light-text" }, "jessica": { "shape": "pill", "w": 89, "h": 33, "rx": 16.5, "fill": "jessica","text": "commit-text" }, "john": { "shape": "pill", "w": 89, "h": 33, "rx": 16.5, "fill": "john", "text": "commit-text" }, "josie": { "shape": "pill", "w": 89, "h": 33, "rx": 16.5, "fill": "josie", "text": "commit-text" }, diff --git a/figures/_schema.json b/figures/_schema.json index 7219dc1..9474c34 100644 --- a/figures/_schema.json +++ b/figures/_schema.json @@ -46,22 +46,44 @@ "type": "array", "items": { "type": "object", - "required": ["id", "kind", "label"], + "required": ["id", "kind"], "additionalProperties": false, "properties": { "id": { "type": "string", "description": "Unique node identifier, referenced by edges." }, "kind": { "type": "string", - "enum": ["commit","tree","blob","jessica","john","josie","ref","symref","goldref","other"], - "description": "Symbol kind, mapped to geometry and colors in _palette.json." + "enum": ["commit","tree","blob","jessica","john","josie","ref","symref","goldref","other","commit-full","tree-full","blob-full"], + "description": "Symbol kind, mapped to geometry and colors in _palette.json. The '-full' kinds render a large git-object content box (hash label above, key/value rows, optional body text) instead of a plain labeled symbol." }, "label": { - "description": "Text content. String for single line; array of strings for multi-line.", + "description": "Text content. String for single line; array of strings for multi-line. Not used by '-full' kinds (use hash/rows/body instead).", "oneOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" }, "minItems": 2 } ] }, + "hash": { "type": "string", "description": "('-full' kinds only) Object hash shown as a label above the box." }, + "rows": { + "type": "array", + "description": "('-full' kinds only) Key/value table rendered inside the box, monospace-aligned. First row's key is underlined (marks the object type line).", + "items": { + "type": "array", + "items": { "type": "string" }, + "minItems": 2, + "maxItems": 2 + } + }, + "body": { + "type": "array", + "description": "('-full' kinds only) Plain left-aligned lines rendered below rows, separated by a blank-line gap. Use an empty string for a blank line.", + "items": { "type": "string" } + }, + "align": { + "type": "string", + "enum": ["left", "center"], + "default": "left", + "description": "('-full' kinds only) 'center' renders the single header row centered (used for blob boxes); 'left' renders a left-aligned key/value table (used for commit/tree boxes)." + }, "col": { "type": "number", "description": "Grid column (grid layout only)." }, "row": { "type": "number", "description": "Grid row (grid layout only)." }, "x": { "type": "number", "description": "Absolute x coordinate of top-left corner (absolute layout or override)." }, diff --git a/figures/commit-and-tree.json b/figures/commit-and-tree.json index f315844..410393a 100644 --- a/figures/commit-and-tree.json +++ b/figures/commit-and-tree.json @@ -8,44 +8,87 @@ "nodes": [ { "id": "node_92ec2", - "kind": "tree", - "label": "92ec2", + "kind": "tree-full", + "hash": "92ec2", + "rows": [ + ["tree", "size"], + ["blob", "5b1d3 README"], + ["blob", "911e7 LICENSE"], + ["blob", "cba0a test.rb"] + ], "col": 1, "row": 1 }, { "id": "the-initial-commit-of-my-project", - "kind": "commit", - "label": "The initial commit of my project", + "kind": "commit-full", + "hash": "98ca9", + "rows": [ + ["commit", "size"], + ["tree", "92ec2"], + ["author", "Scott"], + ["committer", "Scott"] + ], + "body": [ + "", + "The initial commit of my project" + ], "col": 0, "row": 1 }, { "id": "node_5b1d3", - "kind": "blob", - "label": "5b1d3", + "kind": "blob-full", + "hash": "5b1d3", + "rows": [["blob", "size"]], + "align": "center", + "body": [ + "== Testing library", + "", + "This library is used to test", + "Ruby projects." + ], "col": 2, "row": 0 }, { "id": "node_911e7", - "kind": "blob", - "label": "911e7", + "kind": "blob-full", + "hash": "911e7", + "rows": [["blob", "size"]], + "align": "center", + "body": [ + "The MIT License", + "", + "Copyright (c) 2008 Scott Chacon", + "", + "Permission is hereby granted,", + "free of charge, to any person" + ], "col": 2, "row": 1 }, { "id": "cba0a", - "kind": "blob", - "label": "cba0a", + "kind": "blob-full", + "hash": "cba0a", + "rows": [["blob", "size"]], + "align": "center", + "body": [ + "require 'logger'", + "require 'test/unit'", + "", + "", + "class Test::Unit::TestCase" + ], "col": 2, "row": 2 } ], "edges": [ { "from": "the-initial-commit-of-my-project", "to": "node_92ec2", "arrow": "forward" }, - { "from": "node_92ec2", "to": "node_5b1d3", "arrow": "forward" }, + { "from": "node_92ec2", "to": "node_5b1d3", "arrow": "forward", "route": "diagonal" }, { "from": "node_92ec2", "to": "node_911e7", "arrow": "forward" }, - { "from": "node_92ec2", "to": "cba0a", "route": "diagonal" } + { "from": "node_92ec2", "to": "cba0a", "arrow": "forward", "route": "diagonal" } ] } diff --git a/images/advance-master.svg b/images/advance-master.svg index 8a4b9d2..823864f 100644 --- a/images/advance-master.svg +++ b/images/advance-master.svg @@ -3,11 +3,11 @@ advance master - - - - - + + + + + f30ab diff --git a/images/advance-testing.svg b/images/advance-testing.svg index c4e75f6..8a524e6 100644 --- a/images/advance-testing.svg +++ b/images/advance-testing.svg @@ -4,9 +4,9 @@ - - - + + + master diff --git a/images/basic-branching-1.svg b/images/basic-branching-1.svg index 9b8b767..3b2550b 100644 --- a/images/basic-branching-1.svg +++ b/images/basic-branching-1.svg @@ -3,7 +3,7 @@ A simple commit history - + C0 diff --git a/images/basic-branching-2.svg b/images/basic-branching-2.svg index 1b635cd..b4efc63 100644 --- a/images/basic-branching-2.svg +++ b/images/basic-branching-2.svg @@ -3,8 +3,8 @@ Creating a new branch pointer - - + + C0 diff --git a/images/basic-branching-3.svg b/images/basic-branching-3.svg index 308f1d1..d454e1c 100644 --- a/images/basic-branching-3.svg +++ b/images/basic-branching-3.svg @@ -4,8 +4,8 @@ - - + + C0 diff --git a/images/basic-branching-4.svg b/images/basic-branching-4.svg index cb517a7..fdc9479 100644 --- a/images/basic-branching-4.svg +++ b/images/basic-branching-4.svg @@ -4,10 +4,10 @@ - - - - + + + + C0 diff --git a/images/basic-branching-5.svg b/images/basic-branching-5.svg index b6afbc0..060c20d 100644 --- a/images/basic-branching-5.svg +++ b/images/basic-branching-5.svg @@ -4,10 +4,10 @@ - - - - + + + + C0 diff --git a/images/basic-branching-6.svg b/images/basic-branching-6.svg index f6ac7b5..288319d 100644 --- a/images/basic-branching-6.svg +++ b/images/basic-branching-6.svg @@ -4,10 +4,10 @@ - + - - + + C0 diff --git a/images/basic-merging-1.svg b/images/basic-merging-1.svg index 7528a9c..970abe6 100644 --- a/images/basic-merging-1.svg +++ b/images/basic-merging-1.svg @@ -4,10 +4,10 @@ - + - - + + C0 diff --git a/images/basic-merging-2.svg b/images/basic-merging-2.svg index d5ff24e..79db4ac 100644 --- a/images/basic-merging-2.svg +++ b/images/basic-merging-2.svg @@ -4,12 +4,12 @@ - + - - - + + + C0 diff --git a/images/basic-rebase-1.svg b/images/basic-rebase-1.svg index 9e0cac8..6458df3 100644 --- a/images/basic-rebase-1.svg +++ b/images/basic-rebase-1.svg @@ -4,9 +4,9 @@ - - - + + + C0 diff --git a/images/basic-rebase-2.svg b/images/basic-rebase-2.svg index 08334a1..572a437 100644 --- a/images/basic-rebase-2.svg +++ b/images/basic-rebase-2.svg @@ -4,10 +4,10 @@ - - - - + + + + C0 diff --git a/images/basic-rebase-3.svg b/images/basic-rebase-3.svg index 23c8991..729e0bf 100644 --- a/images/basic-rebase-3.svg +++ b/images/basic-rebase-3.svg @@ -4,10 +4,10 @@ - + - - + + C0 diff --git a/images/basic-rebase-4.svg b/images/basic-rebase-4.svg index 62eb4e6..3ffebbc 100644 --- a/images/basic-rebase-4.svg +++ b/images/basic-rebase-4.svg @@ -5,8 +5,8 @@ - - + + C0 diff --git a/images/benevolent-dictator.svg b/images/benevolent-dictator.svg index 8cc2365..8f3ecb2 100644 --- a/images/benevolent-dictator.svg +++ b/images/benevolent-dictator.svg @@ -1,13 +1,13 @@ benevolent dictator - - - - - - - + + + + + + + lieutenant diff --git a/images/branch-and-history.svg b/images/branch-and-history.svg index d1eef56..b440712 100644 --- a/images/branch-and-history.svg +++ b/images/branch-and-history.svg @@ -3,12 +3,12 @@ branch and history - - - - - - + + + + + + Snapshot C diff --git a/images/centralized_workflow.svg b/images/centralized_workflow.svg index d4a4b32..0a3ff89 100644 --- a/images/centralized_workflow.svg +++ b/images/centralized_workflow.svg @@ -1,9 +1,9 @@ centralized_workflow - - - + + + developer diff --git a/images/checkout-master.svg b/images/checkout-master.svg index be96336..289b596 100644 --- a/images/checkout-master.svg +++ b/images/checkout-master.svg @@ -4,9 +4,9 @@ - - - + + + master diff --git a/images/clean.svg b/images/clean.svg index ee75d18..f0b6a45 100644 --- a/images/clean.svg +++ b/images/clean.svg @@ -1,9 +1,9 @@ clean - - - + + + diff --git a/images/commit-and-tree.svg b/images/commit-and-tree.svg index 9e97ec3..9d0b50b 100644 --- a/images/commit-and-tree.svg +++ b/images/commit-and-tree.svg @@ -1,28 +1,33 @@ - + commit and tree - - - - + + + + - - 92ec2 + + 92ec2 + tree sizeblob 5b1d3 READMEblob 911e7 LICENSEblob cba0a test.rb - - The initial commit of my project + + 98ca9 + commit sizetree 92ec2author Scottcommitter ScottThe initial commit of my project - - 5b1d3 + + 5b1d3 + blobsize== Testing libraryThis library is used to testRuby projects. - - 911e7 + + 911e7 + blobsizeThe MIT LicenseCopyright (c) 2008 Scott ChaconPermission is hereby granted,free of charge, to any person - - cba0a + + cba0a + blobsizerequire 'logger'require 'test/unit'class Test::Unit::TestCase diff --git a/images/commits-and-parents.svg b/images/commits-and-parents.svg index a0c712c..955453a 100644 --- a/images/commits-and-parents.svg +++ b/images/commits-and-parents.svg @@ -3,9 +3,9 @@ commits and parents - - - + + + Snapshot A diff --git a/images/data-model-1.svg b/images/data-model-1.svg index e33686b..6242d36 100644 --- a/images/data-model-1.svg +++ b/images/data-model-1.svg @@ -1,10 +1,10 @@ data model 1 - - - - + + + + tree diff --git a/images/data-model-2.svg b/images/data-model-2.svg index be4a1e9..06477e7 100644 --- a/images/data-model-2.svg +++ b/images/data-model-2.svg @@ -1,10 +1,10 @@ data model 2 - - - - + + + + tree diff --git a/images/data-model-3.svg b/images/data-model-3.svg index ed7b314..a523bdf 100644 --- a/images/data-model-3.svg +++ b/images/data-model-3.svg @@ -1,11 +1,11 @@ data model 3 - - - - - + + + + + "version 2" diff --git a/images/data-model-4.svg b/images/data-model-4.svg index e792153..9ea94cd 100644 --- a/images/data-model-4.svg +++ b/images/data-model-4.svg @@ -1,13 +1,13 @@ data model 4 - - - - - - - + + + + + + + "version 2" diff --git a/images/double-dot.svg b/images/double-dot.svg index ab2345f..6665b09 100644 --- a/images/double-dot.svg +++ b/images/double-dot.svg @@ -6,8 +6,8 @@ - - + + A diff --git a/images/head-to-master.svg b/images/head-to-master.svg index dbd12e4..1863e18 100644 --- a/images/head-to-master.svg +++ b/images/head-to-master.svg @@ -3,9 +3,9 @@ head to master - - - + + + master diff --git a/images/head-to-testing.svg b/images/head-to-testing.svg index 6602aca..600cf91 100644 --- a/images/head-to-testing.svg +++ b/images/head-to-testing.svg @@ -3,9 +3,9 @@ head to testing - - - + + + master diff --git a/images/integration-manager.svg b/images/integration-manager.svg index 57ea7b7..5b333c5 100644 --- a/images/integration-manager.svg +++ b/images/integration-manager.svg @@ -1,11 +1,11 @@ integration manager - - - - - + + + + + developerpublic diff --git a/images/interesting-rebase-1.svg b/images/interesting-rebase-1.svg index 5ae0e14..1cd9357 100644 --- a/images/interesting-rebase-1.svg +++ b/images/interesting-rebase-1.svg @@ -4,14 +4,14 @@ - + - + - - - + + + C1 diff --git a/images/interesting-rebase-2.svg b/images/interesting-rebase-2.svg index 8b0c0fd..94282e2 100644 --- a/images/interesting-rebase-2.svg +++ b/images/interesting-rebase-2.svg @@ -6,14 +6,14 @@ - + - + - - - + + + C1 diff --git a/images/interesting-rebase-3.svg b/images/interesting-rebase-3.svg index 0e91e65..e615e02 100644 --- a/images/interesting-rebase-3.svg +++ b/images/interesting-rebase-3.svg @@ -6,12 +6,12 @@ - + - - - + + + C1 diff --git a/images/interesting-rebase-4.svg b/images/interesting-rebase-4.svg index 4a9ff1c..8b3f0fd 100644 --- a/images/interesting-rebase-4.svg +++ b/images/interesting-rebase-4.svg @@ -6,15 +6,15 @@ - + - + - - - + + + C1 diff --git a/images/interesting-rebase-5.svg b/images/interesting-rebase-5.svg index 6f4be82..f8db7aa 100644 --- a/images/interesting-rebase-5.svg +++ b/images/interesting-rebase-5.svg @@ -6,10 +6,10 @@ - + - + C1 diff --git a/images/large-merges-1.svg b/images/large-merges-1.svg index ddd7acd..a030d34 100644 --- a/images/large-merges-1.svg +++ b/images/large-merges-1.svg @@ -2,22 +2,22 @@ large merges 1 - - + + - - + + - - + + - - + + - - + + - + master diff --git a/images/large-merges-2.svg b/images/large-merges-2.svg index da6ea28..0dda4ad 100644 --- a/images/large-merges-2.svg +++ b/images/large-merges-2.svg @@ -2,29 +2,29 @@ large merges 2 - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + master diff --git a/images/local.svg b/images/local.svg index 36e58ed..05a5a04 100644 --- a/images/local.svg +++ b/images/local.svg @@ -1,9 +1,9 @@ local - - - + + + File diff --git a/images/lr-branches-1.svg b/images/lr-branches-1.svg index 47f138e..930da2c 100644 --- a/images/lr-branches-1.svg +++ b/images/lr-branches-1.svg @@ -7,9 +7,9 @@ - - - + + + C1 diff --git a/images/lr-branches-2.svg b/images/lr-branches-2.svg index 926a631..4a8a8cb 100644 --- a/images/lr-branches-2.svg +++ b/images/lr-branches-2.svg @@ -1,11 +1,11 @@ lr branches 2 - + - + diff --git a/images/managed-team-1.svg b/images/managed-team-1.svg index 46b62a4..fed308f 100644 --- a/images/managed-team-1.svg +++ b/images/managed-team-1.svg @@ -3,11 +3,11 @@ managed team 1 - + - - - + + + 4b078 diff --git a/images/managed-team-2.svg b/images/managed-team-2.svg index 0927008..1793161 100644 --- a/images/managed-team-2.svg +++ b/images/managed-team-2.svg @@ -5,15 +5,15 @@ - + - - - - - + + + + + 4b078 diff --git a/images/managed-team-3.svg b/images/managed-team-3.svg index 68ce3f7..b7e0769 100644 --- a/images/managed-team-3.svg +++ b/images/managed-team-3.svg @@ -6,16 +6,16 @@ - + - - - - - - + + + + + + 4b078 diff --git a/images/merging-workflows-1.svg b/images/merging-workflows-1.svg index 03bb373..86a3135 100644 --- a/images/merging-workflows-1.svg +++ b/images/merging-workflows-1.svg @@ -3,13 +3,13 @@ merging workflows 1 - + - + - - - + + + C1 diff --git a/images/merging-workflows-2.svg b/images/merging-workflows-2.svg index 5a6c260..53d9727 100644 --- a/images/merging-workflows-2.svg +++ b/images/merging-workflows-2.svg @@ -5,13 +5,13 @@ - + - + - - - + + + C1 diff --git a/images/merging-workflows-3.svg b/images/merging-workflows-3.svg index 3a82d76..ea1e5be 100644 --- a/images/merging-workflows-3.svg +++ b/images/merging-workflows-3.svg @@ -3,11 +3,11 @@ merging workflows 3 - + - - - + + + C1 diff --git a/images/merging-workflows-4.svg b/images/merging-workflows-4.svg index 3e6d221..740b314 100644 --- a/images/merging-workflows-4.svg +++ b/images/merging-workflows-4.svg @@ -3,12 +3,12 @@ merging workflows 4 - + - - - + + + C1 diff --git a/images/merging-workflows-5.svg b/images/merging-workflows-5.svg index 1d9e73d..2cc5123 100644 --- a/images/merging-workflows-5.svg +++ b/images/merging-workflows-5.svg @@ -3,12 +3,12 @@ merging workflows 5 - + - - - + + + C1 diff --git a/images/perils-of-rebasing-1.svg b/images/perils-of-rebasing-1.svg index 60cabd1..4695c1b 100644 --- a/images/perils-of-rebasing-1.svg +++ b/images/perils-of-rebasing-1.svg @@ -1,11 +1,11 @@ perils of rebasing 1 - - + + - - + + C1 diff --git a/images/perils-of-rebasing-2.svg b/images/perils-of-rebasing-2.svg index 1df0772..741037e 100644 --- a/images/perils-of-rebasing-2.svg +++ b/images/perils-of-rebasing-2.svg @@ -2,17 +2,17 @@ perils of rebasing 2 - - - + + + - - - - + + + + - - + + C1 diff --git a/images/perils-of-rebasing-3.svg b/images/perils-of-rebasing-3.svg index 2ead058..79599eb 100644 --- a/images/perils-of-rebasing-3.svg +++ b/images/perils-of-rebasing-3.svg @@ -2,19 +2,19 @@ perils of rebasing 3 - - - - + + + + - - - - - + + + + + - - + + C1 diff --git a/images/perils-of-rebasing-4.svg b/images/perils-of-rebasing-4.svg index 2318bee..66e9505 100644 --- a/images/perils-of-rebasing-4.svg +++ b/images/perils-of-rebasing-4.svg @@ -2,20 +2,20 @@ perils of rebasing 4 - - - - + + + + - - - - - + + + + + - + - + C1 diff --git a/images/perils-of-rebasing-5.svg b/images/perils-of-rebasing-5.svg index 0f7af27..8b2573a 100644 --- a/images/perils-of-rebasing-5.svg +++ b/images/perils-of-rebasing-5.svg @@ -2,16 +2,16 @@ perils of rebasing 5 - - - - + + + + - - - + + + - + C1 diff --git a/images/public-small-1.svg b/images/public-small-1.svg index 650de1d..7bd3372 100644 --- a/images/public-small-1.svg +++ b/images/public-small-1.svg @@ -3,13 +3,13 @@ public small 1 - + - - - - - + + + + + 4b078 diff --git a/images/public-small-2.svg b/images/public-small-2.svg index 02e0733..0e30e58 100644 --- a/images/public-small-2.svg +++ b/images/public-small-2.svg @@ -3,13 +3,13 @@ public small 2 - + - - - - - + + + + + 4b078 diff --git a/images/public-small-3.svg b/images/public-small-3.svg index 54d3772..920b528 100644 --- a/images/public-small-3.svg +++ b/images/public-small-3.svg @@ -3,15 +3,15 @@ public small 3 - - - + + + - - - - - + + + + + 4b078 diff --git a/images/rebasing-1.svg b/images/rebasing-1.svg index a828db3..782a960 100644 --- a/images/rebasing-1.svg +++ b/images/rebasing-1.svg @@ -3,10 +3,10 @@ rebasing 1 - + - - + + 0b743 diff --git a/images/rebasing-2.svg b/images/rebasing-2.svg index 669f2f8..ba9bb4e 100644 --- a/images/rebasing-2.svg +++ b/images/rebasing-2.svg @@ -4,10 +4,10 @@ - + - - + + 0b743 diff --git a/images/remote-branches-1.svg b/images/remote-branches-1.svg index 749d22e..4b8953e 100644 --- a/images/remote-branches-1.svg +++ b/images/remote-branches-1.svg @@ -3,11 +3,11 @@ remote branches 1 - + - - + + 0b743 diff --git a/images/remote-branches-2.svg b/images/remote-branches-2.svg index fa6c17f..d00db40 100644 --- a/images/remote-branches-2.svg +++ b/images/remote-branches-2.svg @@ -5,13 +5,13 @@ - + - - + + 0b743 diff --git a/images/remote-branches-3.svg b/images/remote-branches-3.svg index b0f3e4a..b65d476 100644 --- a/images/remote-branches-3.svg +++ b/images/remote-branches-3.svg @@ -5,15 +5,15 @@ - + - + - + 0b743 diff --git a/images/remote-branches-4.svg b/images/remote-branches-4.svg index 338df1b..843ff41 100644 --- a/images/remote-branches-4.svg +++ b/images/remote-branches-4.svg @@ -5,17 +5,17 @@ - + - - + + - + - + 0b743 diff --git a/images/remote-branches-5.svg b/images/remote-branches-5.svg index c73aeda..a7c272b 100644 --- a/images/remote-branches-5.svg +++ b/images/remote-branches-5.svg @@ -5,18 +5,18 @@ - - + + - - + + - + - + 0b743 diff --git a/images/replace1.svg b/images/replace1.svg index be2c5a8..493c079 100644 --- a/images/replace1.svg +++ b/images/replace1.svg @@ -1,11 +1,11 @@ replace1 - - - - - + + + + + ef989 diff --git a/images/replace2.svg b/images/replace2.svg index 3f24ed8..274e4df 100644 --- a/images/replace2.svg +++ b/images/replace2.svg @@ -1,12 +1,12 @@ replace2 - - - - - - + + + + + + ef989 diff --git a/images/replace3.svg b/images/replace3.svg index 433d26d..bd00710 100644 --- a/images/replace3.svg +++ b/images/replace3.svg @@ -1,13 +1,13 @@ replace3 - - - - - - - + + + + + + + 622e8 diff --git a/images/replace4.svg b/images/replace4.svg index 88c63d1..5437940 100644 --- a/images/replace4.svg +++ b/images/replace4.svg @@ -1,15 +1,15 @@ replace4 - + - - - - - - - + + + + + + + ef989 diff --git a/images/replace5.svg b/images/replace5.svg index 0647849..a14e279 100644 --- a/images/replace5.svg +++ b/images/replace5.svg @@ -1,14 +1,14 @@ replace5 - - - - - - - - + + + + + + + + master diff --git a/images/rerere1.svg b/images/rerere1.svg index c3ff928..13672ee 100644 --- a/images/rerere1.svg +++ b/images/rerere1.svg @@ -3,8 +3,8 @@ rerere1 - - + + master diff --git a/images/rerere2.svg b/images/rerere2.svg index 7454e92..660f7c3 100644 --- a/images/rerere2.svg +++ b/images/rerere2.svg @@ -3,9 +3,9 @@ rerere2 - - - + + + hello world diff --git a/images/rerere3.svg b/images/rerere3.svg index 9d78ac6..017b00f 100644 --- a/images/rerere3.svg +++ b/images/rerere3.svg @@ -3,13 +3,13 @@ rerere3 - - + + - + - - + + master diff --git a/images/reset-checkout.svg b/images/reset-checkout.svg index 5ade9b8..24eeb45 100644 --- a/images/reset-checkout.svg +++ b/images/reset-checkout.svg @@ -2,17 +2,17 @@ reset checkout - - - + + + - - - + + + - - - + + + commit A diff --git a/images/reset-ex1.svg b/images/reset-ex1.svg index 246fe98..a5f29d9 100644 --- a/images/reset-ex1.svg +++ b/images/reset-ex1.svg @@ -1,7 +1,7 @@ reset ex1 - + Index diff --git a/images/reset-ex2.svg b/images/reset-ex2.svg index 5f885e2..06dce0c 100644 --- a/images/reset-ex2.svg +++ b/images/reset-ex2.svg @@ -1,7 +1,7 @@ reset ex2 - + HEAD diff --git a/images/reset-ex3.svg b/images/reset-ex3.svg index 09bd0f0..cb603be 100644 --- a/images/reset-ex3.svg +++ b/images/reset-ex3.svg @@ -1,8 +1,8 @@ reset ex3 - - + + HEAD diff --git a/images/reset-ex4.svg b/images/reset-ex4.svg index 27ccdc8..8769aab 100644 --- a/images/reset-ex4.svg +++ b/images/reset-ex4.svg @@ -1,8 +1,8 @@ reset ex4 - - + + Index diff --git a/images/reset-ex5.svg b/images/reset-ex5.svg index 97655a1..474f87a 100644 --- a/images/reset-ex5.svg +++ b/images/reset-ex5.svg @@ -1,8 +1,8 @@ reset ex5 - - + + Index diff --git a/images/reset-ex6.svg b/images/reset-ex6.svg index f9ec079..2efccc9 100644 --- a/images/reset-ex6.svg +++ b/images/reset-ex6.svg @@ -1,7 +1,7 @@ reset ex6 - + diff --git a/images/reset-hard.svg b/images/reset-hard.svg index bad1ff4..6201767 100644 --- a/images/reset-hard.svg +++ b/images/reset-hard.svg @@ -1,9 +1,9 @@ reset hard - + - + HEAD diff --git a/images/reset-mixed.svg b/images/reset-mixed.svg index 8351ada..c890683 100644 --- a/images/reset-mixed.svg +++ b/images/reset-mixed.svg @@ -1,9 +1,9 @@ reset mixed - + - + HEAD diff --git a/images/reset-path1.svg b/images/reset-path1.svg index 3726907..f3d5055 100644 --- a/images/reset-path1.svg +++ b/images/reset-path1.svg @@ -1,8 +1,8 @@ reset path1 - - + + Index diff --git a/images/reset-path2.svg b/images/reset-path2.svg index f2c3260..87d8387 100644 --- a/images/reset-path2.svg +++ b/images/reset-path2.svg @@ -1,8 +1,8 @@ reset path2 - - + + Index diff --git a/images/reset-path3.svg b/images/reset-path3.svg index 1fc2a92..8e92f52 100644 --- a/images/reset-path3.svg +++ b/images/reset-path3.svg @@ -1,7 +1,7 @@ reset path3 - + diff --git a/images/reset-soft.svg b/images/reset-soft.svg index 59864e3..d63e711 100644 --- a/images/reset-soft.svg +++ b/images/reset-soft.svg @@ -1,9 +1,9 @@ reset soft - + - + file.txtv1 diff --git a/images/reset-squash-r1.svg b/images/reset-squash-r1.svg index 08f33b2..49f7d29 100644 --- a/images/reset-squash-r1.svg +++ b/images/reset-squash-r1.svg @@ -1,7 +1,7 @@ reset squash r1 - + diff --git a/images/reset-squash-r2.svg b/images/reset-squash-r2.svg index d1d859e..b5ba222 100644 --- a/images/reset-squash-r2.svg +++ b/images/reset-squash-r2.svg @@ -1,9 +1,9 @@ reset squash r2 - + - + 38eb946 diff --git a/images/reset-squash-r3.svg b/images/reset-squash-r3.svg index d50559f..ebeea71 100644 --- a/images/reset-squash-r3.svg +++ b/images/reset-squash-r3.svg @@ -1,9 +1,9 @@ reset squash r3 - - - + + + file-a.txt v1 diff --git a/images/reset-start.svg b/images/reset-start.svg index bab7a58..060870e 100644 --- a/images/reset-start.svg +++ b/images/reset-start.svg @@ -1,7 +1,7 @@ reset start - + diff --git a/images/reset-workflow.svg b/images/reset-workflow.svg index 26aae61..2cfa6b5 100644 --- a/images/reset-workflow.svg +++ b/images/reset-workflow.svg @@ -1,7 +1,7 @@ reset workflow - + Index diff --git a/images/small-team-1.svg b/images/small-team-1.svg index ae4271d..17ed5fb 100644 --- a/images/small-team-1.svg +++ b/images/small-team-1.svg @@ -4,8 +4,8 @@ - - + + 4b078 diff --git a/images/small-team-2.svg b/images/small-team-2.svg index 0f0a625..94769b4 100644 --- a/images/small-team-2.svg +++ b/images/small-team-2.svg @@ -5,8 +5,8 @@ - - + + 4b078 diff --git a/images/small-team-3.svg b/images/small-team-3.svg index 501d904..0ae1a8c 100644 --- a/images/small-team-3.svg +++ b/images/small-team-3.svg @@ -5,8 +5,8 @@ - - + + 4b078 diff --git a/images/small-team-4.svg b/images/small-team-4.svg index e83cc1d..816ada2 100644 --- a/images/small-team-4.svg +++ b/images/small-team-4.svg @@ -6,9 +6,9 @@ - - - + + + 4b078 diff --git a/images/small-team-5.svg b/images/small-team-5.svg index fa5306f..be7cd60 100644 --- a/images/small-team-5.svg +++ b/images/small-team-5.svg @@ -8,9 +8,9 @@ - - - + + + 4b078 diff --git a/images/small-team-6.svg b/images/small-team-6.svg index 354777f..0da52fb 100644 --- a/images/small-team-6.svg +++ b/images/small-team-6.svg @@ -8,10 +8,10 @@ - - - - + + + + 4b078 diff --git a/images/small-team-7.svg b/images/small-team-7.svg index dc01c6e..cc6f31b 100644 --- a/images/small-team-7.svg +++ b/images/small-team-7.svg @@ -8,10 +8,10 @@ - - - - + + + + 4b078 diff --git a/images/topic-branches-1.svg b/images/topic-branches-1.svg index 873cb9b..c7fc561 100644 --- a/images/topic-branches-1.svg +++ b/images/topic-branches-1.svg @@ -1,23 +1,23 @@ topic branches 1 - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + C0 diff --git a/images/topic-branches-2.svg b/images/topic-branches-2.svg index e4e5f06..d1085cf 100644 --- a/images/topic-branches-2.svg +++ b/images/topic-branches-2.svg @@ -1,21 +1,21 @@ topic branches 2 - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + C0 diff --git a/images/two-branches.svg b/images/two-branches.svg index 7d842b8..a0d6990 100644 --- a/images/two-branches.svg +++ b/images/two-branches.svg @@ -3,8 +3,8 @@ Two branch pointers into the commit history - - + + 98ca9 diff --git a/images/undomerge-reset.svg b/images/undomerge-reset.svg index aa5b6c5..fce73e4 100644 --- a/images/undomerge-reset.svg +++ b/images/undomerge-reset.svg @@ -3,14 +3,14 @@ undomerge reset - + - - - - + + + + C1 diff --git a/images/undomerge-revert.svg b/images/undomerge-revert.svg index df44a57..ee2ce3a 100644 --- a/images/undomerge-revert.svg +++ b/images/undomerge-revert.svg @@ -3,15 +3,15 @@ undomerge revert - + - + - - - + + + C1 diff --git a/images/undomerge-revert2.svg b/images/undomerge-revert2.svg index 388fb33..7388ca7 100644 --- a/images/undomerge-revert2.svg +++ b/images/undomerge-revert2.svg @@ -3,18 +3,18 @@ undomerge revert2 - + - + - - - - + + + + C1 diff --git a/images/undomerge-revert3.svg b/images/undomerge-revert3.svg index 5389c01..147ed29 100644 --- a/images/undomerge-revert3.svg +++ b/images/undomerge-revert3.svg @@ -3,19 +3,19 @@ undomerge revert3 - + - + - + - - - + + + C1 diff --git a/images/undomerge-start.svg b/images/undomerge-start.svg index 93d2992..719ed5d 100644 --- a/images/undomerge-start.svg +++ b/images/undomerge-start.svg @@ -3,14 +3,14 @@ undomerge start - + - - - - + + + + C1 From 5666ca1c9895bb8ed4f37795a83f549cdab62a4e Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Fri, 21 Aug 2026 07:17:14 -0700 Subject: [PATCH 13/15] Fix arrow tips --- bin/render-figures.rb | 11 ++++++----- figures/basic-branching-4.json | 2 +- figures/basic-rebase-2.json | 5 +++-- images/advance-master.svg | 4 ++-- images/advance-testing.svg | 6 +++--- images/basic-branching-1.svg | 4 ++-- images/basic-branching-2.svg | 4 ++-- images/basic-branching-3.svg | 6 +++--- images/basic-branching-4.svg | 8 ++++---- images/basic-branching-5.svg | 6 +++--- images/basic-branching-6.svg | 8 ++++---- images/basic-merging-1.svg | 8 ++++---- images/basic-merging-2.svg | 10 +++++----- images/basic-rebase-1.svg | 6 +++--- images/basic-rebase-2.svg | 11 ++++++----- images/basic-rebase-3.svg | 8 ++++---- images/basic-rebase-4.svg | 8 ++++---- images/branch-and-history.svg | 4 ++-- images/checkout-master.svg | 6 +++--- images/clean.svg | 2 +- images/commits-and-parents.svg | 4 ++-- images/double-dot.svg | 10 +++++----- images/head-to-master.svg | 4 ++-- images/head-to-testing.svg | 4 ++-- images/interesting-rebase-1.svg | 12 ++++++------ images/interesting-rebase-2.svg | 16 ++++++++-------- images/interesting-rebase-3.svg | 14 +++++++------- images/interesting-rebase-4.svg | 18 +++++++++--------- images/interesting-rebase-5.svg | 14 +++++++------- images/large-merges-1.svg | 12 ++++++------ images/large-merges-2.svg | 18 +++++++++--------- images/lr-branches-1.svg | 12 ++++++------ images/lr-branches-2.svg | 8 ++++---- images/managed-team-1.svg | 6 +++--- images/managed-team-2.svg | 14 +++++++------- images/managed-team-3.svg | 16 ++++++++-------- images/merging-workflows-1.svg | 8 ++++---- images/merging-workflows-2.svg | 12 ++++++------ images/merging-workflows-3.svg | 6 +++--- images/merging-workflows-4.svg | 8 ++++---- images/merging-workflows-5.svg | 8 ++++---- images/perils-of-rebasing-1.svg | 2 +- images/perils-of-rebasing-2.svg | 6 +++--- images/perils-of-rebasing-3.svg | 6 +++--- images/perils-of-rebasing-4.svg | 8 ++++---- images/perils-of-rebasing-5.svg | 6 +++--- images/public-small-1.svg | 6 +++--- images/public-small-2.svg | 6 +++--- images/public-small-3.svg | 6 +++--- images/rebasing-1.svg | 6 +++--- images/rebasing-2.svg | 8 ++++---- images/remote-branches-1.svg | 8 ++++---- images/remote-branches-2.svg | 16 ++++++++-------- images/remote-branches-3.svg | 20 ++++++++++---------- images/remote-branches-4.svg | 20 ++++++++++---------- images/remote-branches-5.svg | 20 ++++++++++---------- images/replace4.svg | 2 +- images/rerere1.svg | 4 ++-- images/rerere2.svg | 4 ++-- images/rerere3.svg | 8 ++++---- images/reset-checkout.svg | 6 +++--- images/reset-ex6.svg | 2 +- images/reset-hard.svg | 2 +- images/reset-mixed.svg | 2 +- images/reset-path3.svg | 2 +- images/reset-soft.svg | 2 +- images/reset-squash-r1.svg | 2 +- images/reset-squash-r2.svg | 2 +- images/reset-start.svg | 2 +- images/small-team-1.svg | 6 +++--- images/small-team-2.svg | 8 ++++---- images/small-team-3.svg | 8 ++++---- images/small-team-4.svg | 10 +++++----- images/small-team-5.svg | 14 +++++++------- images/small-team-6.svg | 14 +++++++------- images/small-team-7.svg | 14 +++++++------- images/smudge.svg | 8 ++++---- images/two-branches.svg | 4 ++-- images/undomerge-reset.svg | 10 +++++----- images/undomerge-revert.svg | 12 ++++++------ images/undomerge-revert2.svg | 16 ++++++++-------- images/undomerge-revert3.svg | 18 +++++++++--------- images/undomerge-start.svg | 10 +++++----- 83 files changed, 345 insertions(+), 342 deletions(-) diff --git a/bin/render-figures.rb b/bin/render-figures.rb index 1b97d84..929d034 100755 --- a/bin/render-figures.rb +++ b/bin/render-figures.rb @@ -111,13 +111,14 @@ def self.round(v) end # Baked-arrowhead path, matching existing SVG idiom. - # Horizontal left-pointing arrow: shaft starts at (x1,y), tip at x2 < x1 - # m{tip_x} {cy}h{shaft}v1h-{shaft}v4l-9-4.5 9-4.5z + # Horizontal left-pointing arrow: shaft starts at (x1,y), apex at to_cx < x1 + # m{base_x} {cy}h{shaft}v1h-{shaft}v4l-9-4.5 9-4.5z def self.arrow_h(from_cx, to_cx, cy) - # Arrowhead at left (to_cx < from_cx): tip at to_cx, shaft extends right - tip = round(to_cx) + # Arrowhead at left (to_cx < from_cx): apex at to_cx (box edge), base 9px + # further out so the triangle sits outside the target box, not under it. + base = round(to_cx + 9) shaft = round(from_cx - to_cx - 9) # 9px for arrowhead - "m#{tip} #{round(cy)}h#{shaft}v1h-#{shaft}v4l-9-4.5 9-4.5z" + "m#{base} #{round(cy)}h#{shaft}v1h-#{shaft}v4l-9-4.5 9-4.5z" end # Vertical downward-pointing arrow: tip at (cx, to_cy), shaft from (cx, from_cy) diff --git a/figures/basic-branching-4.json b/figures/basic-branching-4.json index 4fd20e8..5ecd50b 100644 --- a/figures/basic-branching-4.json +++ b/figures/basic-branching-4.json @@ -73,7 +73,7 @@ { "from": "c2", "to": "c1" }, { "from": "c4", "to": "c2" }, { "from": "c3", "to": "c2", "route": "diagonal" }, - { "from": "master", "to": "c4", "arrow": "forward" }, + { "from": "master", "to": "c2", "arrow": "forward" }, { "from": "hotfix", "to": "c4", "arrow": "forward" }, { "from": "iss53", "to": "c3", "arrow": "forward" } ] diff --git a/figures/basic-rebase-2.json b/figures/basic-rebase-2.json index 6ec3c27..2228063 100644 --- a/figures/basic-rebase-2.json +++ b/figures/basic-rebase-2.json @@ -78,8 +78,9 @@ { "from": "c2", "to": "c1" }, { "from": "c3", "to": "c2" }, { "from": "c4", "to": "c2", "route": "diagonal" }, + { "from": "c5", "to": "c3" }, { "from": "c5", "to": "c4", "route": "diagonal" }, - { "from": "experiment", "to": "c5", "arrow": "forward" }, - { "from": "master", "to": "c4", "arrow": "forward" } + { "from": "experiment", "to": "c4", "arrow": "forward" }, + { "from": "master", "to": "c5", "arrow": "forward" } ] } diff --git a/images/advance-master.svg b/images/advance-master.svg index 823864f..b1d2b17 100644 --- a/images/advance-master.svg +++ b/images/advance-master.svg @@ -1,8 +1,8 @@ advance master - - + + diff --git a/images/advance-testing.svg b/images/advance-testing.svg index 8a524e6..e3e0893 100644 --- a/images/advance-testing.svg +++ b/images/advance-testing.svg @@ -1,9 +1,9 @@ advance testing - - - + + + diff --git a/images/basic-branching-1.svg b/images/basic-branching-1.svg index 3b2550b..c61615d 100644 --- a/images/basic-branching-1.svg +++ b/images/basic-branching-1.svg @@ -1,8 +1,8 @@ A simple commit history - - + + diff --git a/images/basic-branching-2.svg b/images/basic-branching-2.svg index b4efc63..5c3806c 100644 --- a/images/basic-branching-2.svg +++ b/images/basic-branching-2.svg @@ -1,8 +1,8 @@ Creating a new branch pointer - - + + diff --git a/images/basic-branching-3.svg b/images/basic-branching-3.svg index d454e1c..8853b3a 100644 --- a/images/basic-branching-3.svg +++ b/images/basic-branching-3.svg @@ -1,9 +1,9 @@ basic branching 3 - - - + + + diff --git a/images/basic-branching-4.svg b/images/basic-branching-4.svg index fdc9479..a7fbbb8 100644 --- a/images/basic-branching-4.svg +++ b/images/basic-branching-4.svg @@ -1,11 +1,11 @@ basic branching 4 - - - + + + - + diff --git a/images/basic-branching-5.svg b/images/basic-branching-5.svg index 060c20d..0998f16 100644 --- a/images/basic-branching-5.svg +++ b/images/basic-branching-5.svg @@ -1,9 +1,9 @@ basic branching 5 - - - + + + diff --git a/images/basic-branching-6.svg b/images/basic-branching-6.svg index 288319d..c5c1a9d 100644 --- a/images/basic-branching-6.svg +++ b/images/basic-branching-6.svg @@ -1,11 +1,11 @@ basic branching 6 - - - + + + - + diff --git a/images/basic-merging-1.svg b/images/basic-merging-1.svg index 970abe6..4e8d4c4 100644 --- a/images/basic-merging-1.svg +++ b/images/basic-merging-1.svg @@ -1,11 +1,11 @@ basic merging 1 - - - + + + - + diff --git a/images/basic-merging-2.svg b/images/basic-merging-2.svg index 79db4ac..3a91183 100644 --- a/images/basic-merging-2.svg +++ b/images/basic-merging-2.svg @@ -1,12 +1,12 @@ A merge commit - - - + + + - - + + diff --git a/images/basic-rebase-1.svg b/images/basic-rebase-1.svg index 6458df3..edb62b8 100644 --- a/images/basic-rebase-1.svg +++ b/images/basic-rebase-1.svg @@ -1,9 +1,9 @@ basic rebase 1 - - - + + + diff --git a/images/basic-rebase-2.svg b/images/basic-rebase-2.svg index 572a437..5b7e7d0 100644 --- a/images/basic-rebase-2.svg +++ b/images/basic-rebase-2.svg @@ -1,13 +1,14 @@ basic rebase 2 - - - + + + + - - + + C0 diff --git a/images/basic-rebase-3.svg b/images/basic-rebase-3.svg index 729e0bf..c2fa19f 100644 --- a/images/basic-rebase-3.svg +++ b/images/basic-rebase-3.svg @@ -1,11 +1,11 @@ basic rebase 3 - - - + + + - + diff --git a/images/basic-rebase-4.svg b/images/basic-rebase-4.svg index 3ffebbc..6076810 100644 --- a/images/basic-rebase-4.svg +++ b/images/basic-rebase-4.svg @@ -1,10 +1,10 @@ basic rebase 4 - - - - + + + + diff --git a/images/branch-and-history.svg b/images/branch-and-history.svg index b440712..86257e0 100644 --- a/images/branch-and-history.svg +++ b/images/branch-and-history.svg @@ -1,8 +1,8 @@ branch and history - - + + diff --git a/images/checkout-master.svg b/images/checkout-master.svg index 289b596..579be4d 100644 --- a/images/checkout-master.svg +++ b/images/checkout-master.svg @@ -1,9 +1,9 @@ checkout master - - - + + + diff --git a/images/clean.svg b/images/clean.svg index f0b6a45..78b41b0 100644 --- a/images/clean.svg +++ b/images/clean.svg @@ -4,7 +4,7 @@ - + fileA.txt diff --git a/images/commits-and-parents.svg b/images/commits-and-parents.svg index 955453a..363bc61 100644 --- a/images/commits-and-parents.svg +++ b/images/commits-and-parents.svg @@ -1,8 +1,8 @@ commits and parents - - + + diff --git a/images/double-dot.svg b/images/double-dot.svg index 6665b09..7cd989d 100644 --- a/images/double-dot.svg +++ b/images/double-dot.svg @@ -1,11 +1,11 @@ double dot - - - - - + + + + + diff --git a/images/head-to-master.svg b/images/head-to-master.svg index 1863e18..b5380ae 100644 --- a/images/head-to-master.svg +++ b/images/head-to-master.svg @@ -1,8 +1,8 @@ head to master - - + + diff --git a/images/head-to-testing.svg b/images/head-to-testing.svg index 600cf91..aa93d48 100644 --- a/images/head-to-testing.svg +++ b/images/head-to-testing.svg @@ -1,8 +1,8 @@ head to testing - - + + diff --git a/images/interesting-rebase-1.svg b/images/interesting-rebase-1.svg index 1cd9357..565755c 100644 --- a/images/interesting-rebase-1.svg +++ b/images/interesting-rebase-1.svg @@ -1,14 +1,14 @@ interesting rebase 1 - - - + + + - - + + - + diff --git a/images/interesting-rebase-2.svg b/images/interesting-rebase-2.svg index 94282e2..4e55bb0 100644 --- a/images/interesting-rebase-2.svg +++ b/images/interesting-rebase-2.svg @@ -1,16 +1,16 @@ interesting rebase 2 - - - - - + + + + + - - + + - + diff --git a/images/interesting-rebase-3.svg b/images/interesting-rebase-3.svg index e615e02..a5edf7a 100644 --- a/images/interesting-rebase-3.svg +++ b/images/interesting-rebase-3.svg @@ -1,14 +1,14 @@ interesting rebase 3 - - - - - + + + + + - - + + diff --git a/images/interesting-rebase-4.svg b/images/interesting-rebase-4.svg index 8b3f0fd..956365e 100644 --- a/images/interesting-rebase-4.svg +++ b/images/interesting-rebase-4.svg @@ -1,17 +1,17 @@ interesting rebase 4 - - - - - + + + + + - - + + - - + + diff --git a/images/interesting-rebase-5.svg b/images/interesting-rebase-5.svg index f8db7aa..7c81af7 100644 --- a/images/interesting-rebase-5.svg +++ b/images/interesting-rebase-5.svg @@ -1,14 +1,14 @@ interesting rebase 5 - - - - - + + + + + - - + + diff --git a/images/large-merges-1.svg b/images/large-merges-1.svg index a030d34..17d2fbb 100644 --- a/images/large-merges-1.svg +++ b/images/large-merges-1.svg @@ -1,22 +1,22 @@ large merges 1 - + - + - + - + - + - + diff --git a/images/large-merges-2.svg b/images/large-merges-2.svg index 0dda4ad..0b0b117 100644 --- a/images/large-merges-2.svg +++ b/images/large-merges-2.svg @@ -1,29 +1,29 @@ large merges 2 - + - + - + - + - + - + - + - - + + diff --git a/images/lr-branches-1.svg b/images/lr-branches-1.svg index 930da2c..37e4903 100644 --- a/images/lr-branches-1.svg +++ b/images/lr-branches-1.svg @@ -1,12 +1,12 @@ lr branches 1 - - - - - - + + + + + + diff --git a/images/lr-branches-2.svg b/images/lr-branches-2.svg index 4a8a8cb..45d882d 100644 --- a/images/lr-branches-2.svg +++ b/images/lr-branches-2.svg @@ -2,11 +2,11 @@ lr branches 2 - - - + + + - + C1 diff --git a/images/managed-team-1.svg b/images/managed-team-1.svg index fed308f..d13fa41 100644 --- a/images/managed-team-1.svg +++ b/images/managed-team-1.svg @@ -1,10 +1,10 @@ managed team 1 - - + + - + diff --git a/images/managed-team-2.svg b/images/managed-team-2.svg index 1793161..d740381 100644 --- a/images/managed-team-2.svg +++ b/images/managed-team-2.svg @@ -1,14 +1,14 @@ managed team 2 - - - - + + + + - - - + + + diff --git a/images/managed-team-3.svg b/images/managed-team-3.svg index b7e0769..0d90a9e 100644 --- a/images/managed-team-3.svg +++ b/images/managed-team-3.svg @@ -1,15 +1,15 @@ managed team 3 - - - - - + + + + + - - - + + + diff --git a/images/merging-workflows-1.svg b/images/merging-workflows-1.svg index 86a3135..97c8720 100644 --- a/images/merging-workflows-1.svg +++ b/images/merging-workflows-1.svg @@ -1,12 +1,12 @@ merging workflows 1 - - + + - + - + diff --git a/images/merging-workflows-2.svg b/images/merging-workflows-2.svg index 53d9727..2e277a4 100644 --- a/images/merging-workflows-2.svg +++ b/images/merging-workflows-2.svg @@ -1,14 +1,14 @@ merging workflows 2 - - - - + + + + - + - + diff --git a/images/merging-workflows-3.svg b/images/merging-workflows-3.svg index ea1e5be..d189e83 100644 --- a/images/merging-workflows-3.svg +++ b/images/merging-workflows-3.svg @@ -1,10 +1,10 @@ merging workflows 3 - - + + - + diff --git a/images/merging-workflows-4.svg b/images/merging-workflows-4.svg index 740b314..88da025 100644 --- a/images/merging-workflows-4.svg +++ b/images/merging-workflows-4.svg @@ -1,11 +1,11 @@ merging workflows 4 - - + + - - + + diff --git a/images/merging-workflows-5.svg b/images/merging-workflows-5.svg index 2cc5123..d1cbb99 100644 --- a/images/merging-workflows-5.svg +++ b/images/merging-workflows-5.svg @@ -1,11 +1,11 @@ merging workflows 5 - - + + - - + + diff --git a/images/perils-of-rebasing-1.svg b/images/perils-of-rebasing-1.svg index 4695c1b..79c189c 100644 --- a/images/perils-of-rebasing-1.svg +++ b/images/perils-of-rebasing-1.svg @@ -3,7 +3,7 @@ perils of rebasing 1 - + diff --git a/images/perils-of-rebasing-2.svg b/images/perils-of-rebasing-2.svg index 741037e..8532c85 100644 --- a/images/perils-of-rebasing-2.svg +++ b/images/perils-of-rebasing-2.svg @@ -1,16 +1,16 @@ perils of rebasing 2 - + - + - + diff --git a/images/perils-of-rebasing-3.svg b/images/perils-of-rebasing-3.svg index 79599eb..ca5613a 100644 --- a/images/perils-of-rebasing-3.svg +++ b/images/perils-of-rebasing-3.svg @@ -1,18 +1,18 @@ perils of rebasing 3 - + - + - + diff --git a/images/perils-of-rebasing-4.svg b/images/perils-of-rebasing-4.svg index 66e9505..5c0c154 100644 --- a/images/perils-of-rebasing-4.svg +++ b/images/perils-of-rebasing-4.svg @@ -1,20 +1,20 @@ perils of rebasing 4 - + - + - + - + diff --git a/images/perils-of-rebasing-5.svg b/images/perils-of-rebasing-5.svg index 8b2573a..ed5da28 100644 --- a/images/perils-of-rebasing-5.svg +++ b/images/perils-of-rebasing-5.svg @@ -1,16 +1,16 @@ perils of rebasing 5 - + - + - + diff --git a/images/public-small-1.svg b/images/public-small-1.svg index 7bd3372..bf8d760 100644 --- a/images/public-small-1.svg +++ b/images/public-small-1.svg @@ -1,10 +1,10 @@ public small 1 - - + + - + diff --git a/images/public-small-2.svg b/images/public-small-2.svg index 0e30e58..595734a 100644 --- a/images/public-small-2.svg +++ b/images/public-small-2.svg @@ -1,10 +1,10 @@ public small 2 - - + + - + diff --git a/images/public-small-3.svg b/images/public-small-3.svg index 920b528..579e4b2 100644 --- a/images/public-small-3.svg +++ b/images/public-small-3.svg @@ -1,12 +1,12 @@ public small 3 - - + + - + diff --git a/images/rebasing-1.svg b/images/rebasing-1.svg index 782a960..5c5c8e1 100644 --- a/images/rebasing-1.svg +++ b/images/rebasing-1.svg @@ -1,10 +1,10 @@ rebasing 1 - - + + - + diff --git a/images/rebasing-2.svg b/images/rebasing-2.svg index ba9bb4e..1896eb4 100644 --- a/images/rebasing-2.svg +++ b/images/rebasing-2.svg @@ -1,11 +1,11 @@ rebasing 2 - - - + + + - + diff --git a/images/remote-branches-1.svg b/images/remote-branches-1.svg index 4b8953e..0b61f54 100644 --- a/images/remote-branches-1.svg +++ b/images/remote-branches-1.svg @@ -1,11 +1,11 @@ remote branches 1 - - + + - - + + diff --git a/images/remote-branches-2.svg b/images/remote-branches-2.svg index d00db40..6eb8803 100644 --- a/images/remote-branches-2.svg +++ b/images/remote-branches-2.svg @@ -1,15 +1,15 @@ remote branches 2 - - - - + + + + - - - - + + + + diff --git a/images/remote-branches-3.svg b/images/remote-branches-3.svg index b65d476..5ab0ce0 100644 --- a/images/remote-branches-3.svg +++ b/images/remote-branches-3.svg @@ -1,18 +1,18 @@ remote branches 3 - - - - + + + + - - + + - - - - + + + + diff --git a/images/remote-branches-4.svg b/images/remote-branches-4.svg index 843ff41..6711e3d 100644 --- a/images/remote-branches-4.svg +++ b/images/remote-branches-4.svg @@ -1,20 +1,20 @@ remote branches 4 - - - - + + + + - - + + - - + + - - + + diff --git a/images/remote-branches-5.svg b/images/remote-branches-5.svg index a7c272b..37f6c0f 100644 --- a/images/remote-branches-5.svg +++ b/images/remote-branches-5.svg @@ -1,21 +1,21 @@ remote branches 5 - - - - + + + + - - + + - - + + - - + + diff --git a/images/replace4.svg b/images/replace4.svg index 5437940..36bb3b7 100644 --- a/images/replace4.svg +++ b/images/replace4.svg @@ -2,7 +2,7 @@ replace4 - + diff --git a/images/rerere1.svg b/images/rerere1.svg index 13672ee..6b8ffa5 100644 --- a/images/rerere1.svg +++ b/images/rerere1.svg @@ -1,8 +1,8 @@ rerere1 - - + + diff --git a/images/rerere2.svg b/images/rerere2.svg index 660f7c3..3871d67 100644 --- a/images/rerere2.svg +++ b/images/rerere2.svg @@ -1,8 +1,8 @@ rerere2 - - + + diff --git a/images/rerere3.svg b/images/rerere3.svg index 017b00f..7b8161e 100644 --- a/images/rerere3.svg +++ b/images/rerere3.svg @@ -1,13 +1,13 @@ rerere3 - - + + - + - + diff --git a/images/reset-checkout.svg b/images/reset-checkout.svg index 24eeb45..c80b106 100644 --- a/images/reset-checkout.svg +++ b/images/reset-checkout.svg @@ -1,15 +1,15 @@ reset checkout - + - + - + diff --git a/images/reset-ex6.svg b/images/reset-ex6.svg index 2efccc9..6f4cbbc 100644 --- a/images/reset-ex6.svg +++ b/images/reset-ex6.svg @@ -2,7 +2,7 @@ reset ex6 - + file.txtv2 diff --git a/images/reset-hard.svg b/images/reset-hard.svg index 6201767..e7523d0 100644 --- a/images/reset-hard.svg +++ b/images/reset-hard.svg @@ -2,7 +2,7 @@ reset hard - + diff --git a/images/reset-mixed.svg b/images/reset-mixed.svg index c890683..70927fd 100644 --- a/images/reset-mixed.svg +++ b/images/reset-mixed.svg @@ -2,7 +2,7 @@ reset mixed - + diff --git a/images/reset-path3.svg b/images/reset-path3.svg index 8e92f52..dc22341 100644 --- a/images/reset-path3.svg +++ b/images/reset-path3.svg @@ -2,7 +2,7 @@ reset path3 - + HEAD diff --git a/images/reset-soft.svg b/images/reset-soft.svg index d63e711..95b0a1b 100644 --- a/images/reset-soft.svg +++ b/images/reset-soft.svg @@ -2,7 +2,7 @@ reset soft - + diff --git a/images/reset-squash-r1.svg b/images/reset-squash-r1.svg index 49f7d29..1dc3a7d 100644 --- a/images/reset-squash-r1.svg +++ b/images/reset-squash-r1.svg @@ -2,7 +2,7 @@ reset squash r1 - + HEAD diff --git a/images/reset-squash-r2.svg b/images/reset-squash-r2.svg index b5ba222..88ed635 100644 --- a/images/reset-squash-r2.svg +++ b/images/reset-squash-r2.svg @@ -2,7 +2,7 @@ reset squash r2 - + diff --git a/images/reset-start.svg b/images/reset-start.svg index 060870e..174df76 100644 --- a/images/reset-start.svg +++ b/images/reset-start.svg @@ -2,7 +2,7 @@ reset start - + file.txtv1 diff --git a/images/small-team-1.svg b/images/small-team-1.svg index 17ed5fb..4d304ce 100644 --- a/images/small-team-1.svg +++ b/images/small-team-1.svg @@ -1,9 +1,9 @@ small team 1 - - - + + + diff --git a/images/small-team-2.svg b/images/small-team-2.svg index 94769b4..7a06b2f 100644 --- a/images/small-team-2.svg +++ b/images/small-team-2.svg @@ -1,10 +1,10 @@ small team 2 - - - - + + + + diff --git a/images/small-team-3.svg b/images/small-team-3.svg index 0ae1a8c..5b22fd0 100644 --- a/images/small-team-3.svg +++ b/images/small-team-3.svg @@ -1,10 +1,10 @@ small team 3 - - - - + + + + diff --git a/images/small-team-4.svg b/images/small-team-4.svg index 816ada2..8644b60 100644 --- a/images/small-team-4.svg +++ b/images/small-team-4.svg @@ -1,11 +1,11 @@ small team 4 - - - - - + + + + + diff --git a/images/small-team-5.svg b/images/small-team-5.svg index be7cd60..2784b3d 100644 --- a/images/small-team-5.svg +++ b/images/small-team-5.svg @@ -1,13 +1,13 @@ small team 5 - - - - - - - + + + + + + + diff --git a/images/small-team-6.svg b/images/small-team-6.svg index 0da52fb..13f2dab 100644 --- a/images/small-team-6.svg +++ b/images/small-team-6.svg @@ -1,13 +1,13 @@ small team 6 - - - - - - - + + + + + + + diff --git a/images/small-team-7.svg b/images/small-team-7.svg index cc6f31b..a6d0670 100644 --- a/images/small-team-7.svg +++ b/images/small-team-7.svg @@ -1,13 +1,13 @@ small team 7 - - - - - - - + + + + + + + diff --git a/images/smudge.svg b/images/smudge.svg index 2858a14..a9d10fc 100644 --- a/images/smudge.svg +++ b/images/smudge.svg @@ -1,10 +1,10 @@ smudge - - - - + + + + fileA.txt diff --git a/images/two-branches.svg b/images/two-branches.svg index a0d6990..6f0c5d3 100644 --- a/images/two-branches.svg +++ b/images/two-branches.svg @@ -1,8 +1,8 @@ Two branch pointers into the commit history - - + + diff --git a/images/undomerge-reset.svg b/images/undomerge-reset.svg index fce73e4..f432431 100644 --- a/images/undomerge-reset.svg +++ b/images/undomerge-reset.svg @@ -1,12 +1,12 @@ undomerge reset - - + + - - - + + + diff --git a/images/undomerge-revert.svg b/images/undomerge-revert.svg index ee2ce3a..ed88a84 100644 --- a/images/undomerge-revert.svg +++ b/images/undomerge-revert.svg @@ -1,14 +1,14 @@ undomerge revert - - + + - - - + + + - + diff --git a/images/undomerge-revert2.svg b/images/undomerge-revert2.svg index 7388ca7..7fe3c3c 100644 --- a/images/undomerge-revert2.svg +++ b/images/undomerge-revert2.svg @@ -1,16 +1,16 @@ undomerge revert2 - - + + - - - + + + - - - + + + diff --git a/images/undomerge-revert3.svg b/images/undomerge-revert3.svg index 147ed29..709ba77 100644 --- a/images/undomerge-revert3.svg +++ b/images/undomerge-revert3.svg @@ -1,18 +1,18 @@ undomerge revert3 - - + + - - - + + + - - - + + + - + diff --git a/images/undomerge-start.svg b/images/undomerge-start.svg index 719ed5d..e17bb09 100644 --- a/images/undomerge-start.svg +++ b/images/undomerge-start.svg @@ -1,12 +1,12 @@ undomerge start - - + + - - - + + + From d0c8e3b11fa1a96c690b0eabcfb82286328d4211 Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Fri, 21 Aug 2026 07:20:43 -0700 Subject: [PATCH 14/15] Add muted and double-headed arrow styles to figure renderer - edges support style: muted (thinner, lower-opacity) for secondary relationships, used for the pull fan-out in benevolent-dictator.json - edges support arrow: both for double-headed arrows, used in centralized_workflow.json Co-Authored-By: Claude Sonnet 5 --- bin/render-figures.rb | 74 ++++++++++++++++++++++++++++--- figures/_schema.json | 6 +++ figures/benevolent-dictator.json | 6 ++- figures/centralized_workflow.json | 6 +-- images/benevolent-dictator.svg | 4 ++ images/centralized_workflow.svg | 6 +-- 6 files changed, 88 insertions(+), 14 deletions(-) diff --git a/bin/render-figures.rb b/bin/render-figures.rb index 929d034..82bfd8f 100755 --- a/bin/render-figures.rb +++ b/bin/render-figures.rb @@ -149,16 +149,12 @@ def self.arrow_v_up(cx, from_cy, to_cy) # (x2,y2). Built from a unit direction vector and its perpendicular so the # shaft is an actual filled quad (not a zero-width line), matching the # orthogonal arrow idiom used elsewhere in this file. - def self.diagonal_arrow(x1, y1, x2, y2) + def self.diagonal_arrow(x1, y1, x2, y2, hsize: 9.0, wing: 4.5, half: 0.5) dx = x2 - x1; dy = y2 - y1 len = Math.sqrt(dx*dx + dy*dy) ux = dx / len; uy = dy / len px = -uy; py = ux # unit perpendicular - hsize = 9.0 # arrowhead length - wing = 4.5 # arrowhead half-width - half = 0.5 # shaft half-width - base_x = x2 - hsize * ux base_y = y2 - hsize * uy @@ -175,6 +171,34 @@ def self.diagonal_arrow(x1, y1, x2, y2) "L#{round(gx)} #{round(gy)} Z" end + # Double-headed diagonal (or horizontal/vertical, since either dx or dy + # may be 0) arrow: a shaft between two points, each end trimmed by an + # arrowhead with its apex at (x1,y1) and (x2,y2) respectively. + def self.diagonal_arrow_both(x1, y1, x2, y2, hsize: 9.0, wing: 4.5, half: 0.5) + dx = x2 - x1; dy = y2 - y1 + len = Math.sqrt(dx*dx + dy*dy) + ux = dx / len; uy = dy / len + px = -uy; py = ux # unit perpendicular + + base1_x = x1 + hsize * ux; base1_y = y1 + hsize * uy + base2_x = x2 - hsize * ux; base2_y = y2 - hsize * uy + + pts = [ + [x1, y1], + [base1_x + wing * px, base1_y + wing * py], + [base1_x + half * px, base1_y + half * py], + [base2_x + half * px, base2_y + half * py], + [base2_x + wing * px, base2_y + wing * py], + [x2, y2], + [base2_x - wing * px, base2_y - wing * py], + [base2_x - half * px, base2_y - half * py], + [base1_x - half * px, base1_y - half * py], + [base1_x - wing * px, base1_y - wing * py] + ] + + "M#{pts.map { |px2, py2| "#{round(px2)} #{round(py2)}" }.join(' L')} Z" + end + # Render a node box (pill or rect) with optional stroke. def self.node_box(n, pos) k = Palette.kind(n['kind']) @@ -393,12 +417,15 @@ def self.render(edge, positions) tp = positions.fetch(to_id) { raise "Edge refers to unknown node: #{to_id.inspect}" } route = edge['route'] || 'straight' arrow = edge['arrow'] || 'back' + muted = edge['style'] == 'muted' from_cx = fp[:x] + fp[:w] / 2.0 from_cy = fp[:y] + fp[:h] / 2.0 to_cx = tp[:x] + tp[:w] / 2.0 to_cy = tp[:y] + tp[:h] / 2.0 + return render_both(fp, tp, muted) if arrow == 'both' + case route when 'diagonal' # Connect edge of 'from' box to edge of 'to' box along the diagonal @@ -414,8 +441,13 @@ def self.render(edge, positions) t_to = [half_to_w / ux.abs, half_to_h / uy.abs].min rescue half_to_w x2 = to_cx - ux * t_to; y2 = to_cy - uy * t_to - d = SVG.diagonal_arrow(x1, y1, x2, y2) - %() + if muted + d = SVG.diagonal_arrow(x1, y1, x2, y2, hsize: 6.0, wing: 3.0, half: 0.35) + %() + else + d = SVG.diagonal_arrow(x1, y1, x2, y2) + %() + end when 'straight' # Determine primary direction: horizontal or vertical @@ -483,6 +515,34 @@ def self.render(edge, positions) %() end end + + # Double-headed arrow between the facing edges of the two boxes. Works for + # any relative position (horizontal, vertical, or diagonal) since the + # underlying arrow shape is direction-agnostic. + def self.render_both(fp, tp, muted) + from_cx = fp[:x] + fp[:w] / 2.0; from_cy = fp[:y] + fp[:h] / 2.0 + to_cx = tp[:x] + tp[:w] / 2.0; to_cy = tp[:y] + tp[:h] / 2.0 + + dx = to_cx - from_cx; dy = to_cy - from_cy + len = Math.sqrt(dx*dx + dy*dy) + ux = dx / len; uy = dy / len + + half_from_w = fp[:w] / 2.0; half_from_h = fp[:h] / 2.0 + t_from = ux.zero? ? half_from_h / uy.abs : (uy.zero? ? half_from_w / ux.abs : [half_from_w / ux.abs, half_from_h / uy.abs].min) + x1 = from_cx + ux * t_from; y1 = from_cy + uy * t_from + + half_to_w = tp[:w] / 2.0; half_to_h = tp[:h] / 2.0 + t_to = ux.zero? ? half_to_h / uy.abs : (uy.zero? ? half_to_w / ux.abs : [half_to_w / ux.abs, half_to_h / uy.abs].min) + x2 = to_cx - ux * t_to; y2 = to_cy - uy * t_to + + if muted + d = SVG.diagonal_arrow_both(x1, y1, x2, y2, hsize: 6.0, wing: 3.0, half: 0.35) + %() + else + d = SVG.diagonal_arrow_both(x1, y1, x2, y2) + %() + end + end end # --------------------------------------------------------------------------- diff --git a/figures/_schema.json b/figures/_schema.json index 9474c34..02c3cfa 100644 --- a/figures/_schema.json +++ b/figures/_schema.json @@ -119,6 +119,12 @@ "default": "back", "description": "Arrowhead placement. 'back' means the arrowhead is at the 'to' end pointing toward 'from' (the Git parent-pointing convention)." }, + "style": { + "type": "string", + "enum": ["normal", "muted"], + "default": "normal", + "description": "'muted' renders a thinner, lower-opacity arrow for secondary/background relationships (e.g. pull lines fanning out from a shared remote)." + }, "label": { "type": "string", "description": "Optional edge label." } } } diff --git a/figures/benevolent-dictator.json b/figures/benevolent-dictator.json index 2fc22c3..d6aac50 100644 --- a/figures/benevolent-dictator.json +++ b/figures/benevolent-dictator.json @@ -79,6 +79,10 @@ { "from": "lieutenant", "to": "dictator", "arrow": "forward" }, { "from": "lieutenant-2", "to": "dictator", "arrow": "forward", "route": "diagonal" }, { "from": "dictator", "to": "blessed", "arrow": "forward" }, - { "from": "blessed", "to": "developer-3", "arrow": "forward" } + { "from": "blessed", "to": "developer-3", "arrow": "forward" }, + { "from": "blessed", "to": "lieutenant", "arrow": "forward", "route": "diagonal", "style": "muted" }, + { "from": "blessed", "to": "lieutenant-2", "arrow": "forward", "route": "diagonal", "style": "muted" }, + { "from": "blessed", "to": "developer", "arrow": "forward", "route": "diagonal", "style": "muted" }, + { "from": "blessed", "to": "developer-2", "arrow": "forward", "route": "diagonal", "style": "muted" } ] } diff --git a/figures/centralized_workflow.json b/figures/centralized_workflow.json index a667057..89d9dbf 100644 --- a/figures/centralized_workflow.json +++ b/figures/centralized_workflow.json @@ -41,8 +41,8 @@ } ], "edges": [ - { "from": "shared", "to": "developer", "arrow": "forward" }, - { "from": "shared", "to": "developer-2", "arrow": "forward", "route": "diagonal" }, - { "from": "shared", "to": "developer-3", "arrow": "forward", "route": "diagonal" } + { "from": "shared", "to": "developer", "arrow": "both" }, + { "from": "shared", "to": "developer-2", "arrow": "both", "route": "diagonal" }, + { "from": "shared", "to": "developer-3", "arrow": "both", "route": "diagonal" } ] } diff --git a/images/benevolent-dictator.svg b/images/benevolent-dictator.svg index 8f3ecb2..1957a9d 100644 --- a/images/benevolent-dictator.svg +++ b/images/benevolent-dictator.svg @@ -8,6 +8,10 @@ + + + + lieutenant diff --git a/images/centralized_workflow.svg b/images/centralized_workflow.svg index 0a3ff89..3dc918c 100644 --- a/images/centralized_workflow.svg +++ b/images/centralized_workflow.svg @@ -1,9 +1,9 @@ centralized_workflow - - - + + + developer From f14378c11770a051c476e5c26bb79b0f40b59b81 Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Fri, 21 Aug 2026 08:19:46 -0700 Subject: [PATCH 15/15] Arrow fixup --- Rakefile | 35 ++ bin/render-figures.rb | 25 ++ figures/double-dot.json | 6 +- figures/managed-team-2.json | 29 +- figures/managed-team-3.json | 43 +- figures/merging-workflows-1.json | 4 +- figures/merging-workflows-2.json | 15 +- figures/merging-workflows-4.json | 1 + figures/merging-workflows-5.json | 5 +- figures/public-small-1.json | 18 +- figures/public-small-2.json | 18 +- figures/public-small-3.json | 20 +- figures/rebasing-1.json | 2 +- figures/rebasing-2.json | 2 +- figures/small-team-1.json | 7 +- figures/small-team-2.json | 8 +- figures/small-team-3.json | 7 +- figures/small-team-4.json | 5 +- figures/small-team-5.json | 8 +- figures/small-team-6.json | 11 +- figures/small-team-7.json | 11 +- figures/snapshots.json | 8 +- figures/topic-branches-1.json | 8 +- figures/topic-branches-2.json | 4 +- images/double-dot.svg | 6 +- images/managed-team-2.svg | 10 +- images/managed-team-3.svg | 17 +- images/merging-workflows-1.svg | 4 +- images/merging-workflows-2.svg | 17 +- images/merging-workflows-4.svg | 1 + images/merging-workflows-5.svg | 5 +- images/public-small-1.svg | 10 +- images/public-small-2.svg | 8 +- images/public-small-3.svg | 10 +- images/rebasing-1.svg | 2 +- images/rebasing-2.svg | 2 +- images/small-team-1.svg | 4 +- images/small-team-2.svg | 5 +- images/small-team-3.svg | 4 +- images/small-team-4.svg | 2 +- images/small-team-5.svg | 5 +- images/small-team-6.svg | 8 +- images/small-team-7.svg | 8 +- images/snapshots.svg | 5 + images/topic-branches-1.svg | 6 +- images/topic-branches-2.svg | 2 - tmp/figure-review.html | 690 +++++++++++++++++++++++++++++++ 47 files changed, 962 insertions(+), 169 deletions(-) create mode 100644 tmp/figure-review.html diff --git a/Rakefile b/Rakefile index 6c34101..e3bc070 100644 --- a/Rakefile +++ b/Rakefile @@ -183,6 +183,41 @@ namespace :figures do sh "ruby #{RENDERER} #{src}" end + desc 'Watch figures/*.json and re-render the corresponding SVG on change' + task :watch do + require 'json' + puts " Watching #{FIGURES_DIR} for changes (Ctrl-C to stop)..." + mtimes = {} + FIGURE_SOURCES.each { |f| mtimes[f] = File.mtime(f) } + + loop do + Dir.glob("#{FIGURES_DIR}/*.json").each do |f| + next if File.basename(f).start_with?('_') + prev = mtimes[f] + cur = File.mtime(f) + next if prev == cur + + mtimes[f] = cur + base = File.basename(f, '.json') + if prev.nil? + puts " + #{base}.json (new)" + else + puts " ~ #{base}.json changed" + end + + begin + JSON.parse(File.read(f)) + sh "ruby #{RENDERER} #{f}" + rescue JSON::ParserError => e + puts " ! #{base}.json: #{e.message}" + rescue => e + puts " ! #{base}.json render failed: #{e.message}" + end + end + sleep 0.5 + end + end + desc 'Rasterize images/*.svg (from figures/) to images/*.png at 3x via rsvg-convert' task :raster => :build do rsvg = `which rsvg-convert`.strip diff --git a/bin/render-figures.rb b/bin/render-figures.rb index 82bfd8f..b98eb3f 100755 --- a/bin/render-figures.rb +++ b/bin/render-figures.rb @@ -424,6 +424,7 @@ def self.render(edge, positions) to_cx = tp[:x] + tp[:w] / 2.0 to_cy = tp[:y] + tp[:h] / 2.0 + return render_none(fp, tp) if arrow == 'none' return render_both(fp, tp, muted) if arrow == 'both' case route @@ -516,6 +517,30 @@ def self.render(edge, positions) end end + # Plain connecting line between the facing edges of the two boxes, with no + # arrowhead at either end. Works for any relative position (horizontal, + # vertical, or diagonal) since it uses the same edge-intersection math as + # render_both. + def self.render_none(fp, tp) + from_cx = fp[:x] + fp[:w] / 2.0; from_cy = fp[:y] + fp[:h] / 2.0 + to_cx = tp[:x] + tp[:w] / 2.0; to_cy = tp[:y] + tp[:h] / 2.0 + + dx = to_cx - from_cx; dy = to_cy - from_cy + len = Math.sqrt(dx*dx + dy*dy) + ux = dx / len; uy = dy / len + + half_from_w = fp[:w] / 2.0; half_from_h = fp[:h] / 2.0 + t_from = ux.zero? ? half_from_h / uy.abs : (uy.zero? ? half_from_w / ux.abs : [half_from_w / ux.abs, half_from_h / uy.abs].min) + x1 = from_cx + ux * t_from; y1 = from_cy + uy * t_from + + half_to_w = tp[:w] / 2.0; half_to_h = tp[:h] / 2.0 + t_to = ux.zero? ? half_to_h / uy.abs : (uy.zero? ? half_to_w / ux.abs : [half_to_w / ux.abs, half_to_h / uy.abs].min) + x2 = to_cx - ux * t_to; y2 = to_cy - uy * t_to + + %() + end + # Double-headed arrow between the facing edges of the two boxes. Works for # any relative position (horizontal, vertical, or diagonal) since the # underlying arrow shape is direction-agnostic. diff --git a/figures/double-dot.json b/figures/double-dot.json index 5a3a562..718b824 100644 --- a/figures/double-dot.json +++ b/figures/double-dot.json @@ -72,9 +72,9 @@ { "from": "b", "to": "a" }, { "from": "e", "to": "b" }, { "from": "f", "to": "e" }, - { "from": "c", "to": "b" }, + { "from": "c", "to": "b", "route": "diagonal" }, { "from": "d", "to": "c" }, - { "from": "master", "to": "f", "arrow": "forward" }, - { "from": "experiment", "to": "d", "arrow": "forward" } + { "from": "master", "to": "f" }, + { "from": "experiment", "to": "d" } ] } diff --git a/figures/managed-team-2.json b/figures/managed-team-2.json index fff7c1a..8b91e1a 100644 --- a/figures/managed-team-2.json +++ b/figures/managed-team-2.json @@ -33,7 +33,7 @@ "dy": -20.9 }, { - "id": "aad88", + "id": "node_aad88", "kind": "john", "label": "aad88", "col": 4, @@ -59,7 +59,7 @@ "dy": -18.7 }, { - "id": "cd685", + "id": "node_cd685", "kind": "jessica", "label": "cd685", "col": 5, @@ -67,16 +67,15 @@ "dy": -18.7 }, { - "id": "fba9a", + "id": "node_fba9a", "kind": "josie", "label": "fba9a", "col": 3, "row": 5, - "dx": 2.4, - "dy": -16.5 + "dy": 30 }, { - "id": "e5b0f", + "id": "node_e5b0f", "kind": "jessica", "label": "e5b0f", "col": 3, @@ -133,16 +132,16 @@ "edges": [ { "from": "node_1edee", "to": "node_4b078" }, { "from": "node_33009", "to": "node_1edee" }, - { "from": "aad88", "to": "node_33009" }, - { "from": "node_774b3", "to": "aad88" }, - { "from": "e5b0f", "to": "node_33009", "route": "diagonal" }, - { "from": "fba9a", "to": "e5b0f" }, - { "from": "node_85127", "to": "e5b0f" }, - { "from": "cd685", "to": "node_85127" }, - { "from": "master", "to": "node_1edee", "arrow": "forward" }, + { "from": "node_aad88", "to": "node_33009" }, + { "from": "node_774b3", "to": "node_aad88" }, + { "from": "node_e5b0f", "to": "node_1edee", "route": "diagonal" }, + { "from": "node_fba9a", "to": "node_1edee", "route": "diagonal" }, + { "from": "node_85127", "to": "node_e5b0f" }, + { "from": "node_cd685", "to": "node_85127" }, + { "from": "node_cd685", "to": "node_fba9a", "route": "diagonal" }, { "from": "featurea", "to": "node_774b3", "arrow": "forward" }, { "from": "origin", "to": "node_774b3", "arrow": "forward" }, - { "from": "featureb", "to": "cd685", "arrow": "forward" }, - { "from": "origin-2", "to": "cd685", "arrow": "forward" } + { "from": "featureb", "to": "node_cd685", "arrow": "forward" }, + { "from": "origin-2", "to": "node_cd685", "arrow": "forward" } ] } diff --git a/figures/managed-team-3.json b/figures/managed-team-3.json index 6017251..0bf8da6 100644 --- a/figures/managed-team-3.json +++ b/figures/managed-team-3.json @@ -33,7 +33,7 @@ "dy": -20.81 }, { - "id": "aad88", + "id": "node_aad88", "kind": "john", "label": "aad88", "col": 4, @@ -68,7 +68,7 @@ "dy": -18.61 }, { - "id": "cd685", + "id": "node_cd685", "kind": "jessica", "label": "cd685", "col": 5, @@ -77,16 +77,15 @@ "dy": -18.61 }, { - "id": "fba9a", + "id": "node_fba9a", "kind": "josie", "label": "fba9a", "col": 3, "row": 5, - "dx": -9.6, - "dy": -16.41 + "dy": 30 }, { - "id": "e5b0f", + "id": "node_e5b0f", "kind": "jessica", "label": "e5b0f", "col": 2, @@ -122,7 +121,7 @@ "dy": 12.29 }, { - "id": "origin", + "id": "origin-bee", "kind": "ref", "label": [ "origin/", @@ -133,7 +132,7 @@ "dx": -20.0 }, { - "id": "origin-2", + "id": "origin-a", "kind": "ref", "label": [ "origin/", @@ -144,7 +143,7 @@ "dx": -20.0 }, { - "id": "origin-3", + "id": "origin-master", "kind": "ref", "label": [ "origin/", @@ -158,18 +157,20 @@ "edges": [ { "from": "node_1edee", "to": "node_4b078" }, { "from": "node_33009", "to": "node_1edee" }, - { "from": "aad88", "to": "node_33009" }, - { "from": "node_774b3", "to": "aad88" }, + { "from": "node_aad88", "to": "node_33009" }, + { "from": "node_774b3", "to": "node_aad88" }, { "from": "node_5399e", "to": "node_774b3" }, - { "from": "e5b0f", "to": "node_33009", "route": "diagonal" }, - { "from": "fba9a", "to": "e5b0f" }, - { "from": "node_85127", "to": "e5b0f" }, - { "from": "cd685", "to": "node_85127" }, - { "from": "master", "to": "node_1edee", "arrow": "forward" }, - { "from": "featurea", "to": "node_5399e", "arrow": "forward" }, - { "from": "origin", "to": "cd685", "arrow": "forward" }, - { "from": "origin-2", "to": "node_5399e", "arrow": "forward" }, - { "from": "origin-3", "to": "node_5399e", "arrow": "forward" }, - { "from": "featureb", "to": "cd685", "arrow": "forward" } + { "from": "node_5399e", "to": "node_cd685", "route": "diagonal" }, + { "from": "node_e5b0f", "to": "node_1edee", "route": "diagonal" }, + { "from": "node_fba9a", "to": "node_1edee", "route": "diagonal" }, + { "from": "node_85127", "to": "node_e5b0f" }, + { "from": "node_cd685", "to": "node_85127" }, + { "from": "node_cd685", "to": "node_fba9a", "route": "diagonal" }, + + { "from": "featurea", "to": "node_774b3", "arrow": "forward" }, + { "from": "origin-a", "to": "node_774b3", "arrow": "forward" }, + { "from": "featureb", "to": "node_cd685", "arrow": "forward" }, + { "from": "origin-bee", "to": "node_cd685", "arrow": "forward" }, + { "from": "origin-master", "to": "node_5399e", "arrow": "forward" } ] } diff --git a/figures/merging-workflows-1.json b/figures/merging-workflows-1.json index fd9a1ba..49368ae 100644 --- a/figures/merging-workflows-1.json +++ b/figures/merging-workflows-1.json @@ -98,7 +98,7 @@ { "from": "c5", "to": "c3", "route": "diagonal" }, { "from": "c6", "to": "c5" }, { "from": "master", "to": "c7", "arrow": "forward" }, - { "from": "ruby-client", "to": "c4", "arrow": "forward" }, - { "from": "php-client", "to": "c6", "arrow": "forward" } + { "from": "ruby-client", "to": "c4" }, + { "from": "php-client", "to": "c6" } ] } diff --git a/figures/merging-workflows-2.json b/figures/merging-workflows-2.json index de50bd4..59b82f6 100644 --- a/figures/merging-workflows-2.json +++ b/figures/merging-workflows-2.json @@ -55,7 +55,7 @@ "kind": "commit", "label": "C9", "col": 5, - "row": 1, + "row": 2, "dy": 2.7 }, { @@ -90,7 +90,7 @@ "kind": "ref", "label": "master", "col": 5, - "row": 0 + "row": 1 }, { "id": "ruby-client", @@ -114,13 +114,14 @@ { "from": "c2", "to": "c1" }, { "from": "c7", "to": "c2" }, { "from": "c8", "to": "c7" }, - { "from": "c9", "to": "c8" }, + { "from": "c9", "to": "c8", "route": "diagonal" }, { "from": "c3", "to": "c2", "route": "diagonal" }, { "from": "c4", "to": "c3" }, - { "from": "c5", "to": "c3", "route": "diagonal" }, + { "from": "c5", "to": "c2", "route": "diagonal" }, { "from": "c6", "to": "c5" }, - { "from": "master", "to": "c9", "arrow": "forward" }, - { "from": "ruby-client", "to": "c4", "arrow": "forward" }, - { "from": "php-client", "to": "c6", "arrow": "forward" } + { "from": "c9", "to": "c6", "route": "diagonal" }, + { "from": "master", "to": "c9" }, + { "from": "ruby-client", "to": "c4" }, + { "from": "php-client", "to": "c6" } ] } diff --git a/figures/merging-workflows-4.json b/figures/merging-workflows-4.json index 3abc920..1ae222a 100644 --- a/figures/merging-workflows-4.json +++ b/figures/merging-workflows-4.json @@ -86,6 +86,7 @@ { "from": "c3", "to": "c2", "route": "diagonal" }, { "from": "c4", "to": "c3" }, { "from": "c6", "to": "c5" }, + { "from": "c6", "to": "c4", "route": "diagonal" }, { "from": "master", "to": "c2", "arrow": "forward" }, { "from": "develop", "to": "c6", "arrow": "forward" }, { "from": "ruby-client", "to": "c4", "arrow": "forward" } diff --git a/figures/merging-workflows-5.json b/figures/merging-workflows-5.json index 997119d..0593afa 100644 --- a/figures/merging-workflows-5.json +++ b/figures/merging-workflows-5.json @@ -89,8 +89,9 @@ { "from": "c3", "to": "c2", "route": "diagonal" }, { "from": "c4", "to": "c3" }, { "from": "c6", "to": "c5" }, - { "from": "master", "to": "c6", "arrow": "forward" }, - { "from": "develop", "to": "c6", "arrow": "forward" }, + { "from": "c6", "to": "c4", "route": "diagonal" }, + { "from": "master", "to": "c6", "route": "diagonal" }, + { "from": "develop", "to": "c6", "route": "diagonal" }, { "from": "ruby-client", "to": "c4", "arrow": "forward" } ] } diff --git a/figures/public-small-1.json b/figures/public-small-1.json index 839a14b..4eb389e 100644 --- a/figures/public-small-1.json +++ b/figures/public-small-1.json @@ -39,14 +39,14 @@ "dy": 1.4 }, { - "id": "e5b0f", + "id": "node_e5b0f", "kind": "commit", "label": "e5b0f", "col": 2, "row": 3 }, { - "id": "a2de3", + "id": "node_a2de3", "kind": "commit", "label": "a2de3", "col": 2, @@ -89,12 +89,12 @@ "edges": [ { "from": "node_1edee", "to": "node_4b078" }, { "from": "node_33009", "to": "node_1edee" }, - { "from": "a2de3", "to": "node_33009", "route": "diagonal" }, - { "from": "node_0d708", "to": "a2de3" }, - { "from": "e5b0f", "to": "node_33009", "route": "diagonal" }, - { "from": "master", "to": "node_33009", "arrow": "forward" }, - { "from": "origin", "to": "node_33009", "arrow": "forward" }, - { "from": "featurea", "to": "node_0d708", "arrow": "forward" }, - { "from": "featureb", "to": "e5b0f", "arrow": "forward" } + { "from": "node_a2de3", "to": "node_1edee", "route": "diagonal" }, + { "from": "node_0d708", "to": "node_a2de3" }, + { "from": "node_e5b0f", "to": "node_1edee", "route": "diagonal" }, + { "from": "master", "to": "node_1edee" }, + { "from": "origin", "to": "node_33009" }, + { "from": "featurea", "to": "node_0d708" }, + { "from": "featureb", "to": "node_e5b0f" } ] } diff --git a/figures/public-small-2.json b/figures/public-small-2.json index cd266f8..04b5b80 100644 --- a/figures/public-small-2.json +++ b/figures/public-small-2.json @@ -39,14 +39,14 @@ "dy": 1.42 }, { - "id": "e5b0f", + "id": "node_e5b0f", "kind": "commit", "label": "e5b0f", "col": 2, "row": 3 }, { - "id": "dee6b", + "id": "node_dee6b", "kind": "commit", "label": "dee6b", "col": 3, @@ -89,12 +89,12 @@ "edges": [ { "from": "node_1edee", "to": "node_4b078" }, { "from": "node_33009", "to": "node_1edee" }, - { "from": "dee6b", "to": "node_33009", "route": "diagonal" }, - { "from": "node_5399e", "to": "dee6b" }, - { "from": "e5b0f", "to": "node_33009", "route": "diagonal" }, - { "from": "master", "to": "node_33009", "arrow": "forward" }, - { "from": "origin", "to": "node_33009", "arrow": "forward" }, - { "from": "featurea", "to": "node_5399e", "arrow": "forward" }, - { "from": "featureb", "to": "e5b0f", "arrow": "forward" } + { "from": "node_dee6b", "to": "node_33009", "route": "diagonal" }, + { "from": "node_5399e", "to": "node_dee6b" }, + { "from": "node_e5b0f", "to": "node_1edee", "route": "diagonal" }, + { "from": "master", "to": "node_1edee" }, + { "from": "origin", "to": "node_33009" }, + { "from": "featurea", "to": "node_5399e" }, + { "from": "featureb", "to": "node_e5b0f" } ] } diff --git a/figures/public-small-3.json b/figures/public-small-3.json index 6354dea..f4cab18 100644 --- a/figures/public-small-3.json +++ b/figures/public-small-3.json @@ -47,14 +47,14 @@ "dy": -2.92 }, { - "id": "e5b0f", + "id": "node_e5b0f", "kind": "commit", "label": "e5b0f", "col": 2, "row": 4 }, { - "id": "dee6b", + "id": "node_dee6b", "kind": "commit", "label": "dee6b", "col": 3, @@ -106,13 +106,13 @@ { "from": "node_1edee", "to": "node_4b078" }, { "from": "node_33009", "to": "node_1edee" }, { "from": "node_17f4d", "to": "node_33009", "route": "diagonal" }, - { "from": "featurebv2", "to": "node_17f4d", "arrow": "forward" }, - { "from": "dee6b", "to": "node_33009", "route": "diagonal" }, - { "from": "node_5399e", "to": "dee6b" }, - { "from": "e5b0f", "to": "node_33009", "route": "diagonal" }, - { "from": "master", "to": "node_33009", "arrow": "forward" }, - { "from": "origin", "to": "node_33009", "arrow": "forward" }, - { "from": "featurea", "to": "node_5399e", "arrow": "forward" }, - { "from": "featureb", "to": "e5b0f", "arrow": "forward" } + { "from": "featurebv2", "to": "node_17f4d" }, + { "from": "node_dee6b", "to": "node_33009", "route": "diagonal" }, + { "from": "node_5399e", "to": "node_dee6b" }, + { "from": "node_e5b0f", "to": "node_1edee", "route": "diagonal" }, + { "from": "master", "to": "node_1edee" }, + { "from": "origin", "to": "node_33009" }, + { "from": "featurea", "to": "node_5399e" }, + { "from": "featureb", "to": "node_e5b0f" } ] } diff --git a/figures/rebasing-1.json b/figures/rebasing-1.json index ecdb9f4..7aa2c5d 100644 --- a/figures/rebasing-1.json +++ b/figures/rebasing-1.json @@ -64,7 +64,7 @@ "edges": [ { "from": "a6b4c", "to": "node_0b743" }, { "from": "f42c5", "to": "a6b4c" }, - { "from": "e43a6", "to": "f42c5", "route": "diagonal" }, + { "from": "e43a6", "to": "a6b4c", "route": "diagonal" }, { "from": "node_5ddae", "to": "e43a6" }, { "from": "master", "to": "f42c5", "arrow": "forward" }, { "from": "ruby-client", "to": "node_5ddae", "arrow": "forward" } diff --git a/figures/rebasing-2.json b/figures/rebasing-2.json index b8784c2..8343dbf 100644 --- a/figures/rebasing-2.json +++ b/figures/rebasing-2.json @@ -75,7 +75,7 @@ { "from": "a6b4c", "to": "node_0b743" }, { "from": "f42c5", "to": "a6b4c" }, { "from": "a0a41", "to": "f42c5" }, - { "from": "e43a6", "to": "f42c5", "route": "diagonal" }, + { "from": "e43a6", "to": "a6b4c", "route": "diagonal" }, { "from": "node_5ddae", "to": "e43a6" }, { "from": "master", "to": "a0a41", "arrow": "forward" }, { "from": "ruby-client", "to": "node_5ddae", "arrow": "forward" } diff --git a/figures/small-team-1.json b/figures/small-team-1.json index 704c05f..268d413 100644 --- a/figures/small-team-1.json +++ b/figures/small-team-1.json @@ -41,7 +41,10 @@ { "id": "origin-master", "kind": "ref", - "label": "origin/master", + "label": [ + "origin/", + "master" + ], "col": 2, "row": 3 }, @@ -56,7 +59,7 @@ "edges": [ { "from": "node_1edee", "to": "node_4b078" }, { "from": "node_738ee", "to": "node_1edee" }, - { "from": "fbff5", "to": "node_1edee" }, + { "from": "fbff5", "to": "node_1edee", "route": "diagonal" }, { "from": "master", "to": "node_738ee", "arrow": "forward" }, { "from": "origin-master", "to": "fbff5", "arrow": "forward" } ] diff --git a/figures/small-team-2.json b/figures/small-team-2.json index fd2d72f..593fb0a 100644 --- a/figures/small-team-2.json +++ b/figures/small-team-2.json @@ -49,7 +49,10 @@ { "id": "origin-master", "kind": "ref", - "label": "origin/master", + "label": [ + "origin/", + "master" + ], "col": 2, "row": 3 }, @@ -65,7 +68,8 @@ { "from": "node_1edee", "to": "node_4b078" }, { "from": "node_738ee", "to": "node_1edee" }, { "from": "node_72bbc", "to": "node_738ee" }, - { "from": "fbff5", "to": "node_1edee" }, + { "from": "node_72bbc", "to": "fbff5", "route": "diagonal" }, + { "from": "fbff5", "to": "node_1edee", "route": "diagonal" }, { "from": "master", "to": "node_72bbc", "arrow": "forward" }, { "from": "origin-master", "to": "fbff5", "arrow": "forward" } ] diff --git a/figures/small-team-3.json b/figures/small-team-3.json index fdff8b1..fa06a16 100644 --- a/figures/small-team-3.json +++ b/figures/small-team-3.json @@ -49,7 +49,10 @@ { "id": "origin-master", "kind": "ref", - "label": "origin/master", + "label": [ + "origin/", + "master" + ], "col": 3, "row": 3 }, @@ -64,7 +67,9 @@ "edges": [ { "from": "node_1edee", "to": "node_4b078" }, { "from": "node_738ee", "to": "node_1edee" }, + { "from": "node_72bbc", "to": "fbff5", "route": "diagonal" }, { "from": "node_72bbc", "to": "node_738ee" }, + { "from": "fbff5", "to": "node_1edee", "route": "diagonal" }, { "from": "fbff5", "to": "node_1edee" }, { "from": "master", "to": "node_72bbc", "arrow": "forward" }, { "from": "origin-master", "to": "node_72bbc", "arrow": "forward" } diff --git a/figures/small-team-4.json b/figures/small-team-4.json index 352cfff..2862755 100644 --- a/figures/small-team-4.json +++ b/figures/small-team-4.json @@ -51,7 +51,10 @@ { "id": "origin-master", "kind": "ref", - "label": "origin/master", + "label": [ + "origin/", + "master" + ], "col": 2, "row": 2 }, diff --git a/figures/small-team-5.json b/figures/small-team-5.json index 13b4100..4ef6d25 100644 --- a/figures/small-team-5.json +++ b/figures/small-team-5.json @@ -73,7 +73,10 @@ { "id": "origin-master", "kind": "ref", - "label": "origin/master", + "label": [ + "origin/", + "master" + ], "col": 3, "row": 3 }, @@ -95,8 +98,9 @@ "edges": [ { "from": "node_1edee", "to": "node_4b078" }, { "from": "fbff5", "to": "node_1edee" }, - { "from": "node_738ee", "to": "node_1edee" }, + { "from": "node_738ee", "to": "node_1edee", "route": "diagonal" }, { "from": "node_72bbc", "to": "node_738ee" }, + { "from": "node_72bbc", "to": "fbff5", "route": "diagonal" }, { "from": "node_8149a", "to": "fbff5" }, { "from": "node_23ac6", "to": "node_8149a" }, { "from": "node_4af42", "to": "node_23ac6" }, diff --git a/figures/small-team-6.json b/figures/small-team-6.json index 883091d..6beaaf6 100644 --- a/figures/small-team-6.json +++ b/figures/small-team-6.json @@ -85,7 +85,10 @@ { "id": "origin-master", "kind": "ref", - "label": "origin/master", + "label": [ + "origin/", + "master" + ], "col": 3, "row": 3, "dx": -0.6 @@ -109,12 +112,14 @@ "edges": [ { "from": "node_1edee", "to": "node_4b078" }, { "from": "fbff5", "to": "node_1edee" }, - { "from": "node_738ee", "to": "node_1edee" }, + { "from": "node_738ee", "to": "node_1edee", "route": "diagonal" }, { "from": "node_72bbc", "to": "node_738ee" }, + { "from": "node_72bbc", "to": "fbff5", "route": "diagonal" }, { "from": "node_8149a", "to": "fbff5" }, { "from": "node_23ac6", "to": "node_8149a" }, { "from": "node_4af42", "to": "node_23ac6" }, - { "from": "node_8059c", "to": "node_72bbc", "route": "diagonal" }, + { "from": "node_8059c", "to": "node_72bbc" }, + { "from": "node_8059c", "to": "node_4af42", "route": "diagonal" }, { "from": "master", "to": "node_8059c", "arrow": "forward" }, { "from": "origin-master", "to": "node_72bbc", "arrow": "forward" }, { "from": "issue54", "to": "node_4af42", "arrow": "forward" } diff --git a/figures/small-team-7.json b/figures/small-team-7.json index 6122c73..597b1ef 100644 --- a/figures/small-team-7.json +++ b/figures/small-team-7.json @@ -85,7 +85,10 @@ { "id": "origin-master", "kind": "ref", - "label": "origin/master", + "label": [ + "origin/", + "master" + ], "col": 6, "row": 3 }, @@ -108,12 +111,14 @@ "edges": [ { "from": "node_1edee", "to": "node_4b078" }, { "from": "fbff5", "to": "node_1edee" }, - { "from": "node_738ee", "to": "node_1edee" }, + { "from": "node_738ee", "to": "node_1edee", "route": "diagonal" }, { "from": "node_72bbc", "to": "node_738ee" }, + { "from": "node_72bbc", "to": "fbff5", "route": "diagonal" }, { "from": "node_8149a", "to": "fbff5" }, { "from": "node_23ac6", "to": "node_8149a" }, { "from": "node_4af42", "to": "node_23ac6" }, - { "from": "node_8059c", "to": "node_72bbc", "route": "diagonal" }, + { "from": "node_8059c", "to": "node_72bbc" }, + { "from": "node_8059c", "to": "node_4af42", "route": "diagonal" }, { "from": "master", "to": "node_8059c", "arrow": "forward" }, { "from": "origin-master", "to": "node_8059c", "arrow": "forward" }, { "from": "issue54", "to": "node_4af42", "arrow": "forward" } diff --git a/figures/snapshots.json b/figures/snapshots.json index 40013f8..5aaf2de 100644 --- a/figures/snapshots.json +++ b/figures/snapshots.json @@ -165,5 +165,11 @@ "dy": 3.4 } ], - "edges": [] + "edges": [ + { "from": "version-1", "to": "file-c", "arrow": "none" }, + { "from": "version-2", "to": "c1", "arrow": "none" }, + { "from": "version-3", "to": "c2", "arrow": "none" }, + { "from": "version-4", "to": "c2-2", "arrow": "none" }, + { "from": "version-5", "to": "c3", "arrow": "none" } + ] } diff --git a/figures/topic-branches-1.json b/figures/topic-branches-1.json index 29b01a9..41c1fa4 100644 --- a/figures/topic-branches-1.json +++ b/figures/topic-branches-1.json @@ -157,14 +157,10 @@ { "from": "c4", "to": "c2" }, { "from": "c5", "to": "c4" }, { "from": "c6", "to": "c5" }, - { "from": "c7", "to": "c9", "route": "diagonal" }, + { "from": "c7", "to": "c4", "route": "diagonal" }, { "from": "c8", "to": "c7" }, { "from": "c11", "to": "c8" }, { "from": "c12", "to": "c10", "route": "diagonal" }, - { "from": "c13", "to": "c12" }, - { "from": "master", "to": "c10", "arrow": "forward" }, - { "from": "iss91", "to": "c6", "arrow": "forward" }, - { "from": "iss91v2", "to": "c11", "arrow": "forward" }, - { "from": "dumbidea", "to": "c13", "arrow": "forward" } + { "from": "c13", "to": "c12" } ] } diff --git a/figures/topic-branches-2.json b/figures/topic-branches-2.json index 9191f8f..e61dfc7 100644 --- a/figures/topic-branches-2.json +++ b/figures/topic-branches-2.json @@ -160,8 +160,6 @@ { "from": "c7", "to": "c4" }, { "from": "c8", "to": "c7" }, { "from": "c11", "to": "c8" }, - { "from": "c14", "to": "c11", "route": "diagonal" }, - { "from": "master", "to": "c14", "arrow": "forward" }, - { "from": "iss91v2", "to": "c11", "arrow": "forward" } + { "from": "c14", "to": "c11", "route": "diagonal" } ] } diff --git a/images/double-dot.svg b/images/double-dot.svg index 7cd989d..bfe8228 100644 --- a/images/double-dot.svg +++ b/images/double-dot.svg @@ -4,10 +4,10 @@ - + - - + + A diff --git a/images/managed-team-2.svg b/images/managed-team-2.svg index d740381..3ffca0d 100644 --- a/images/managed-team-2.svg +++ b/images/managed-team-2.svg @@ -5,11 +5,11 @@ - - + + - + @@ -43,8 +43,8 @@ cd685 - - fba9a + + fba9a diff --git a/images/managed-team-3.svg b/images/managed-team-3.svg index 0d90a9e..f83317c 100644 --- a/images/managed-team-3.svg +++ b/images/managed-team-3.svg @@ -6,16 +6,17 @@ - - + + + - - + + + + - - 4b078 @@ -49,8 +50,8 @@ cd685 - - fba9a + + fba9a diff --git a/images/merging-workflows-1.svg b/images/merging-workflows-1.svg index 97c8720..8c75fa4 100644 --- a/images/merging-workflows-1.svg +++ b/images/merging-workflows-1.svg @@ -8,8 +8,8 @@ - - + + C1 diff --git a/images/merging-workflows-2.svg b/images/merging-workflows-2.svg index 2e277a4..72666f8 100644 --- a/images/merging-workflows-2.svg +++ b/images/merging-workflows-2.svg @@ -4,13 +4,14 @@ - + - + - - + + + @@ -33,8 +34,8 @@ C4 - - C9 + + C9 @@ -49,8 +50,8 @@ C6 - - master + + master diff --git a/images/merging-workflows-4.svg b/images/merging-workflows-4.svg index 88da025..0fb25ee 100644 --- a/images/merging-workflows-4.svg +++ b/images/merging-workflows-4.svg @@ -6,6 +6,7 @@ + diff --git a/images/merging-workflows-5.svg b/images/merging-workflows-5.svg index d1cbb99..e070755 100644 --- a/images/merging-workflows-5.svg +++ b/images/merging-workflows-5.svg @@ -6,8 +6,9 @@ - - + + + diff --git a/images/public-small-1.svg b/images/public-small-1.svg index bf8d760..a9e30ae 100644 --- a/images/public-small-1.svg +++ b/images/public-small-1.svg @@ -3,13 +3,13 @@ public small 1 - + - - + + - - + + 4b078 diff --git a/images/public-small-2.svg b/images/public-small-2.svg index 595734a..41ddf75 100644 --- a/images/public-small-2.svg +++ b/images/public-small-2.svg @@ -5,11 +5,11 @@ - - + + - - + + 4b078 diff --git a/images/public-small-3.svg b/images/public-small-3.svg index 579e4b2..3f2d3d2 100644 --- a/images/public-small-3.svg +++ b/images/public-small-3.svg @@ -4,14 +4,14 @@ - + - - + + - - + + 4b078 diff --git a/images/rebasing-1.svg b/images/rebasing-1.svg index 5c5c8e1..006d828 100644 --- a/images/rebasing-1.svg +++ b/images/rebasing-1.svg @@ -3,7 +3,7 @@ rebasing 1 - + diff --git a/images/rebasing-2.svg b/images/rebasing-2.svg index 1896eb4..ddc00c1 100644 --- a/images/rebasing-2.svg +++ b/images/rebasing-2.svg @@ -4,7 +4,7 @@ - + diff --git a/images/small-team-1.svg b/images/small-team-1.svg index 4d304ce..c839a5e 100644 --- a/images/small-team-1.svg +++ b/images/small-team-1.svg @@ -3,7 +3,7 @@ small team 1 - + @@ -24,7 +24,7 @@ - origin/master + origin/master diff --git a/images/small-team-2.svg b/images/small-team-2.svg index 7a06b2f..8a530e8 100644 --- a/images/small-team-2.svg +++ b/images/small-team-2.svg @@ -4,7 +4,8 @@ - + + @@ -29,7 +30,7 @@ - origin/master + origin/master diff --git a/images/small-team-3.svg b/images/small-team-3.svg index 5b22fd0..456b862 100644 --- a/images/small-team-3.svg +++ b/images/small-team-3.svg @@ -3,7 +3,9 @@ small team 3 + + @@ -29,7 +31,7 @@ - origin/master + origin/master diff --git a/images/small-team-4.svg b/images/small-team-4.svg index 8644b60..b30117e 100644 --- a/images/small-team-4.svg +++ b/images/small-team-4.svg @@ -35,7 +35,7 @@ - origin/master + origin/master diff --git a/images/small-team-5.svg b/images/small-team-5.svg index 2784b3d..3a68ef2 100644 --- a/images/small-team-5.svg +++ b/images/small-team-5.svg @@ -3,8 +3,9 @@ small team 5 - + + @@ -45,7 +46,7 @@ - origin/master + origin/master diff --git a/images/small-team-6.svg b/images/small-team-6.svg index 13f2dab..63fc3d1 100644 --- a/images/small-team-6.svg +++ b/images/small-team-6.svg @@ -3,12 +3,14 @@ small team 6 - + + - + + @@ -50,7 +52,7 @@ - origin/master + origin/master diff --git a/images/small-team-7.svg b/images/small-team-7.svg index a6d0670..1205a53 100644 --- a/images/small-team-7.svg +++ b/images/small-team-7.svg @@ -3,12 +3,14 @@ small team 7 - + + - + + @@ -50,7 +52,7 @@ - origin/master + origin/master diff --git a/images/snapshots.svg b/images/snapshots.svg index ebdf951..5ee1a2b 100644 --- a/images/snapshots.svg +++ b/images/snapshots.svg @@ -1,6 +1,11 @@ snapshots + + + + + Version 1 diff --git a/images/topic-branches-1.svg b/images/topic-branches-1.svg index c7fc561..fd26e2e 100644 --- a/images/topic-branches-1.svg +++ b/images/topic-branches-1.svg @@ -9,15 +9,11 @@ - + - - - - C0 diff --git a/images/topic-branches-2.svg b/images/topic-branches-2.svg index d1085cf..028c1d4 100644 --- a/images/topic-branches-2.svg +++ b/images/topic-branches-2.svg @@ -14,8 +14,6 @@ - - C0 diff --git a/tmp/figure-review.html b/tmp/figure-review.html new file mode 100644 index 0000000..67273c9 --- /dev/null +++ b/tmp/figure-review.html @@ -0,0 +1,690 @@ + + +Figure review + + +

Figure review — 113 figures

+

Left: committed PNG  |  Right: new SVG render

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameFlagsOld PNGNew SVG
advance-mastercontains master
advance-testingcontains master
areas
basic-branching-1
basic-branching-2
basic-branching-3contains master
basic-branching-4contains master
basic-branching-5contains master
basic-branching-6contains master
basic-merging-1contains master
basic-merging-2
basic-rebase-1contains master
basic-rebase-2contains master
basic-rebase-3contains master
basic-rebase-4contains master
benevolent-dictator
branch-and-historycontains master
centralized
centralized_workflow
checkout-mastercontains master
clean
commit-and-tree
commits-and-parents
data-model-1
data-model-2
data-model-3
data-model-4
deltas
distributed
double-dotcontains master
head-to-mastercontains master
head-to-testingcontains master
integration-manager
interesting-rebase-1contains master
interesting-rebase-2contains master
interesting-rebase-3contains master
interesting-rebase-4contains master
interesting-rebase-5contains master
large-merges-1contains master
large-merges-2contains master
lifecycle
local
lr-branches-1contains master
lr-branches-2
managed-team-1contains master
managed-team-2contains master
managed-team-3contains master
managed-team-flow
merging-workflows-1contains master
merging-workflows-2contains master
merging-workflows-3contains master
merging-workflows-4contains master
merging-workflows-5contains master
perils-of-rebasing-1contains master
perils-of-rebasing-2contains master
perils-of-rebasing-3contains master
perils-of-rebasing-4contains master
perils-of-rebasing-5contains master
public-small-1contains master
public-small-2contains master
public-small-3contains master
rebasing-1contains master
rebasing-2contains master
remote-branches-1contains master
remote-branches-2contains master
remote-branches-3contains master
remote-branches-4contains master
remote-branches-5contains master
replace1contains master
replace2contains master
replace3contains master
replace4contains master
replace5contains master
rerere1contains master
rerere2contains master
rerere3contains master
reset-checkoutcontains master
reset-ex1contains master
reset-ex2contains master
reset-ex3contains master
reset-ex4contains master
reset-ex5contains master
reset-ex6contains master
reset-hardcontains master
reset-mixedcontains master
reset-path1contains master
reset-path2contains master
reset-path3contains master
reset-softcontains master
reset-squash-r1contains master
reset-squash-r2contains master
reset-squash-r3contains master
reset-startcontains master
reset-workflow
small-team-1contains master
small-team-2contains master
small-team-3contains master
small-team-4contains master
small-team-5contains master
small-team-6contains master
small-team-7contains master
small-team-flow
smudge
snapshots
symbols
topic-branches-1contains master
topic-branches-2contains master
two-branches
undomerge-resetcontains master
undomerge-revertcontains master
undomerge-revert2contains master
undomerge-revert3contains master
undomerge-startcontains master
+