wip: getting closer

This commit is contained in:
2026-01-10 23:26:30 +00:00
parent 4722094f0c
commit 7d06d18ccb
19 changed files with 475 additions and 471 deletions

View File

@@ -1,4 +1,4 @@
<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="canonical" href="https://commonflow.org/404/"><title>Page Not Found | Git Common Flow</title><meta name="description" content="An attempt to gather a sensible selection of the most common usage patterns of git into a single and concise specification."><meta name="author" content="Jim Myhrberg"><!-- Fonts --><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,400;12..96,500;12..96,600;12..96,700;12..96,800&family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;0,9..40,600;1,9..40,400&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"><!-- Prevent flash of wrong theme --><script>
<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="canonical" href="https://commonflow.org/404/"><title>Page Not Found | Git Common-Flow</title><meta name="description" content="An attempt to gather a sensible selection of the most common usage patterns of git into a single and concise specification."><meta name="author" content="Jim Myhrberg"><!-- Fonts --><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,400;12..96,500;12..96,600;12..96,700;12..96,800&family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;0,9..40,600;1,9..40,400&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"><!-- Prevent flash of wrong theme --><script>
(function () {
const theme = localStorage.getItem("theme");
if (
@@ -9,7 +9,7 @@
document.documentElement.classList.add("dark");
}
})();
</script><link rel="stylesheet" href="/_astro/index.BQPwFnAt.css"></head> <body class="min-h-screen flex flex-col items-center justify-center p-8"> <div class="text-center"> <h1 class="text-[8rem] sm:text-[12rem] font-display font-bold leading-none
</script><link rel="stylesheet" href="/_astro/index._zunHdNh.css"></head> <body class="min-h-screen flex flex-col items-center justify-center p-8"> <div class="text-center"> <h1 class="text-[8rem] sm:text-[12rem] font-display font-bold leading-none
text-gray-300 dark:text-slate-700">
404
</h1> <p class="text-xl mb-2 text-gray-600 dark:text-slate-400">

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -8,9 +8,7 @@
document.documentElement.classList.add("dark");
}
})();
</script><link rel="stylesheet" href="/_astro/index.BQPwFnAt.css">
<style>.spec-content[data-astro-cid-x2lc2h5w] p:last-child{margin-bottom:0}.spec-content[data-astro-cid-x2lc2h5w] a{color:var(--color-accent)}.spec-content[data-astro-cid-x2lc2h5w] a:hover{color:var(--color-accent-light)}.sidebar-link[data-astro-cid-lfaoh65k].active{color:#0284c7;background-color:#0ea5e926}.dark .sidebar-link[data-astro-cid-lfaoh65k].active{color:#38bdf8;background-color:#0ea5e933}#spec-sidebar[data-astro-cid-lfaoh65k]::-webkit-scrollbar{width:4px}#spec-sidebar[data-astro-cid-lfaoh65k]::-webkit-scrollbar-track{background:transparent}#spec-sidebar[data-astro-cid-lfaoh65k]::-webkit-scrollbar-thumb{background-color:#e5e5e5;border-radius:2px}.dark #spec-sidebar[data-astro-cid-lfaoh65k]::-webkit-scrollbar-thumb{background-color:#1e293b}.spec-content[data-astro-cid-6lwcykzv]{max-width:var(--content-max-width)}.spec-content[data-astro-cid-6lwcykzv] h2{font-family:var(--font-display);font-size:1.75rem;font-weight:700;margin-top:3rem;margin-bottom:1.5rem;padding-bottom:.75rem;scroll-margin-top:calc(var(--header-height) + 2rem);border-bottom:1px solid #e5e5e5;color:#0a0a0a}.dark .spec-content[data-astro-cid-6lwcykzv] h2{border-bottom-color:#1e293b;color:#f8fafc}.spec-content[data-astro-cid-6lwcykzv] h2:first-child{margin-top:0}.spec-content[data-astro-cid-6lwcykzv] h3{font-family:var(--font-display);font-size:1.25rem;font-weight:600;margin-top:2rem;margin-bottom:1rem;color:#525252}.dark .spec-content[data-astro-cid-6lwcykzv] h3{color:#94a3b8}.spec-content[data-astro-cid-6lwcykzv] p{margin-bottom:1.25rem;color:#525252}.dark .spec-content[data-astro-cid-6lwcykzv] p{color:#94a3b8}.spec-content[data-astro-cid-6lwcykzv] strong{font-weight:600;color:#0a0a0a}.dark .spec-content[data-astro-cid-6lwcykzv] strong{color:#f8fafc}.spec-content[data-astro-cid-6lwcykzv] ul{margin-bottom:1.25rem;padding-left:1.5rem}.spec-content[data-astro-cid-6lwcykzv] ol{margin-bottom:1.25rem;padding-left:2.5rem;counter-reset:item;list-style:none}.spec-content[data-astro-cid-6lwcykzv] ol>li{counter-increment:item;position:relative}.spec-content[data-astro-cid-6lwcykzv] ol>li:before{content:counters(item,".") ".";position:absolute;left:-2.5rem;width:2rem;text-align:right;font-weight:500;color:#737373}.spec-content[data-astro-cid-6lwcykzv] ol>li[id]{scroll-margin-top:calc(var(--header-height) + 2rem)}.spec-content[data-astro-cid-6lwcykzv] li{margin-bottom:.5rem;color:#525252}.dark .spec-content[data-astro-cid-6lwcykzv] li{color:#94a3b8}.spec-content[data-astro-cid-6lwcykzv] a{color:var(--color-accent);text-decoration:none;transition:color .15s ease}.spec-content[data-astro-cid-6lwcykzv] a:hover{color:var(--color-accent-light)}.spec-content[data-astro-cid-6lwcykzv] blockquote{border-left:3px solid var(--color-accent);padding-left:1.5rem;margin:1.5rem 0;font-style:italic;color:#737373}.spec-content[data-astro-cid-6lwcykzv] img{max-width:100%;height:auto;border-radius:8px;margin:2rem 0}
</style></head> <body class="min-h-screen"> <header id="site-header" class="fixed top-0 inset-x-0 z-50 border-b border-transparent
</script><link rel="stylesheet" href="/_astro/index._zunHdNh.css"></head> <body class="min-h-screen"> <header id="site-header" class="fixed top-0 inset-x-0 z-50 border-b border-transparent
translate-y-[-100%] transition-transform duration-300
backdrop-blur-xl bg-gray-50/85 dark:bg-slate-950/85"> <div class="max-w-6xl mx-auto px-4 sm:px-6 h-16 flex items-center justify-between"> <!-- Logo / Title + Version --> <div class="flex items-center gap-3"> <a href="#hero" class="flex items-center gap-3 no-underline
text-gray-950 dark:text-slate-50
@@ -30,23 +28,23 @@ v1.0.0-rc.5 </a><a href="/spec/1.0.0-rc.4" role="option" aria-selected="false" c
v1.0.0-rc.4 </a><a href="/spec/1.0.0-rc.3" role="option" aria-selected="false" class="block px-3 py-2 font-mono text-sm rounded transition-colors text-gray-600 dark:text-slate-400 hover:bg-gray-100 dark:hover:bg-slate-800 hover:text-gray-950 dark:hover:text-slate-50">
v1.0.0-rc.3 </a><a href="/spec/1.0.0-rc.2" role="option" aria-selected="false" class="block px-3 py-2 font-mono text-sm rounded transition-colors text-gray-600 dark:text-slate-400 hover:bg-gray-100 dark:hover:bg-slate-800 hover:text-gray-950 dark:hover:text-slate-50">
v1.0.0-rc.2 </a><a href="/spec/1.0.0-rc.1" role="option" aria-selected="true" class="block px-3 py-2 font-mono text-sm rounded transition-colors text-gray-600 dark:text-slate-400 hover:bg-gray-100 dark:hover:bg-slate-800 hover:text-gray-950 dark:hover:text-slate-50 bg-sky-500/15 dark:bg-sky-500/20 text-sky-600 dark:text-sky-400">
v1.0.0-rc.1 </a> </div> </div> <script type="module">function c(){document.querySelectorAll("[data-version-selector]").forEach(e=>{if(e.dataset.initialized)return;e.dataset.initialized="true";const t=e.querySelector("[data-version-trigger]"),a=e.querySelector("[data-version-dropdown]"),n=e.querySelector("[data-arrow-icon]");if(!t||!a)return;const u=()=>{a.dataset.open="true",t.setAttribute("aria-expanded","true"),n&&(n.style.transform="rotate(180deg)")},o=()=>{delete a.dataset.open,t.setAttribute("aria-expanded","false"),n&&(n.style.transform="")};t.addEventListener("click",r=>{r.stopPropagation();const l=a.dataset.open==="true";document.querySelectorAll("[data-version-dropdown][data-open]").forEach(s=>{delete s.dataset.open;const i=s.previousElementSibling;i?.setAttribute("aria-expanded","false");const d=i?.querySelector("[data-arrow-icon]");d&&(d.style.transform="")}),l?o():u()}),document.addEventListener("click",r=>{e.contains(r.target)||o()}),document.addEventListener("keydown",r=>{r.key==="Escape"&&a.dataset.open==="true"&&(o(),t.focus())})})}c();document.addEventListener("astro:after-swap",c);</script> </div> </div> <!-- Desktop Navigation --> <nav class="hidden md:flex items-center gap-1"> <a href="#about" class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg
transition-colors cursor-pointer
v1.0.0-rc.1 </a> </div> </div> <script type="module">function c(){document.querySelectorAll("[data-version-selector]").forEach(e=>{if(e.dataset.initialized)return;e.dataset.initialized="true";const t=e.querySelector("[data-version-trigger]"),a=e.querySelector("[data-version-dropdown]"),n=e.querySelector("[data-arrow-icon]");if(!t||!a)return;const u=()=>{a.dataset.open="true",t.setAttribute("aria-expanded","true"),n&&(n.style.transform="rotate(180deg)")},o=()=>{delete a.dataset.open,t.setAttribute("aria-expanded","false"),n&&(n.style.transform="")};t.addEventListener("click",r=>{r.stopPropagation();const l=a.dataset.open==="true";document.querySelectorAll("[data-version-dropdown][data-open]").forEach(s=>{delete s.dataset.open;const i=s.previousElementSibling;i?.setAttribute("aria-expanded","false");const d=i?.querySelector("[data-arrow-icon]");d&&(d.style.transform="")}),l?o():u()}),document.addEventListener("click",r=>{e.contains(r.target)||o()}),document.addEventListener("keydown",r=>{r.key==="Escape"&&a.dataset.open==="true"&&(o(),t.focus())})})}c();document.addEventListener("astro:after-swap",c);</script> </div> </div> <!-- Desktop Navigation --> <nav class="hidden md:flex items-center gap-1"> <a href="#about" class="nav-link inline-flex items-center px-4 py-2 text-sm font-medium
rounded-lg transition-colors cursor-pointer
text-gray-600 dark:text-slate-400
hover:bg-gray-100 hover:text-gray-950
dark:hover:bg-slate-800 dark:hover:text-slate-50">
dark:hover:bg-slate-800 dark:hover:text-slate-50" data-nav-link data-section-id="about">
About
</a> <a href="#spec" class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg
transition-colors cursor-pointer
</a> <a href="#spec" class="nav-link inline-flex items-center px-4 py-2 text-sm font-medium
rounded-lg transition-colors cursor-pointer
text-gray-600 dark:text-slate-400
hover:bg-gray-100 hover:text-gray-950
dark:hover:bg-slate-800 dark:hover:text-slate-50">
dark:hover:bg-slate-800 dark:hover:text-slate-50" data-nav-link data-section-id="spec">
Spec
</a> <a href="#faq" class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg
transition-colors cursor-pointer
</a> <a href="#faq" class="nav-link inline-flex items-center px-4 py-2 text-sm font-medium
rounded-lg transition-colors cursor-pointer
text-gray-600 dark:text-slate-400
hover:bg-gray-100 hover:text-gray-950
dark:hover:bg-slate-800 dark:hover:text-slate-50">
dark:hover:bg-slate-800 dark:hover:text-slate-50" data-nav-link data-section-id="faq">
FAQ
</a> </nav> <!-- Right side: Theme, GitHub --> <div class="flex items-center gap-3"> <button data-theme-toggle type="button" class="p-2 rounded-lg transition-colors duration-200
text-gray-500 dark:text-slate-500
@@ -73,13 +71,16 @@ v1.0.0-rc.5 </a><a href="/spec/1.0.0-rc.4" role="option" aria-selected="false" c
v1.0.0-rc.4 </a><a href="/spec/1.0.0-rc.3" role="option" aria-selected="false" class="block px-3 py-2 font-mono text-sm rounded transition-colors text-gray-600 dark:text-slate-400 hover:bg-gray-100 dark:hover:bg-slate-800 hover:text-gray-950 dark:hover:text-slate-50">
v1.0.0-rc.3 </a><a href="/spec/1.0.0-rc.2" role="option" aria-selected="false" class="block px-3 py-2 font-mono text-sm rounded transition-colors text-gray-600 dark:text-slate-400 hover:bg-gray-100 dark:hover:bg-slate-800 hover:text-gray-950 dark:hover:text-slate-50">
v1.0.0-rc.2 </a><a href="/spec/1.0.0-rc.1" role="option" aria-selected="true" class="block px-3 py-2 font-mono text-sm rounded transition-colors text-gray-600 dark:text-slate-400 hover:bg-gray-100 dark:hover:bg-slate-800 hover:text-gray-950 dark:hover:text-slate-50 bg-sky-500/15 dark:bg-sky-500/20 text-sky-600 dark:text-sky-400">
v1.0.0-rc.1 </a> </div> </div> </div> <a href="#about" class="block py-2 text-gray-600 dark:text-slate-400 hover:text-sky-600">
v1.0.0-rc.1 </a> </div> </div> </div> <a href="#about" class="nav-link block py-2 text-gray-600 dark:text-slate-400
hover:text-sky-600" data-nav-link data-section-id="about">
About
</a> <a href="#spec" class="block py-2 text-gray-600 dark:text-slate-400 hover:text-sky-600">
</a> <a href="#spec" class="nav-link block py-2 text-gray-600 dark:text-slate-400
hover:text-sky-600" data-nav-link data-section-id="spec">
Spec
</a> <a href="#faq" class="block py-2 text-gray-600 dark:text-slate-400 hover:text-sky-600">
</a> <a href="#faq" class="nav-link block py-2 text-gray-600 dark:text-slate-400
hover:text-sky-600" data-nav-link data-section-id="faq">
FAQ
</a> </div> </nav> </header> <script type="module">function o(){const e=document.getElementById("site-header"),n=document.getElementById("hero"),s=document.getElementById("mobile-menu-btn"),t=document.getElementById("mobile-nav");if(!e||!n)return;const d=Math.floor(window.innerHeight/2);new IntersectionObserver(([r])=>{r.isIntersecting?(e.classList.add("translate-y-[-100%]"),e.classList.remove("border-gray-200","dark:border-slate-800")):(e.classList.remove("translate-y-[-100%]"),e.classList.add("border-gray-200","dark:border-slate-800"))},{threshold:0,rootMargin:`-${d}px 0px 0px 0px`}).observe(n),s&&t&&(s.addEventListener("click",()=>{t.classList.toggle("hidden")}),t.querySelectorAll("a").forEach(r=>{r.addEventListener("click",()=>{t.classList.add("hidden")})}))}o();document.addEventListener("astro:after-swap",o);</script> <main> <section id="hero" class="relative min-h-[75vh] flex flex-col items-center justify-center
</a> </div> </nav> </header> <script type="module">function f(){const n=document.getElementById("site-header"),g=document.getElementById("hero"),o=document.getElementById("mobile-menu-btn"),s=document.getElementById("mobile-nav");if(!n||!g)return;const v=64;function c(){window.scrollY>=v?(n.classList.remove("translate-y-[-100%]"),n.classList.add("border-gray-200","dark:border-slate-800")):(n.classList.add("translate-y-[-100%]"),n.classList.remove("border-gray-200","dark:border-slate-800"))}window.addEventListener("scroll",c,{passive:!0}),c(),o&&s&&(o.addEventListener("click",()=>{s.classList.toggle("hidden")}),s.querySelectorAll("a").forEach(i=>{i.addEventListener("click",()=>{s.classList.add("hidden")})}));const r=document.querySelectorAll("[data-nav-link]"),l=[],u=new Set;r.forEach(i=>{const e=i.getAttribute("data-section-id");if(e&&!u.has(e)){u.add(e);const t=document.getElementById(e);t&&l.push({id:e,element:t})}});function m(){let e=null;for(const{id:t,element:d}of l)d.getBoundingClientRect().top<=100&&(e=t);r.forEach(t=>{const d=t.getAttribute("data-section-id");t.classList.toggle("active",d===e)})}let a=!1;window.addEventListener("scroll",()=>{a||(requestAnimationFrame(()=>{m(),a=!1}),a=!0)}),m()}f();document.addEventListener("astro:after-swap",f);</script> <main> <section id="hero" class="relative min-h-[75vh] flex flex-col items-center justify-center
px-6 py-16 overflow-hidden"> <!-- Background gradient/texture --> <div class="absolute inset-0 bg-gradient-to-b
from-gray-100 to-gray-50
dark:from-slate-900 dark:to-slate-950"></div> <!-- Subtle grid pattern --> <div class="absolute inset-0 opacity-[0.03] dark:opacity-[0.05]
@@ -146,45 +147,45 @@ FAQ
</a> </nav> </div> <!-- Scroll indicator --> <a href="#about" class="absolute bottom-8 left-1/2 -translate-x-1/2
animate-fade-in delay-700
text-gray-500 dark:text-slate-500
hover:text-sky-600 transition-colors" aria-label="Scroll to content"> <svg class="w-6 h-6 animate-bounce-subtle" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 14l-7 7m0 0l-7-7m7 7V3"></path> </svg> </a> </section> <section id="about" class="py-20 sm:py-28" data-astro-cid-x2lc2h5w> <div class="section-container" data-astro-cid-x2lc2h5w> <div class="max-w-3xl mx-auto" data-astro-cid-x2lc2h5w> <!-- Section header --> <div class="mb-12 text-center" data-astro-cid-x2lc2h5w> <h2 class="text-3xl sm:text-4xl mb-4" data-astro-cid-x2lc2h5w>About Common-Flow</h2> <p class="text-lg text-gray-600 dark:text-slate-400" data-astro-cid-x2lc2h5w>
hover:text-sky-600 transition-colors" aria-label="Scroll to content"> <svg class="w-6 h-6 animate-bounce-subtle" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 14l-7 7m0 0l-7-7m7 7V3"></path> </svg> </a> </section> <section id="about" class="py-20 sm:py-28"> <div class="section-container"> <div class="max-w-3xl mx-auto"> <!-- Section header --> <div class="mb-12 text-center"> <h2 class="text-3xl sm:text-4xl mb-4">About Common-Flow</h2> <p class="text-lg text-gray-600 dark:text-slate-400">
A practical git workflow that combines the best of GitHub Flow with
versioned releases
</p> </div> <!-- Introduction --> <div class="prose-spec mb-12" data-astro-cid-x2lc2h5w> <div class="spec-content" data-astro-cid-x2lc2h5w></div> </div> <!-- Summary as feature cards --> <div class="mb-16" data-astro-cid-x2lc2h5w> <h3 class="text-xl font-display font-semibold mb-6
text-gray-950 dark:text-slate-50" data-astro-cid-x2lc2h5w>
</p> </div> <!-- Introduction --> <div class="prose-spec mb-12"></div> <!-- Summary as feature cards --> <div class="mb-16"> <h3 class="text-xl font-display font-semibold mb-6
text-gray-950 dark:text-slate-50">
Key Principles
</h3> <div class="spec-content prose-spec" data-astro-cid-x2lc2h5w><p>Common-Flow is an attempt to gather a sensible selection of the most common
</h3> <div class="prose-spec"><p>Common-Flow is an attempt to gather a sensible selection of the most common
usage patterns of git into a single and concise specification. It is based on
the <a href="http://scottchacon.com/2011/08/31/github-flow.html">original variant</a>
of <a href="https://guides.github.com/introduction/flow/">GitHub Flow</a>, while taking
into account how a lot of open source projects use git.</p>
<p>TL;DR: Common-Flow is basically GitHub Flow with the addition of versioned
releases, maintenance releases for old versions, and without the requirement to
deploy to production all the time.</p></div> </div> <!-- Feedback & License --> <div class="pt-8 border-t border-gray-200 dark:border-slate-800" data-astro-cid-x2lc2h5w> <div class="grid sm:grid-cols-2 gap-8" data-astro-cid-x2lc2h5w> <div data-astro-cid-x2lc2h5w> <h4 class="text-sm font-semibold uppercase tracking-wider mb-3
text-gray-500 dark:text-slate-500" data-astro-cid-x2lc2h5w>
deploy to production all the time.</p></div> </div> <!-- Feedback & License --> <div class="pt-8 border-t border-gray-200 dark:border-slate-800"> <div class="grid sm:grid-cols-2 gap-8"> <div> <h4 class="text-sm font-semibold uppercase tracking-wider mb-3
text-gray-500 dark:text-slate-500">
Feedback
</h4> <p class="text-gray-600 dark:text-slate-400" data-astro-cid-x2lc2h5w>
Please <a href="https://github.com/jimeh/common-flow/issues" class="text-sky-600 hover:text-sky-400" target="_blank" rel="noopener noreferrer" data-astro-cid-x2lc2h5w>open an issue on GitHub</a>.
</p> </div> <div data-astro-cid-x2lc2h5w> <h4 class="text-sm font-semibold uppercase tracking-wider mb-3
text-gray-500 dark:text-slate-500" data-astro-cid-x2lc2h5w>
</h4> <p class="text-gray-600 dark:text-slate-400">
Please <a href="https://github.com/jimeh/common-flow/issues" class="text-sky-600 hover:text-sky-400" target="_blank" rel="noopener noreferrer">open an issue on GitHub</a>.
</p> </div> <div> <h4 class="text-sm font-semibold uppercase tracking-wider mb-3
text-gray-500 dark:text-slate-500">
License
</h4> <div class="spec-content text-gray-600 dark:text-slate-400" data-astro-cid-x2lc2h5w><p><a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons - CC BY 3.0</a></p></div> </div> </div> </div> </div> </div> </section> <section id="spec" class="py-20 sm:py-28" data-astro-cid-6lwcykzv> <div class="section-container" data-astro-cid-6lwcykzv> <!-- Section header --> <div class="max-w-3xl mx-auto mb-12 text-center" data-astro-cid-6lwcykzv> <h2 class="text-3xl sm:text-4xl mb-4" data-astro-cid-6lwcykzv>The Specification</h2> <p class="text-lg text-gray-600 dark:text-slate-400" data-astro-cid-6lwcykzv>
</h4> <div class="text-gray-600 dark:text-slate-400"><p><a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons - CC BY 3.0</a></p></div> </div> </div> </div> </div> </div> </section> <section id="spec" class="py-20 sm:py-28"> <div class="section-container"> <!-- Section header --> <div class="max-w-3xl mx-auto mb-12 text-center"> <h2 class="text-3xl sm:text-4xl mb-4">The Specification</h2> <p class="text-lg text-gray-600 dark:text-slate-400">
The complete Git Common-Flow specification
</p> </div> <!-- Content with sidebar --> <div class="lg:flex lg:gap-8" data-astro-cid-6lwcykzv> <!-- Sidebar --> <div class="lg:w-64 lg:flex-shrink-0" data-astro-cid-6lwcykzv> <aside id="spec-sidebar" class="hidden lg:block lg:sticky lg:top-24 lg:self-start
</p> </div> <!-- Content with sidebar --> <div class="lg:flex lg:gap-8"> <!-- Sidebar --> <div class="lg:w-64 lg:flex-shrink-0"> <aside id="spec-sidebar" class="hidden lg:block lg:sticky lg:top-24 lg:self-start
lg:max-h-[calc(100vh-8rem)] lg:overflow-y-auto
lg:pr-8 lg:mr-8 lg:border-r border-gray-200 dark:border-slate-800" data-astro-cid-lfaoh65k> <nav class="space-y-1 py-2" data-astro-cid-lfaoh65k> <div class="text-xs font-semibold uppercase tracking-wider mb-4
text-gray-500 dark:text-slate-500" data-astro-cid-lfaoh65k>
lg:pr-8 lg:mr-8 lg:border-r border-gray-200 dark:border-slate-800"> <nav class="space-y-1 py-2"> <div class="text-xs font-semibold uppercase tracking-wider mb-4
text-gray-500 dark:text-slate-500">
Table of Contents
</div> <a href="#terminology" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-sidebar-link data-section-id="terminology" data-astro-cid-lfaoh65k> Terminology </a><a href="#specification" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-sidebar-link data-section-id="specification" data-astro-cid-lfaoh65k> Specification </a><a href="#spec-the-master-branch" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-the-master-branch" data-astro-cid-lfaoh65k> The Master Branch </a><a href="#spec-changes" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-changes" data-astro-cid-lfaoh65k> Changes </a><a href="#spec-git-best-practices" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-git-best-practices" data-astro-cid-lfaoh65k> Git Best Practices </a><a href="#spec-versioning" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-versioning" data-astro-cid-lfaoh65k> Versioning </a><a href="#spec-releases" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-releases" data-astro-cid-lfaoh65k> Releases </a><a href="#spec-bug-fixes-rollback" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-bug-fixes-rollback" data-astro-cid-lfaoh65k> Bug Fixes &amp; Rollback </a><a href="#spec-maintenance-releases" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-maintenance-releases" data-astro-cid-lfaoh65k> Maintenance Releases </a> </nav> </aside> <!-- Mobile floating button --> <button id="spec-toc-toggle" class="lg:hidden fixed bottom-6 right-6 z-40
</div> <a href="#terminology" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-sidebar-link data-section-id="terminology"> Terminology </a><a href="#specification" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-sidebar-link data-section-id="specification"> Specification </a><a href="#spec-the-master-branch" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-the-master-branch"> The Master Branch </a><a href="#spec-changes" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-changes"> Changes </a><a href="#spec-git-best-practices" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-git-best-practices"> Git Best Practices </a><a href="#spec-versioning" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-versioning"> Versioning </a><a href="#spec-releases" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-releases"> Releases </a><a href="#spec-bug-fixes-rollback" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-bug-fixes-rollback"> Bug Fixes &amp; Rollback </a><a href="#spec-maintenance-releases" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-maintenance-releases"> Maintenance Releases </a> </nav> </aside> <!-- Mobile floating button --> <button id="spec-toc-toggle" class="lg:hidden fixed bottom-6 right-6 z-40
w-12 h-12 rounded-full shadow-lg
bg-sky-600 text-white
flex items-center justify-center
hover:bg-sky-500
transition-all duration-200" aria-label="Jump to section" data-astro-cid-lfaoh65k> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-lfaoh65k> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h7" data-astro-cid-lfaoh65k></path> </svg> </button> <!-- Mobile TOC drawer --> <div id="spec-toc-drawer" class="lg:hidden fixed inset-0 z-50 hidden" data-toc-drawer data-astro-cid-lfaoh65k> <!-- Backdrop --> <div class="absolute inset-0 bg-black/50" data-toc-backdrop data-astro-cid-lfaoh65k></div> <!-- Drawer --> <div class="absolute bottom-0 inset-x-0 max-h-[70vh] overflow-y-auto
transition-all duration-200" aria-label="Jump to section"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h7"></path> </svg> </button> <!-- Mobile TOC drawer --> <div id="spec-toc-drawer" class="lg:hidden fixed inset-0 z-50 hidden" data-toc-drawer> <!-- Backdrop --> <div class="absolute inset-0 bg-black/50" data-toc-backdrop></div> <!-- Drawer --> <div class="absolute bottom-0 inset-x-0 max-h-[70vh] overflow-y-auto
bg-gray-50 dark:bg-slate-950
rounded-t-2xl shadow-xl p-6" data-astro-cid-lfaoh65k> <div class="flex items-center justify-between mb-4" data-astro-cid-lfaoh65k> <span class="text-sm font-semibold uppercase tracking-wider
text-gray-500 dark:text-slate-500" data-astro-cid-lfaoh65k>
rounded-t-2xl shadow-xl p-6"> <div class="flex items-center justify-between mb-4"> <span class="text-sm font-semibold uppercase tracking-wider
text-gray-500 dark:text-slate-500">
Jump to Section
</span> <button class="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-slate-800" data-toc-close aria-label="Close" data-astro-cid-lfaoh65k> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-lfaoh65k> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" data-astro-cid-lfaoh65k></path> </svg> </button> </div> <nav class="space-y-1" data-astro-cid-lfaoh65k> <a href="#terminology" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-toc-link data-astro-cid-lfaoh65k> Terminology </a><a href="#specification" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-toc-link data-astro-cid-lfaoh65k> Specification </a><a href="#spec-the-master-branch" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> The Master Branch </a><a href="#spec-changes" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> Changes </a><a href="#spec-git-best-practices" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> Git Best Practices </a><a href="#spec-versioning" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> Versioning </a><a href="#spec-releases" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> Releases </a><a href="#spec-bug-fixes-rollback" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> Bug Fixes &amp; Rollback </a><a href="#spec-maintenance-releases" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> Maintenance Releases </a> </nav> </div> </div> <script type="module">function u(){const a=document.querySelectorAll("[data-sidebar-link]"),o=[];a.forEach(n=>{const e=n.getAttribute("data-section-id");if(e){const t=document.getElementById(e);t&&o.push({id:e,element:t})}});function l(){let e=o[0]?.id;for(const{id:t,element:r}of o)r.getBoundingClientRect().top<=100&&(e=t);a.forEach(t=>{const r=t.getAttribute("data-section-id");t.classList.toggle("active",r===e)})}let s=!1;window.addEventListener("scroll",()=>{s||(requestAnimationFrame(()=>{l(),s=!1}),s=!0)}),l();const d=document.getElementById("spec-toc-toggle"),c=document.getElementById("spec-toc-drawer"),g=c?.querySelector("[data-toc-backdrop]"),m=c?.querySelector("[data-toc-close]"),v=c?.querySelectorAll("[data-toc-link]");function p(){c?.classList.remove("hidden"),document.body.style.overflow="hidden"}function i(){c?.classList.add("hidden"),document.body.style.overflow=""}d?.addEventListener("click",p),g?.addEventListener("click",i),m?.addEventListener("click",i),v?.forEach(n=>{n.addEventListener("click",i)});const f=document.getElementById("spec");f&&d&&new IntersectionObserver(([e])=>{d.classList.toggle("hidden",!e.isIntersecting)},{threshold:0}).observe(f)}u();document.addEventListener("astro:after-swap",u);</script> </div> <!-- Main content --> <div class="flex-1 min-w-0" data-astro-cid-6lwcykzv> <article class="prose-spec spec-content" data-astro-cid-6lwcykzv> <!-- Terminology --> <section id="terminology" data-astro-cid-6lwcykzv> <h2 data-astro-cid-6lwcykzv>Terminology</h2> <ul>
</span> <button class="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-slate-800" data-toc-close aria-label="Close"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> </div> <nav class="space-y-1"> <a href="#terminology" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-toc-link> Terminology </a><a href="#specification" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-toc-link> Specification </a><a href="#spec-the-master-branch" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> The Master Branch </a><a href="#spec-changes" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> Changes </a><a href="#spec-git-best-practices" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> Git Best Practices </a><a href="#spec-versioning" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> Versioning </a><a href="#spec-releases" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> Releases </a><a href="#spec-bug-fixes-rollback" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> Bug Fixes &amp; Rollback </a><a href="#spec-maintenance-releases" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> Maintenance Releases </a> </nav> </div> </div> <script type="module">function u(){const a=document.querySelectorAll("[data-sidebar-link]"),o=[];a.forEach(n=>{const e=n.getAttribute("data-section-id");if(e){const t=document.getElementById(e);t&&o.push({id:e,element:t})}});function l(){let e=o[0]?.id;for(const{id:t,element:r}of o)r.getBoundingClientRect().top<=100&&(e=t);a.forEach(t=>{const r=t.getAttribute("data-section-id");t.classList.toggle("active",r===e)})}let s=!1;window.addEventListener("scroll",()=>{s||(requestAnimationFrame(()=>{l(),s=!1}),s=!0)}),l();const d=document.getElementById("spec-toc-toggle"),c=document.getElementById("spec-toc-drawer"),g=c?.querySelector("[data-toc-backdrop]"),m=c?.querySelector("[data-toc-close]"),v=c?.querySelectorAll("[data-toc-link]");function p(){c?.classList.remove("hidden"),document.body.style.overflow="hidden"}function i(){c?.classList.add("hidden"),document.body.style.overflow=""}d?.addEventListener("click",p),g?.addEventListener("click",i),m?.addEventListener("click",i),v?.forEach(n=>{n.addEventListener("click",i)});const f=document.getElementById("spec");f&&d&&new IntersectionObserver(([e])=>{d.classList.toggle("hidden",!e.isIntersecting)},{threshold:0}).observe(f)}u();document.addEventListener("astro:after-swap",u);</script> </div> <!-- Main content --> <div class="flex-1 min-w-0"> <article class="prose-spec"> <!-- Terminology --> <section id="terminology"> <h2>Terminology</h2> <ul>
<li><strong>Master Branch</strong> - Must always have passing tests, is considered bleeding
edge, and must be named <code>master</code>.</li>
<li><strong>Change Branches</strong> - Any branch that introduces changes like a new feature, a
@@ -206,7 +207,7 @@ and a git tag named according to the new version string placed on said commit.</
<li><strong>Maintenance Release</strong> - Just like a regular release, except the version bump
commit and release tag are on a maintenance branch instead of the master
branch.</li>
</ul> </section> <!-- Main specification --> <section id="specification" data-astro-cid-6lwcykzv> <h2 data-astro-cid-6lwcykzv>Specification</h2> <p>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
</ul> </section> <!-- Main specification --> <section id="specification"> <h2>Specification</h2> <p>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in <a href="https://tools.ietf.org/html/rfc2119">RFC 2119</a>.</p>
<ol>
@@ -346,14 +347,9 @@ into the master branch, that work should have happened against the master
branch in the first place.</li>
</ol>
</li>
</ol> </section> </article> </div> </div> </div> </section> <section id="faq" class="py-20 sm:py-28 bg-gray-100 dark:bg-slate-900/30"> <div class="section-container"> <div class="max-w-3xl mx-auto"> <!-- Section header --> <div class="mb-12 text-center"> <h2 class="text-3xl sm:text-4xl mb-4">FAQ</h2> <p class="text-lg text-gray-600 dark:text-slate-400">
</ol> </section> </article> </div> </div> </div> </section> <section id="faq" class="py-20 sm:py-28"> <div class="section-container"> <div class="max-w-3xl mx-auto"> <!-- Section header --> <div class="mb-12 text-center"> <h2 class="text-3xl sm:text-4xl mb-4">FAQ</h2> <p class="text-lg text-gray-600 dark:text-slate-400">
Common questions about Git Common-Flow
</p> </div> <!-- FAQ Items --> <div class="space-y-0"> </div> </div> </div> </section> <script type="module">function n(){document.querySelectorAll("[data-faq-item]").forEach(r=>{const t=r.querySelector("[data-faq-trigger]"),a=r.querySelector("[data-faq-content]"),s=r.querySelector("[data-faq-icon]");!t||!a||!s||t.addEventListener("click",()=>{const e=t.getAttribute("aria-expanded")==="true";t.setAttribute("aria-expanded",e?"false":"true"),a.classList.toggle("grid-rows-[1fr]",!e),a.classList.toggle("grid-rows-[0fr]",e),s.classList.toggle("rotate-180",!e)})})}n();document.addEventListener("astro:after-swap",n);</script> </main> <footer class="py-8 text-center text-sm
text-gray-500 dark:text-slate-500
border-t border-gray-200 dark:border-slate-800"> <div class="section-container"> <p>
Git Common-Flow is authored by
<a href="https://jimeh.me/" class="hover:text-sky-600" target="_blank" rel="noopener noreferrer">
Jim Myhrberg
</a> </p> <p class="mt-2"> <a href="https://creativecommons.org/licenses/by/4.0/" class="hover:text-sky-600" target="_blank" rel="noopener noreferrer">
CC BY 4.0
</a> </p> </div> </footer> <!-- Re-init theme on Astro page transitions --> <script type="module">document.addEventListener("astro:after-swap",()=>{const e=localStorage.getItem("theme");e==="dark"||!e&&window.matchMedia("(prefers-color-scheme: dark)").matches?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")});</script> </body> </html>
</p> </div> <!-- FAQ Items --> <div class="space-y-0"> </div> </div> </div> </section> <script type="module">function n(){document.querySelectorAll("[data-faq-item]").forEach(r=>{const t=r.querySelector("[data-faq-trigger]"),a=r.querySelector("[data-faq-content]"),s=r.querySelector("[data-faq-icon]");!t||!a||!s||t.addEventListener("click",()=>{const e=t.getAttribute("aria-expanded")==="true";t.setAttribute("aria-expanded",e?"false":"true"),a.classList.toggle("grid-rows-[1fr]",!e),a.classList.toggle("grid-rows-[0fr]",e),s.classList.toggle("rotate-180",!e)})})}n();document.addEventListener("astro:after-swap",n);</script> </main> <footer class="py-8 text-center text-sm
text-gray-500 dark:text-slate-500
border-t border-gray-200 dark:border-slate-800"> <div class="section-container"> <p> Git Common-Flow is authored by
<a href="https://jimeh.me/" class="hover:text-sky-600" target="_blank" rel="noopener noreferrer"> Jim Myhrberg </a> </p> <p class="mt-2"> <a href="https://creativecommons.org/licenses/by/4.0/" class="hover:text-sky-600" target="_blank" rel="noopener noreferrer"> CC BY 4.0 </a> </p> </div> </footer> <!-- Re-init theme on Astro page transitions --> <script type="module">document.addEventListener("astro:after-swap",()=>{const e=localStorage.getItem("theme");e==="dark"||!e&&window.matchMedia("(prefers-color-scheme: dark)").matches?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")});</script> </body> </html>

View File

@@ -8,9 +8,7 @@
document.documentElement.classList.add("dark");
}
})();
</script><link rel="stylesheet" href="/_astro/index.BQPwFnAt.css">
<style>.spec-content[data-astro-cid-x2lc2h5w] p:last-child{margin-bottom:0}.spec-content[data-astro-cid-x2lc2h5w] a{color:var(--color-accent)}.spec-content[data-astro-cid-x2lc2h5w] a:hover{color:var(--color-accent-light)}.sidebar-link[data-astro-cid-lfaoh65k].active{color:#0284c7;background-color:#0ea5e926}.dark .sidebar-link[data-astro-cid-lfaoh65k].active{color:#38bdf8;background-color:#0ea5e933}#spec-sidebar[data-astro-cid-lfaoh65k]::-webkit-scrollbar{width:4px}#spec-sidebar[data-astro-cid-lfaoh65k]::-webkit-scrollbar-track{background:transparent}#spec-sidebar[data-astro-cid-lfaoh65k]::-webkit-scrollbar-thumb{background-color:#e5e5e5;border-radius:2px}.dark #spec-sidebar[data-astro-cid-lfaoh65k]::-webkit-scrollbar-thumb{background-color:#1e293b}.spec-content[data-astro-cid-6lwcykzv]{max-width:var(--content-max-width)}.spec-content[data-astro-cid-6lwcykzv] h2{font-family:var(--font-display);font-size:1.75rem;font-weight:700;margin-top:3rem;margin-bottom:1.5rem;padding-bottom:.75rem;scroll-margin-top:calc(var(--header-height) + 2rem);border-bottom:1px solid #e5e5e5;color:#0a0a0a}.dark .spec-content[data-astro-cid-6lwcykzv] h2{border-bottom-color:#1e293b;color:#f8fafc}.spec-content[data-astro-cid-6lwcykzv] h2:first-child{margin-top:0}.spec-content[data-astro-cid-6lwcykzv] h3{font-family:var(--font-display);font-size:1.25rem;font-weight:600;margin-top:2rem;margin-bottom:1rem;color:#525252}.dark .spec-content[data-astro-cid-6lwcykzv] h3{color:#94a3b8}.spec-content[data-astro-cid-6lwcykzv] p{margin-bottom:1.25rem;color:#525252}.dark .spec-content[data-astro-cid-6lwcykzv] p{color:#94a3b8}.spec-content[data-astro-cid-6lwcykzv] strong{font-weight:600;color:#0a0a0a}.dark .spec-content[data-astro-cid-6lwcykzv] strong{color:#f8fafc}.spec-content[data-astro-cid-6lwcykzv] ul{margin-bottom:1.25rem;padding-left:1.5rem}.spec-content[data-astro-cid-6lwcykzv] ol{margin-bottom:1.25rem;padding-left:2.5rem;counter-reset:item;list-style:none}.spec-content[data-astro-cid-6lwcykzv] ol>li{counter-increment:item;position:relative}.spec-content[data-astro-cid-6lwcykzv] ol>li:before{content:counters(item,".") ".";position:absolute;left:-2.5rem;width:2rem;text-align:right;font-weight:500;color:#737373}.spec-content[data-astro-cid-6lwcykzv] ol>li[id]{scroll-margin-top:calc(var(--header-height) + 2rem)}.spec-content[data-astro-cid-6lwcykzv] li{margin-bottom:.5rem;color:#525252}.dark .spec-content[data-astro-cid-6lwcykzv] li{color:#94a3b8}.spec-content[data-astro-cid-6lwcykzv] a{color:var(--color-accent);text-decoration:none;transition:color .15s ease}.spec-content[data-astro-cid-6lwcykzv] a:hover{color:var(--color-accent-light)}.spec-content[data-astro-cid-6lwcykzv] blockquote{border-left:3px solid var(--color-accent);padding-left:1.5rem;margin:1.5rem 0;font-style:italic;color:#737373}.spec-content[data-astro-cid-6lwcykzv] img{max-width:100%;height:auto;border-radius:8px;margin:2rem 0}
</style></head> <body class="min-h-screen"> <header id="site-header" class="fixed top-0 inset-x-0 z-50 border-b border-transparent
</script><link rel="stylesheet" href="/_astro/index._zunHdNh.css"></head> <body class="min-h-screen"> <header id="site-header" class="fixed top-0 inset-x-0 z-50 border-b border-transparent
translate-y-[-100%] transition-transform duration-300
backdrop-blur-xl bg-gray-50/85 dark:bg-slate-950/85"> <div class="max-w-6xl mx-auto px-4 sm:px-6 h-16 flex items-center justify-between"> <!-- Logo / Title + Version --> <div class="flex items-center gap-3"> <a href="#hero" class="flex items-center gap-3 no-underline
text-gray-950 dark:text-slate-50
@@ -30,23 +28,23 @@ v1.0.0-rc.5 </a><a href="/spec/1.0.0-rc.4" role="option" aria-selected="false" c
v1.0.0-rc.4 </a><a href="/spec/1.0.0-rc.3" role="option" aria-selected="false" class="block px-3 py-2 font-mono text-sm rounded transition-colors text-gray-600 dark:text-slate-400 hover:bg-gray-100 dark:hover:bg-slate-800 hover:text-gray-950 dark:hover:text-slate-50">
v1.0.0-rc.3 </a><a href="/spec/1.0.0-rc.2" role="option" aria-selected="true" class="block px-3 py-2 font-mono text-sm rounded transition-colors text-gray-600 dark:text-slate-400 hover:bg-gray-100 dark:hover:bg-slate-800 hover:text-gray-950 dark:hover:text-slate-50 bg-sky-500/15 dark:bg-sky-500/20 text-sky-600 dark:text-sky-400">
v1.0.0-rc.2 </a><a href="/spec/1.0.0-rc.1" role="option" aria-selected="false" class="block px-3 py-2 font-mono text-sm rounded transition-colors text-gray-600 dark:text-slate-400 hover:bg-gray-100 dark:hover:bg-slate-800 hover:text-gray-950 dark:hover:text-slate-50">
v1.0.0-rc.1 </a> </div> </div> <script type="module">function c(){document.querySelectorAll("[data-version-selector]").forEach(e=>{if(e.dataset.initialized)return;e.dataset.initialized="true";const t=e.querySelector("[data-version-trigger]"),a=e.querySelector("[data-version-dropdown]"),n=e.querySelector("[data-arrow-icon]");if(!t||!a)return;const u=()=>{a.dataset.open="true",t.setAttribute("aria-expanded","true"),n&&(n.style.transform="rotate(180deg)")},o=()=>{delete a.dataset.open,t.setAttribute("aria-expanded","false"),n&&(n.style.transform="")};t.addEventListener("click",r=>{r.stopPropagation();const l=a.dataset.open==="true";document.querySelectorAll("[data-version-dropdown][data-open]").forEach(s=>{delete s.dataset.open;const i=s.previousElementSibling;i?.setAttribute("aria-expanded","false");const d=i?.querySelector("[data-arrow-icon]");d&&(d.style.transform="")}),l?o():u()}),document.addEventListener("click",r=>{e.contains(r.target)||o()}),document.addEventListener("keydown",r=>{r.key==="Escape"&&a.dataset.open==="true"&&(o(),t.focus())})})}c();document.addEventListener("astro:after-swap",c);</script> </div> </div> <!-- Desktop Navigation --> <nav class="hidden md:flex items-center gap-1"> <a href="#about" class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg
transition-colors cursor-pointer
v1.0.0-rc.1 </a> </div> </div> <script type="module">function c(){document.querySelectorAll("[data-version-selector]").forEach(e=>{if(e.dataset.initialized)return;e.dataset.initialized="true";const t=e.querySelector("[data-version-trigger]"),a=e.querySelector("[data-version-dropdown]"),n=e.querySelector("[data-arrow-icon]");if(!t||!a)return;const u=()=>{a.dataset.open="true",t.setAttribute("aria-expanded","true"),n&&(n.style.transform="rotate(180deg)")},o=()=>{delete a.dataset.open,t.setAttribute("aria-expanded","false"),n&&(n.style.transform="")};t.addEventListener("click",r=>{r.stopPropagation();const l=a.dataset.open==="true";document.querySelectorAll("[data-version-dropdown][data-open]").forEach(s=>{delete s.dataset.open;const i=s.previousElementSibling;i?.setAttribute("aria-expanded","false");const d=i?.querySelector("[data-arrow-icon]");d&&(d.style.transform="")}),l?o():u()}),document.addEventListener("click",r=>{e.contains(r.target)||o()}),document.addEventListener("keydown",r=>{r.key==="Escape"&&a.dataset.open==="true"&&(o(),t.focus())})})}c();document.addEventListener("astro:after-swap",c);</script> </div> </div> <!-- Desktop Navigation --> <nav class="hidden md:flex items-center gap-1"> <a href="#about" class="nav-link inline-flex items-center px-4 py-2 text-sm font-medium
rounded-lg transition-colors cursor-pointer
text-gray-600 dark:text-slate-400
hover:bg-gray-100 hover:text-gray-950
dark:hover:bg-slate-800 dark:hover:text-slate-50">
dark:hover:bg-slate-800 dark:hover:text-slate-50" data-nav-link data-section-id="about">
About
</a> <a href="#spec" class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg
transition-colors cursor-pointer
</a> <a href="#spec" class="nav-link inline-flex items-center px-4 py-2 text-sm font-medium
rounded-lg transition-colors cursor-pointer
text-gray-600 dark:text-slate-400
hover:bg-gray-100 hover:text-gray-950
dark:hover:bg-slate-800 dark:hover:text-slate-50">
dark:hover:bg-slate-800 dark:hover:text-slate-50" data-nav-link data-section-id="spec">
Spec
</a> <a href="#faq" class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg
transition-colors cursor-pointer
</a> <a href="#faq" class="nav-link inline-flex items-center px-4 py-2 text-sm font-medium
rounded-lg transition-colors cursor-pointer
text-gray-600 dark:text-slate-400
hover:bg-gray-100 hover:text-gray-950
dark:hover:bg-slate-800 dark:hover:text-slate-50">
dark:hover:bg-slate-800 dark:hover:text-slate-50" data-nav-link data-section-id="faq">
FAQ
</a> </nav> <!-- Right side: Theme, GitHub --> <div class="flex items-center gap-3"> <button data-theme-toggle type="button" class="p-2 rounded-lg transition-colors duration-200
text-gray-500 dark:text-slate-500
@@ -73,13 +71,16 @@ v1.0.0-rc.5 </a><a href="/spec/1.0.0-rc.4" role="option" aria-selected="false" c
v1.0.0-rc.4 </a><a href="/spec/1.0.0-rc.3" role="option" aria-selected="false" class="block px-3 py-2 font-mono text-sm rounded transition-colors text-gray-600 dark:text-slate-400 hover:bg-gray-100 dark:hover:bg-slate-800 hover:text-gray-950 dark:hover:text-slate-50">
v1.0.0-rc.3 </a><a href="/spec/1.0.0-rc.2" role="option" aria-selected="true" class="block px-3 py-2 font-mono text-sm rounded transition-colors text-gray-600 dark:text-slate-400 hover:bg-gray-100 dark:hover:bg-slate-800 hover:text-gray-950 dark:hover:text-slate-50 bg-sky-500/15 dark:bg-sky-500/20 text-sky-600 dark:text-sky-400">
v1.0.0-rc.2 </a><a href="/spec/1.0.0-rc.1" role="option" aria-selected="false" class="block px-3 py-2 font-mono text-sm rounded transition-colors text-gray-600 dark:text-slate-400 hover:bg-gray-100 dark:hover:bg-slate-800 hover:text-gray-950 dark:hover:text-slate-50">
v1.0.0-rc.1 </a> </div> </div> </div> <a href="#about" class="block py-2 text-gray-600 dark:text-slate-400 hover:text-sky-600">
v1.0.0-rc.1 </a> </div> </div> </div> <a href="#about" class="nav-link block py-2 text-gray-600 dark:text-slate-400
hover:text-sky-600" data-nav-link data-section-id="about">
About
</a> <a href="#spec" class="block py-2 text-gray-600 dark:text-slate-400 hover:text-sky-600">
</a> <a href="#spec" class="nav-link block py-2 text-gray-600 dark:text-slate-400
hover:text-sky-600" data-nav-link data-section-id="spec">
Spec
</a> <a href="#faq" class="block py-2 text-gray-600 dark:text-slate-400 hover:text-sky-600">
</a> <a href="#faq" class="nav-link block py-2 text-gray-600 dark:text-slate-400
hover:text-sky-600" data-nav-link data-section-id="faq">
FAQ
</a> </div> </nav> </header> <script type="module">function o(){const e=document.getElementById("site-header"),n=document.getElementById("hero"),s=document.getElementById("mobile-menu-btn"),t=document.getElementById("mobile-nav");if(!e||!n)return;const d=Math.floor(window.innerHeight/2);new IntersectionObserver(([r])=>{r.isIntersecting?(e.classList.add("translate-y-[-100%]"),e.classList.remove("border-gray-200","dark:border-slate-800")):(e.classList.remove("translate-y-[-100%]"),e.classList.add("border-gray-200","dark:border-slate-800"))},{threshold:0,rootMargin:`-${d}px 0px 0px 0px`}).observe(n),s&&t&&(s.addEventListener("click",()=>{t.classList.toggle("hidden")}),t.querySelectorAll("a").forEach(r=>{r.addEventListener("click",()=>{t.classList.add("hidden")})}))}o();document.addEventListener("astro:after-swap",o);</script> <main> <section id="hero" class="relative min-h-[75vh] flex flex-col items-center justify-center
</a> </div> </nav> </header> <script type="module">function f(){const n=document.getElementById("site-header"),g=document.getElementById("hero"),o=document.getElementById("mobile-menu-btn"),s=document.getElementById("mobile-nav");if(!n||!g)return;const v=64;function c(){window.scrollY>=v?(n.classList.remove("translate-y-[-100%]"),n.classList.add("border-gray-200","dark:border-slate-800")):(n.classList.add("translate-y-[-100%]"),n.classList.remove("border-gray-200","dark:border-slate-800"))}window.addEventListener("scroll",c,{passive:!0}),c(),o&&s&&(o.addEventListener("click",()=>{s.classList.toggle("hidden")}),s.querySelectorAll("a").forEach(i=>{i.addEventListener("click",()=>{s.classList.add("hidden")})}));const r=document.querySelectorAll("[data-nav-link]"),l=[],u=new Set;r.forEach(i=>{const e=i.getAttribute("data-section-id");if(e&&!u.has(e)){u.add(e);const t=document.getElementById(e);t&&l.push({id:e,element:t})}});function m(){let e=null;for(const{id:t,element:d}of l)d.getBoundingClientRect().top<=100&&(e=t);r.forEach(t=>{const d=t.getAttribute("data-section-id");t.classList.toggle("active",d===e)})}let a=!1;window.addEventListener("scroll",()=>{a||(requestAnimationFrame(()=>{m(),a=!1}),a=!0)}),m()}f();document.addEventListener("astro:after-swap",f);</script> <main> <section id="hero" class="relative min-h-[75vh] flex flex-col items-center justify-center
px-6 py-16 overflow-hidden"> <!-- Background gradient/texture --> <div class="absolute inset-0 bg-gradient-to-b
from-gray-100 to-gray-50
dark:from-slate-900 dark:to-slate-950"></div> <!-- Subtle grid pattern --> <div class="absolute inset-0 opacity-[0.03] dark:opacity-[0.05]
@@ -146,45 +147,45 @@ FAQ
</a> </nav> </div> <!-- Scroll indicator --> <a href="#about" class="absolute bottom-8 left-1/2 -translate-x-1/2
animate-fade-in delay-700
text-gray-500 dark:text-slate-500
hover:text-sky-600 transition-colors" aria-label="Scroll to content"> <svg class="w-6 h-6 animate-bounce-subtle" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 14l-7 7m0 0l-7-7m7 7V3"></path> </svg> </a> </section> <section id="about" class="py-20 sm:py-28" data-astro-cid-x2lc2h5w> <div class="section-container" data-astro-cid-x2lc2h5w> <div class="max-w-3xl mx-auto" data-astro-cid-x2lc2h5w> <!-- Section header --> <div class="mb-12 text-center" data-astro-cid-x2lc2h5w> <h2 class="text-3xl sm:text-4xl mb-4" data-astro-cid-x2lc2h5w>About Common-Flow</h2> <p class="text-lg text-gray-600 dark:text-slate-400" data-astro-cid-x2lc2h5w>
hover:text-sky-600 transition-colors" aria-label="Scroll to content"> <svg class="w-6 h-6 animate-bounce-subtle" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 14l-7 7m0 0l-7-7m7 7V3"></path> </svg> </a> </section> <section id="about" class="py-20 sm:py-28"> <div class="section-container"> <div class="max-w-3xl mx-auto"> <!-- Section header --> <div class="mb-12 text-center"> <h2 class="text-3xl sm:text-4xl mb-4">About Common-Flow</h2> <p class="text-lg text-gray-600 dark:text-slate-400">
A practical git workflow that combines the best of GitHub Flow with
versioned releases
</p> </div> <!-- Introduction --> <div class="prose-spec mb-12" data-astro-cid-x2lc2h5w> <div class="spec-content" data-astro-cid-x2lc2h5w></div> </div> <!-- Summary as feature cards --> <div class="mb-16" data-astro-cid-x2lc2h5w> <h3 class="text-xl font-display font-semibold mb-6
text-gray-950 dark:text-slate-50" data-astro-cid-x2lc2h5w>
</p> </div> <!-- Introduction --> <div class="prose-spec mb-12"></div> <!-- Summary as feature cards --> <div class="mb-16"> <h3 class="text-xl font-display font-semibold mb-6
text-gray-950 dark:text-slate-50">
Key Principles
</h3> <div class="spec-content prose-spec" data-astro-cid-x2lc2h5w><p>Common-Flow is an attempt to gather a sensible selection of the most common
</h3> <div class="prose-spec"><p>Common-Flow is an attempt to gather a sensible selection of the most common
usage patterns of git into a single and concise specification. It is based on
the <a href="http://scottchacon.com/2011/08/31/github-flow.html">original variant</a>
of <a href="https://guides.github.com/introduction/flow/">GitHub Flow</a>, while taking
into account how a lot of open source projects use git.</p>
<p>TL;DR: Common-Flow is basically GitHub Flow with the addition of versioned
releases, maintenance releases for old versions, and without the requirement to
deploy to production all the time.</p></div> </div> <!-- Feedback & License --> <div class="pt-8 border-t border-gray-200 dark:border-slate-800" data-astro-cid-x2lc2h5w> <div class="grid sm:grid-cols-2 gap-8" data-astro-cid-x2lc2h5w> <div data-astro-cid-x2lc2h5w> <h4 class="text-sm font-semibold uppercase tracking-wider mb-3
text-gray-500 dark:text-slate-500" data-astro-cid-x2lc2h5w>
deploy to production all the time.</p></div> </div> <!-- Feedback & License --> <div class="pt-8 border-t border-gray-200 dark:border-slate-800"> <div class="grid sm:grid-cols-2 gap-8"> <div> <h4 class="text-sm font-semibold uppercase tracking-wider mb-3
text-gray-500 dark:text-slate-500">
Feedback
</h4> <p class="text-gray-600 dark:text-slate-400" data-astro-cid-x2lc2h5w>
Please <a href="https://github.com/jimeh/common-flow/issues" class="text-sky-600 hover:text-sky-400" target="_blank" rel="noopener noreferrer" data-astro-cid-x2lc2h5w>open an issue on GitHub</a>.
</p> </div> <div data-astro-cid-x2lc2h5w> <h4 class="text-sm font-semibold uppercase tracking-wider mb-3
text-gray-500 dark:text-slate-500" data-astro-cid-x2lc2h5w>
</h4> <p class="text-gray-600 dark:text-slate-400">
Please <a href="https://github.com/jimeh/common-flow/issues" class="text-sky-600 hover:text-sky-400" target="_blank" rel="noopener noreferrer">open an issue on GitHub</a>.
</p> </div> <div> <h4 class="text-sm font-semibold uppercase tracking-wider mb-3
text-gray-500 dark:text-slate-500">
License
</h4> <div class="spec-content text-gray-600 dark:text-slate-400" data-astro-cid-x2lc2h5w><p><a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons - CC BY 3.0</a></p></div> </div> </div> </div> </div> </div> </section> <section id="spec" class="py-20 sm:py-28" data-astro-cid-6lwcykzv> <div class="section-container" data-astro-cid-6lwcykzv> <!-- Section header --> <div class="max-w-3xl mx-auto mb-12 text-center" data-astro-cid-6lwcykzv> <h2 class="text-3xl sm:text-4xl mb-4" data-astro-cid-6lwcykzv>The Specification</h2> <p class="text-lg text-gray-600 dark:text-slate-400" data-astro-cid-6lwcykzv>
</h4> <div class="text-gray-600 dark:text-slate-400"><p><a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons - CC BY 3.0</a></p></div> </div> </div> </div> </div> </div> </section> <section id="spec" class="py-20 sm:py-28"> <div class="section-container"> <!-- Section header --> <div class="max-w-3xl mx-auto mb-12 text-center"> <h2 class="text-3xl sm:text-4xl mb-4">The Specification</h2> <p class="text-lg text-gray-600 dark:text-slate-400">
The complete Git Common-Flow specification
</p> </div> <!-- Content with sidebar --> <div class="lg:flex lg:gap-8" data-astro-cid-6lwcykzv> <!-- Sidebar --> <div class="lg:w-64 lg:flex-shrink-0" data-astro-cid-6lwcykzv> <aside id="spec-sidebar" class="hidden lg:block lg:sticky lg:top-24 lg:self-start
</p> </div> <!-- Content with sidebar --> <div class="lg:flex lg:gap-8"> <!-- Sidebar --> <div class="lg:w-64 lg:flex-shrink-0"> <aside id="spec-sidebar" class="hidden lg:block lg:sticky lg:top-24 lg:self-start
lg:max-h-[calc(100vh-8rem)] lg:overflow-y-auto
lg:pr-8 lg:mr-8 lg:border-r border-gray-200 dark:border-slate-800" data-astro-cid-lfaoh65k> <nav class="space-y-1 py-2" data-astro-cid-lfaoh65k> <div class="text-xs font-semibold uppercase tracking-wider mb-4
text-gray-500 dark:text-slate-500" data-astro-cid-lfaoh65k>
lg:pr-8 lg:mr-8 lg:border-r border-gray-200 dark:border-slate-800"> <nav class="space-y-1 py-2"> <div class="text-xs font-semibold uppercase tracking-wider mb-4
text-gray-500 dark:text-slate-500">
Table of Contents
</div> <a href="#terminology" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-sidebar-link data-section-id="terminology" data-astro-cid-lfaoh65k> Terminology </a><a href="#specification" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-sidebar-link data-section-id="specification" data-astro-cid-lfaoh65k> Specification </a><a href="#spec-the-master-branch" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-the-master-branch" data-astro-cid-lfaoh65k> The Master Branch </a><a href="#spec-change-branches" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-change-branches" data-astro-cid-lfaoh65k> Change Branches </a><a href="#spec-pull-requests" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-pull-requests" data-astro-cid-lfaoh65k> Pull Requests </a><a href="#spec-versioning" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-versioning" data-astro-cid-lfaoh65k> Versioning </a><a href="#spec-releases" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-releases" data-astro-cid-lfaoh65k> Releases </a><a href="#spec-release-branches" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-release-branches" data-astro-cid-lfaoh65k> Release Branches </a><a href="#spec-bug-fixes-rollback" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-bug-fixes-rollback" data-astro-cid-lfaoh65k> Bug Fixes &amp; Rollback </a><a href="#spec-git-best-practices" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-git-best-practices" data-astro-cid-lfaoh65k> Git Best Practices </a> </nav> </aside> <!-- Mobile floating button --> <button id="spec-toc-toggle" class="lg:hidden fixed bottom-6 right-6 z-40
</div> <a href="#terminology" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-sidebar-link data-section-id="terminology"> Terminology </a><a href="#specification" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-sidebar-link data-section-id="specification"> Specification </a><a href="#spec-the-master-branch" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-the-master-branch"> The Master Branch </a><a href="#spec-change-branches" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-change-branches"> Change Branches </a><a href="#spec-pull-requests" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-pull-requests"> Pull Requests </a><a href="#spec-versioning" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-versioning"> Versioning </a><a href="#spec-releases" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-releases"> Releases </a><a href="#spec-release-branches" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-release-branches"> Release Branches </a><a href="#spec-bug-fixes-rollback" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-bug-fixes-rollback"> Bug Fixes &amp; Rollback </a><a href="#spec-git-best-practices" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-sidebar-link data-section-id="spec-git-best-practices"> Git Best Practices </a> </nav> </aside> <!-- Mobile floating button --> <button id="spec-toc-toggle" class="lg:hidden fixed bottom-6 right-6 z-40
w-12 h-12 rounded-full shadow-lg
bg-sky-600 text-white
flex items-center justify-center
hover:bg-sky-500
transition-all duration-200" aria-label="Jump to section" data-astro-cid-lfaoh65k> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-lfaoh65k> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h7" data-astro-cid-lfaoh65k></path> </svg> </button> <!-- Mobile TOC drawer --> <div id="spec-toc-drawer" class="lg:hidden fixed inset-0 z-50 hidden" data-toc-drawer data-astro-cid-lfaoh65k> <!-- Backdrop --> <div class="absolute inset-0 bg-black/50" data-toc-backdrop data-astro-cid-lfaoh65k></div> <!-- Drawer --> <div class="absolute bottom-0 inset-x-0 max-h-[70vh] overflow-y-auto
transition-all duration-200" aria-label="Jump to section"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h7"></path> </svg> </button> <!-- Mobile TOC drawer --> <div id="spec-toc-drawer" class="lg:hidden fixed inset-0 z-50 hidden" data-toc-drawer> <!-- Backdrop --> <div class="absolute inset-0 bg-black/50" data-toc-backdrop></div> <!-- Drawer --> <div class="absolute bottom-0 inset-x-0 max-h-[70vh] overflow-y-auto
bg-gray-50 dark:bg-slate-950
rounded-t-2xl shadow-xl p-6" data-astro-cid-lfaoh65k> <div class="flex items-center justify-between mb-4" data-astro-cid-lfaoh65k> <span class="text-sm font-semibold uppercase tracking-wider
text-gray-500 dark:text-slate-500" data-astro-cid-lfaoh65k>
rounded-t-2xl shadow-xl p-6"> <div class="flex items-center justify-between mb-4"> <span class="text-sm font-semibold uppercase tracking-wider
text-gray-500 dark:text-slate-500">
Jump to Section
</span> <button class="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-slate-800" data-toc-close aria-label="Close" data-astro-cid-lfaoh65k> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-lfaoh65k> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" data-astro-cid-lfaoh65k></path> </svg> </button> </div> <nav class="space-y-1" data-astro-cid-lfaoh65k> <a href="#terminology" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-toc-link data-astro-cid-lfaoh65k> Terminology </a><a href="#specification" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-toc-link data-astro-cid-lfaoh65k> Specification </a><a href="#spec-the-master-branch" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> The Master Branch </a><a href="#spec-change-branches" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> Change Branches </a><a href="#spec-pull-requests" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> Pull Requests </a><a href="#spec-versioning" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> Versioning </a><a href="#spec-releases" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> Releases </a><a href="#spec-release-branches" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> Release Branches </a><a href="#spec-bug-fixes-rollback" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> Bug Fixes &amp; Rollback </a><a href="#spec-git-best-practices" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link data-astro-cid-lfaoh65k> Git Best Practices </a> </nav> </div> </div> <script type="module">function u(){const a=document.querySelectorAll("[data-sidebar-link]"),o=[];a.forEach(n=>{const e=n.getAttribute("data-section-id");if(e){const t=document.getElementById(e);t&&o.push({id:e,element:t})}});function l(){let e=o[0]?.id;for(const{id:t,element:r}of o)r.getBoundingClientRect().top<=100&&(e=t);a.forEach(t=>{const r=t.getAttribute("data-section-id");t.classList.toggle("active",r===e)})}let s=!1;window.addEventListener("scroll",()=>{s||(requestAnimationFrame(()=>{l(),s=!1}),s=!0)}),l();const d=document.getElementById("spec-toc-toggle"),c=document.getElementById("spec-toc-drawer"),g=c?.querySelector("[data-toc-backdrop]"),m=c?.querySelector("[data-toc-close]"),v=c?.querySelectorAll("[data-toc-link]");function p(){c?.classList.remove("hidden"),document.body.style.overflow="hidden"}function i(){c?.classList.add("hidden"),document.body.style.overflow=""}d?.addEventListener("click",p),g?.addEventListener("click",i),m?.addEventListener("click",i),v?.forEach(n=>{n.addEventListener("click",i)});const f=document.getElementById("spec");f&&d&&new IntersectionObserver(([e])=>{d.classList.toggle("hidden",!e.isIntersecting)},{threshold:0}).observe(f)}u();document.addEventListener("astro:after-swap",u);</script> </div> <!-- Main content --> <div class="flex-1 min-w-0" data-astro-cid-6lwcykzv> <article class="prose-spec spec-content" data-astro-cid-6lwcykzv> <!-- Terminology --> <section id="terminology" data-astro-cid-6lwcykzv> <h2 data-astro-cid-6lwcykzv>Terminology</h2> <ul>
</span> <button class="p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-slate-800" data-toc-close aria-label="Close"> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> </div> <nav class="space-y-1"> <a href="#terminology" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-toc-link> Terminology </a><a href="#specification" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800" data-toc-link> Specification </a><a href="#spec-the-master-branch" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> The Master Branch </a><a href="#spec-change-branches" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> Change Branches </a><a href="#spec-pull-requests" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> Pull Requests </a><a href="#spec-versioning" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> Versioning </a><a href="#spec-releases" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> Releases </a><a href="#spec-release-branches" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> Release Branches </a><a href="#spec-bug-fixes-rollback" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> Bug Fixes &amp; Rollback </a><a href="#spec-git-best-practices" class="sidebar-link block py-2 px-4 text-sm rounded-md transition-colors text-gray-500 hover:text-gray-950 hover:bg-gray-100 dark:text-slate-500 dark:hover:text-slate-50 dark:hover:bg-slate-800 pl-6 text-[0.8125rem]" data-toc-link> Git Best Practices </a> </nav> </div> </div> <script type="module">function u(){const a=document.querySelectorAll("[data-sidebar-link]"),o=[];a.forEach(n=>{const e=n.getAttribute("data-section-id");if(e){const t=document.getElementById(e);t&&o.push({id:e,element:t})}});function l(){let e=o[0]?.id;for(const{id:t,element:r}of o)r.getBoundingClientRect().top<=100&&(e=t);a.forEach(t=>{const r=t.getAttribute("data-section-id");t.classList.toggle("active",r===e)})}let s=!1;window.addEventListener("scroll",()=>{s||(requestAnimationFrame(()=>{l(),s=!1}),s=!0)}),l();const d=document.getElementById("spec-toc-toggle"),c=document.getElementById("spec-toc-drawer"),g=c?.querySelector("[data-toc-backdrop]"),m=c?.querySelector("[data-toc-close]"),v=c?.querySelectorAll("[data-toc-link]");function p(){c?.classList.remove("hidden"),document.body.style.overflow="hidden"}function i(){c?.classList.add("hidden"),document.body.style.overflow=""}d?.addEventListener("click",p),g?.addEventListener("click",i),m?.addEventListener("click",i),v?.forEach(n=>{n.addEventListener("click",i)});const f=document.getElementById("spec");f&&d&&new IntersectionObserver(([e])=>{d.classList.toggle("hidden",!e.isIntersecting)},{threshold:0}).observe(f)}u();document.addEventListener("astro:after-swap",u);</script> </div> <!-- Main content --> <div class="flex-1 min-w-0"> <article class="prose-spec"> <!-- Terminology --> <section id="terminology"> <h2>Terminology</h2> <ul>
<li><strong>Master Branch</strong> - Must always have passing tests, is considered bleeding
edge, and must be named <code>master</code>.</li>
<li><strong>Change Branches</strong> - Any branch that introduces changes like a new feature, a
@@ -201,7 +202,7 @@ its merge target, allowing others to review, discuss and approve the changes.</l
to the new version string placed on said commit.</li>
<li><strong>Release Branches</strong> - Used both for short-term preparations of a release, and
also for long-term maintenance of older version.</li>
</ul> </section> <!-- Main specification --> <section id="specification" data-astro-cid-6lwcykzv> <h2 data-astro-cid-6lwcykzv>Specification</h2> <p>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
</ul> </section> <!-- Main specification --> <section id="specification"> <h2>Specification</h2> <p>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in <a href="https://tools.ietf.org/html/rfc2119">RFC 2119</a>.</p>
<ol>
@@ -380,14 +381,9 @@ and creates a merge commit to mark the integration of the branch with
master.</li>
</ol>
</li>
</ol> </section> </article> </div> </div> </div> </section> <section id="faq" class="py-20 sm:py-28 bg-gray-100 dark:bg-slate-900/30"> <div class="section-container"> <div class="max-w-3xl mx-auto"> <!-- Section header --> <div class="mb-12 text-center"> <h2 class="text-3xl sm:text-4xl mb-4">FAQ</h2> <p class="text-lg text-gray-600 dark:text-slate-400">
</ol> </section> </article> </div> </div> </div> </section> <section id="faq" class="py-20 sm:py-28"> <div class="section-container"> <div class="max-w-3xl mx-auto"> <!-- Section header --> <div class="mb-12 text-center"> <h2 class="text-3xl sm:text-4xl mb-4">FAQ</h2> <p class="text-lg text-gray-600 dark:text-slate-400">
Common questions about Git Common-Flow
</p> </div> <!-- FAQ Items --> <div class="space-y-0"> </div> </div> </div> </section> <script type="module">function n(){document.querySelectorAll("[data-faq-item]").forEach(r=>{const t=r.querySelector("[data-faq-trigger]"),a=r.querySelector("[data-faq-content]"),s=r.querySelector("[data-faq-icon]");!t||!a||!s||t.addEventListener("click",()=>{const e=t.getAttribute("aria-expanded")==="true";t.setAttribute("aria-expanded",e?"false":"true"),a.classList.toggle("grid-rows-[1fr]",!e),a.classList.toggle("grid-rows-[0fr]",e),s.classList.toggle("rotate-180",!e)})})}n();document.addEventListener("astro:after-swap",n);</script> </main> <footer class="py-8 text-center text-sm
text-gray-500 dark:text-slate-500
border-t border-gray-200 dark:border-slate-800"> <div class="section-container"> <p>
Git Common-Flow is authored by
<a href="https://jimeh.me/" class="hover:text-sky-600" target="_blank" rel="noopener noreferrer">
Jim Myhrberg
</a> </p> <p class="mt-2"> <a href="https://creativecommons.org/licenses/by/4.0/" class="hover:text-sky-600" target="_blank" rel="noopener noreferrer">
CC BY 4.0
</a> </p> </div> </footer> <!-- Re-init theme on Astro page transitions --> <script type="module">document.addEventListener("astro:after-swap",()=>{const e=localStorage.getItem("theme");e==="dark"||!e&&window.matchMedia("(prefers-color-scheme: dark)").matches?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")});</script> </body> </html>
</p> </div> <!-- FAQ Items --> <div class="space-y-0"> </div> </div> </div> </section> <script type="module">function n(){document.querySelectorAll("[data-faq-item]").forEach(r=>{const t=r.querySelector("[data-faq-trigger]"),a=r.querySelector("[data-faq-content]"),s=r.querySelector("[data-faq-icon]");!t||!a||!s||t.addEventListener("click",()=>{const e=t.getAttribute("aria-expanded")==="true";t.setAttribute("aria-expanded",e?"false":"true"),a.classList.toggle("grid-rows-[1fr]",!e),a.classList.toggle("grid-rows-[0fr]",e),s.classList.toggle("rotate-180",!e)})})}n();document.addEventListener("astro:after-swap",n);</script> </main> <footer class="py-8 text-center text-sm
text-gray-500 dark:text-slate-500
border-t border-gray-200 dark:border-slate-800"> <div class="section-container"> <p> Git Common-Flow is authored by
<a href="https://jimeh.me/" class="hover:text-sky-600" target="_blank" rel="noopener noreferrer"> Jim Myhrberg </a> </p> <p class="mt-2"> <a href="https://creativecommons.org/licenses/by/4.0/" class="hover:text-sky-600" target="_blank" rel="noopener noreferrer"> CC BY 4.0 </a> </p> </div> </footer> <!-- Re-init theme on Astro page transitions --> <script type="module">document.addEventListener("astro:after-swap",()=>{const e=localStorage.getItem("theme");e==="dark"||!e&&window.matchMedia("(prefers-color-scheme: dark)").matches?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")});</script> </body> </html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -10,7 +10,7 @@ interface Props {
const { introduction, summary, license } = Astro.props;
---
<section id="about" class="py-20 sm:py-28 bg-gray-100 dark:bg-slate-900/30">
<section id="about" class="py-20 sm:py-28">
<div class="section-container">
<div class="max-w-3xl mx-auto">
<!-- Section header -->
@@ -23,9 +23,7 @@ const { introduction, summary, license } = Astro.props;
</div>
<!-- Introduction -->
<div class="prose-spec mb-12">
<div class="spec-content" set:html={introduction} />
</div>
<div class="prose-spec mb-12" set:html={introduction} />
<!-- Summary as feature cards -->
<div class="mb-16">
@@ -35,7 +33,7 @@ const { introduction, summary, license } = Astro.props;
>
Key Principles
</h3>
<div class="spec-content prose-spec" set:html={summary} />
<div class="prose-spec" set:html={summary} />
</div>
<!-- Feedback & License -->
@@ -65,27 +63,10 @@ const { introduction, summary, license } = Astro.props;
>
License
</h4>
<div
class="spec-content text-gray-600 dark:text-slate-400"
set:html={license}
/>
<div class="text-gray-600 dark:text-slate-400" set:html={license} />
</div>
</div>
</div>
</div>
</div>
</section>
<style>
.spec-content :global(p:last-child) {
margin-bottom: 0;
}
.spec-content :global(a) {
color: var(--color-accent);
}
.spec-content :global(a:hover) {
color: var(--color-accent-light);
}
</style>

View File

@@ -8,7 +8,7 @@ interface Props {
const { items } = Astro.props;
---
<section id="faq" class="py-20 sm:py-28 bg-gray-100 dark:bg-slate-900/30">
<section id="faq" class="py-20 sm:py-28">
<div class="section-container">
<div class="max-w-3xl mx-auto">
<!-- Section header -->
@@ -58,7 +58,7 @@ const { items } = Astro.props;
>
<div class="overflow-hidden">
<div
class="pb-6 text-gray-600 dark:text-slate-400 prose-spec spec-content"
class="pb-6 text-gray-600 dark:text-slate-400 prose-spec"
set:html={item.answer}
/>
</div>

View File

@@ -0,0 +1,33 @@
---
import { config } from "../config";
---
<footer
class="py-8 text-center text-sm
text-gray-500 dark:text-slate-500
border-t border-gray-200 dark:border-slate-800"
>
<div class="section-container">
<p>
{config.title} is authored by
<a
href={config.authorUrl}
class="hover:text-sky-600"
target="_blank"
rel="noopener noreferrer"
>
{config.author}
</a>
</p>
<p class="mt-2">
<a
href={config.license.url}
class="hover:text-sky-600"
target="_blank"
rel="noopener noreferrer"
>
{config.license.name}
</a>
</p>
</div>
</footer>

View File

@@ -43,31 +43,37 @@ const { version } = Astro.props;
<nav class="hidden md:flex items-center gap-1">
<a
href="#about"
class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg
transition-colors cursor-pointer
class="nav-link inline-flex items-center px-4 py-2 text-sm font-medium
rounded-lg transition-colors cursor-pointer
text-gray-600 dark:text-slate-400
hover:bg-gray-100 hover:text-gray-950
dark:hover:bg-slate-800 dark:hover:text-slate-50"
data-nav-link
data-section-id="about"
>
About
</a>
<a
href="#spec"
class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg
transition-colors cursor-pointer
class="nav-link inline-flex items-center px-4 py-2 text-sm font-medium
rounded-lg transition-colors cursor-pointer
text-gray-600 dark:text-slate-400
hover:bg-gray-100 hover:text-gray-950
dark:hover:bg-slate-800 dark:hover:text-slate-50"
data-nav-link
data-section-id="spec"
>
Spec
</a>
<a
href="#faq"
class="inline-flex items-center px-4 py-2 text-sm font-medium rounded-lg
transition-colors cursor-pointer
class="nav-link inline-flex items-center px-4 py-2 text-sm font-medium
rounded-lg transition-colors cursor-pointer
text-gray-600 dark:text-slate-400
hover:bg-gray-100 hover:text-gray-950
dark:hover:bg-slate-800 dark:hover:text-slate-50"
data-nav-link
data-section-id="faq"
>
FAQ
</a>
@@ -133,19 +139,28 @@ const { version } = Astro.props;
</div>
<a
href="#about"
class="block py-2 text-gray-600 dark:text-slate-400 hover:text-sky-600"
class="nav-link block py-2 text-gray-600 dark:text-slate-400
hover:text-sky-600"
data-nav-link
data-section-id="about"
>
About
</a>
<a
href="#spec"
class="block py-2 text-gray-600 dark:text-slate-400 hover:text-sky-600"
class="nav-link block py-2 text-gray-600 dark:text-slate-400
hover:text-sky-600"
data-nav-link
data-section-id="spec"
>
Spec
</a>
<a
href="#faq"
class="block py-2 text-gray-600 dark:text-slate-400 hover:text-sky-600"
class="nav-link block py-2 text-gray-600 dark:text-slate-400
hover:text-sky-600"
data-nav-link
data-section-id="faq"
>
FAQ
</a>
@@ -162,23 +177,22 @@ const { version } = Astro.props;
if (!header || !hero) return;
// Show/hide header based on scroll past hero
// Show header when top half of hero is above the fold
const topMargin = Math.floor(window.innerHeight / 2);
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
header.classList.add("translate-y-[-100%]");
header.classList.remove("border-gray-200", "dark:border-slate-800");
} else {
header.classList.remove("translate-y-[-100%]");
header.classList.add("border-gray-200", "dark:border-slate-800");
}
},
{ threshold: 0, rootMargin: `-${topMargin}px 0px 0px 0px` }
);
// Show/hide header based on scroll position
// Show header once scrolled down by the navbar height (64px)
const navbarHeight = 64;
observer.observe(hero);
function updateHeaderVisibility() {
if (window.scrollY >= navbarHeight) {
header.classList.remove("translate-y-[-100%]");
header.classList.add("border-gray-200", "dark:border-slate-800");
} else {
header.classList.add("translate-y-[-100%]");
header.classList.remove("border-gray-200", "dark:border-slate-800");
}
}
window.addEventListener("scroll", updateHeaderVisibility, { passive: true });
updateHeaderVisibility();
// Mobile menu toggle
if (mobileMenuBtn && mobileNav) {
@@ -193,6 +207,53 @@ const { version } = Astro.props;
});
});
}
// Active section tracking for nav links
const navLinks = document.querySelectorAll("[data-nav-link]");
const sections: { id: string; element: Element }[] = [];
// Collect unique section IDs
const seenIds = new Set<string>();
navLinks.forEach((link) => {
const id = link.getAttribute("data-section-id");
if (id && !seenIds.has(id)) {
seenIds.add(id);
const section = document.getElementById(id);
if (section) {
sections.push({ id, element: section });
}
}
});
function updateActiveNavSection() {
const headerOffset = 100;
let activeId: string | null = null;
for (const { id, element } of sections) {
const rect = element.getBoundingClientRect();
if (rect.top <= headerOffset) {
activeId = id;
}
}
navLinks.forEach((link) => {
const linkId = link.getAttribute("data-section-id");
link.classList.toggle("active", linkId === activeId);
});
}
let ticking = false;
window.addEventListener("scroll", () => {
if (!ticking) {
requestAnimationFrame(() => {
updateActiveNavSection();
ticking = false;
});
ticking = true;
}
});
updateActiveNavSection();
}
// Initialize on load

View File

@@ -219,34 +219,3 @@ const { items } = Astro.props;
// Re-initialize on Astro page transitions
document.addEventListener("astro:after-swap", initSpecSidebar);
</script>
<style>
/* Active state for sidebar links (toggled by JavaScript) */
.sidebar-link.active {
color: #0284c7;
background-color: rgba(14, 165, 233, 0.15);
}
:global(.dark) .sidebar-link.active {
color: #38bdf8;
background-color: rgba(14, 165, 233, 0.2);
}
/* Scrollbar styling */
#spec-sidebar::-webkit-scrollbar {
width: 4px;
}
#spec-sidebar::-webkit-scrollbar-track {
background: transparent;
}
#spec-sidebar::-webkit-scrollbar-thumb {
background-color: #e5e5e5;
border-radius: 2px;
}
:global(.dark) #spec-sidebar::-webkit-scrollbar-thumb {
background-color: #1e293b;
}
</style>

View File

@@ -1,12 +1,17 @@
export const config = {
title: "Git Common Flow",
title: "Git Common-Flow",
description:
"An attempt to gather a sensible selection of the most common usage " +
"patterns of git into a single and concise specification.",
author: "Jim Myhrberg",
authorUrl: "https://jimeh.me/",
hostname: "commonflow.org",
url: "https://commonflow.org",
repoUrl: "https://github.com/jimeh/common-flow",
license: {
name: "CC BY 4.0",
url: "https://creativecommons.org/licenses/by/4.0/",
},
currentVersion: "1.0.0-rc.5",
versions: [

View File

@@ -69,10 +69,10 @@ interpreted as described in [RFC 2119](https://tools.ietf.org/html/rfc2119).
"master branch".
2. The master branch MUST always be in a non-broken state with its test
suite passing.
4. The master branch IS NOT guaranteed to always work in production
3. The master branch IS NOT guaranteed to always work in production
environments. Despite test suites passing it may at times contain
unfinished work. Only releases may be considered safe for production use.
5. The master branch SHOULD always be in a "as near as possibly ready for
4. The master branch SHOULD always be in a "as near as possibly ready for
release/production" state to reduce any friction with creating a new
release.
3. Change Branches
@@ -217,7 +217,7 @@ interpreted as described in [RFC 2119](https://tools.ietf.org/html/rfc2119).
5. To create a new release from a long-term release branch, you MUST follow
the same process as a release from the master branch, except the
long-term release branch takes the place of the master branch.
7. A long-term release branch should be treated with the same respect as the
6. A long-term release branch should be treated with the same respect as the
master branch. It is effectively the master branch for the release series
in question. Meaning it MUST always be in a non-broken state, MUST NOT be
force pushed to, etc.

View File

@@ -9,6 +9,7 @@ import Hero from "../components/Hero.astro";
import AboutSection from "../components/AboutSection.astro";
import SpecSection from "../components/SpecSection.astro";
import FAQSection from "../components/FAQSection.astro";
import Footer from "../components/Footer.astro";
import { parseSpecContent } from "../utils/parseSpecContent";
import { config } from "../config";
@@ -54,34 +55,5 @@ const parsed = await parseSpecContent(markdown, version);
<FAQSection items={parsed.faq} />
</main>
<!-- Footer -->
<footer
class="py-8 text-center text-sm
text-gray-500 dark:text-slate-500
border-t border-gray-200 dark:border-slate-800"
>
<div class="section-container">
<p>
Git Common-Flow is authored by
<a
href="https://jimeh.me/"
class="hover:text-sky-600"
target="_blank"
rel="noopener noreferrer"
>
Jim Myhrberg
</a>
</p>
<p class="mt-2">
<a
href="https://creativecommons.org/licenses/by/4.0/"
class="hover:text-sky-600"
target="_blank"
rel="noopener noreferrer"
>
CC BY 4.0
</a>
</p>
</div>
</footer>
<Footer />
</SinglePage>

View File

@@ -9,6 +9,7 @@ import Hero from "../../components/Hero.astro";
import AboutSection from "../../components/AboutSection.astro";
import SpecSection from "../../components/SpecSection.astro";
import FAQSection from "../../components/FAQSection.astro";
import Footer from "../../components/Footer.astro";
import { parseSpecContent } from "../../utils/parseSpecContent";
import { config } from "../../config";
@@ -56,34 +57,5 @@ const parsed = await parseSpecContent(markdown, version);
<FAQSection items={parsed.faq} />
</main>
<!-- Footer -->
<footer
class="py-8 text-center text-sm
text-gray-500 dark:text-slate-500
border-t border-gray-200 dark:border-slate-800"
>
<div class="section-container">
<p>
Git Common-Flow is authored by
<a
href="https://jimeh.me/"
class="hover:text-sky-600"
target="_blank"
rel="noopener noreferrer"
>
Jim Myhrberg
</a>
</p>
<p class="mt-2">
<a
href="https://creativecommons.org/licenses/by/4.0/"
class="hover:text-sky-600"
target="_blank"
rel="noopener noreferrer"
>
CC BY 4.0
</a>
</p>
</div>
</footer>
<Footer />
</SinglePage>

View File

@@ -57,13 +57,13 @@ html {
font-weight: 400;
line-height: 1.7;
overflow-x: hidden;
background-color: #fafafa;
color: #0a0a0a;
background-color: theme(colors.slate.50);
color: theme(colors.slate.950);
}
.dark body {
background-color: #020617;
color: #f8fafc;
background-color: theme(colors.slate.950);
color: theme(colors.slate.50);
}
/* Typography */
@@ -77,7 +77,7 @@ html {
font-weight: 700;
line-height: 1.2;
letter-spacing: -0.02em;
color: #0a0a0a;
color: theme(colors.slate.950);
}
.dark h1,
@@ -86,7 +86,7 @@ html {
.dark h4,
.dark h5,
.dark h6 {
color: #f8fafc;
color: theme(colors.slate.50);
}
h1 {
@@ -142,11 +142,11 @@ html {
padding: 1.25rem;
overflow-x: auto;
line-height: 1.6;
background-color: #e5e5e5;
background-color: theme(colors.slate.200);
}
.dark pre {
background-color: #0f172a;
background-color: theme(colors.slate.900);
}
pre>code {
@@ -192,11 +192,11 @@ html {
padding-left: 1.5rem;
margin: 1.5rem 0;
font-style: italic;
color: #525252;
color: theme(colors.slate.600);
}
.dark blockquote {
color: #94a3b8;
color: theme(colors.slate.400);
}
/* Strong text */
@@ -204,16 +204,6 @@ html {
font-weight: 600;
}
/* Selection */
::selection {
background-color: rgba(14, 165, 233, 0.2);
color: #0a0a0a;
}
.dark ::selection {
color: #f8fafc;
}
/* Focus styles */
:focus-visible {
outline: 2px solid var(--color-accent);
@@ -340,6 +330,7 @@ html {
/* Component styles */
@layer components {
/* Section container - uses CSS vars, keep here */
.section-container {
max-width: calc(var(--content-max-width) + var(--sidebar-width) + 4rem);
@@ -357,11 +348,11 @@ html {
margin-top: 3rem;
margin-bottom: 1.5rem;
padding-bottom: 0.75rem;
border-bottom: 1px solid #e5e5e5;
border-bottom: 1px solid theme(colors.slate.200);
}
.dark .prose-spec h2 {
border-bottom-color: #1e293b;
border-bottom-color: theme(colors.slate.800);
}
.prose-spec h2:first-child {
@@ -373,35 +364,35 @@ html {
font-weight: 600;
margin-top: 2rem;
margin-bottom: 1rem;
color: #525252;
color: theme(colors.slate.600);
}
.dark .prose-spec h3 {
color: #94a3b8;
color: theme(colors.slate.400);
}
.prose-spec p {
color: #525252;
color: theme(colors.slate.600);
}
.dark .prose-spec p {
color: #94a3b8;
color: theme(colors.slate.400);
}
.prose-spec strong {
color: #0a0a0a;
color: theme(colors.slate.950);
}
.dark .prose-spec strong {
color: #f8fafc;
color: theme(colors.slate.50);
}
.prose-spec li {
color: #525252;
color: theme(colors.slate.600);
}
.dark .prose-spec li {
color: #94a3b8;
color: theme(colors.slate.400);
}
/* Nested ordered list counters (spec numbering: 1., 1.1., 1.2.) */
@@ -411,19 +402,19 @@ html {
list-style: none;
}
.prose-spec ol > li {
.prose-spec ol>li {
counter-increment: item;
position: relative;
}
.prose-spec ol > li::before {
.prose-spec ol>li::before {
content: counters(item, ".") ".";
position: absolute;
left: -2.5rem;
width: 2rem;
text-align: right;
font-weight: 500;
color: #737373;
color: theme(colors.slate.500);
}
.prose-spec img {
@@ -432,4 +423,48 @@ html {
border-radius: 8px;
margin: 2rem 0;
}
.prose-spec p:last-child {
margin-bottom: 0;
}
/* Nav link active state (toggled by JavaScript) */
.nav-link.active {
color: theme(colors.sky.600) !important;
background-color: theme(colors.sky.500 / 15%) !important;
}
.dark .nav-link.active {
color: theme(colors.sky.400) !important;
background-color: theme(colors.sky.500 / 20%) !important;
}
/* Sidebar link active state (toggled by JavaScript) */
.sidebar-link.active {
color: theme(colors.sky.600) !important;
background-color: theme(colors.sky.500 / 15%) !important;
}
.dark .sidebar-link.active {
color: theme(colors.sky.400) !important;
background-color: theme(colors.sky.500 / 20%) !important;
}
/* Sidebar scrollbar styling */
#spec-sidebar::-webkit-scrollbar {
width: 4px;
}
#spec-sidebar::-webkit-scrollbar-track {
background: transparent;
}
#spec-sidebar::-webkit-scrollbar-thumb {
background-color: theme(colors.slate.200);
border-radius: 2px;
}
.dark #spec-sidebar::-webkit-scrollbar-thumb {
background-color: theme(colors.slate.800);
}
}