mirror of
https://github.com/jimeh/commonflow.org.git
synced 2026-02-19 05:46:40 +00:00
341 lines
44 KiB
HTML
341 lines
44 KiB
HTML
<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><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"><!-- Open Graph --><meta property="og:title" content="Git Common-Flow 1.0.0-rc.1"><meta property="og:description" content="An attempt to gather a sensible selection of the most common usage patterns of git into a single and concise specification."><meta property="og:type" content="website"><meta property="og:url" content="https://commonflow.org/1.0.0-rc.1"><!-- Twitter --><meta name="twitter:card" content="summary"><meta name="twitter:title" content="Git Common-Flow 1.0.0-rc.1"><meta name="twitter:description" content="An attempt to gather a sensible selection of the most common usage patterns of git into a single and concise specification."><title>Git Common-Flow 1.0.0-rc.1</title><!-- Fonts - distinctive choices --><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"><!-- Favicon --><link rel="icon" type="image/svg+xml" href="/favicon.svg"><!-- Theme initialization - prevent flash --><script>
|
|
(function () {
|
|
const theme = localStorage.getItem("theme");
|
|
if (
|
|
theme === "dark" ||
|
|
(!theme && window.matchMedia("(prefers-color-scheme: dark)").matches)
|
|
) {
|
|
document.documentElement.classList.add("dark");
|
|
}
|
|
})();
|
|
</script><link rel="stylesheet" href="/_astro/index.DViPM5fQ.css">
|
|
<style>select[data-astro-cid-wyud3ywt] option[data-astro-cid-wyud3ywt]{background-color:var(--color-bg-primary);color:var(--color-text-primary)}.dark select[data-astro-cid-wyud3ywt] option[data-astro-cid-wyud3ywt]{background-color:var(--color-dark-bg-primary);color:var(--color-dark-text-primary)}.header-title[data-astro-cid-3ef6ksr2]{color:var(--color-text-primary)}.dark .header-title[data-astro-cid-3ef6ksr2]{color:var(--color-dark-text-primary)}.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)}#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:var(--color-border);border-radius:2px}.dark #spec-sidebar[data-astro-cid-lfaoh65k]::-webkit-scrollbar-thumb{background:var(--color-dark-border)}.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;border-bottom:1px solid var(--color-border);color:var(--color-text-primary);scroll-margin-top:calc(var(--header-height) + 2rem)}.dark .spec-content[data-astro-cid-6lwcykzv] h2{border-bottom-color:var(--color-dark-border);color:var(--color-dark-text-primary)}.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:var(--color-text-secondary)}.dark .spec-content[data-astro-cid-6lwcykzv] h3{color:var(--color-dark-text-secondary)}.spec-content[data-astro-cid-6lwcykzv] p{margin-bottom:1.25rem;color:var(--color-text-secondary)}.dark .spec-content[data-astro-cid-6lwcykzv] p{color:var(--color-dark-text-secondary)}.spec-content[data-astro-cid-6lwcykzv] strong{color:var(--color-text-primary);font-weight:600}.dark .spec-content[data-astro-cid-6lwcykzv] strong{color:var(--color-dark-text-primary)}.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:var(--color-text-muted)}.dark .spec-content[data-astro-cid-6lwcykzv] ol>li:before{color:var(--color-dark-text-muted)}.spec-content[data-astro-cid-6lwcykzv] li{margin-bottom:.5rem;color:var(--color-text-secondary)}.dark .spec-content[data-astro-cid-6lwcykzv] li{color:var(--color-dark-text-secondary)}.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;color:var(--color-text-muted);font-style:italic}.dark .spec-content[data-astro-cid-6lwcykzv] blockquote{color:var(--color-dark-text-muted)}.spec-content[data-astro-cid-6lwcykzv] img{max-width:100%;height:auto;border-radius:8px;margin:2rem 0}.faq-section[data-astro-cid-hqz3ghsx]{background-color:var(--color-bg-secondary)}.dark .faq-section[data-astro-cid-hqz3ghsx]{background-color:var(--color-dark-bg-secondary)}.spec-content[data-astro-cid-hqz3ghsx] p:last-child{margin-bottom:0}.spec-content[data-astro-cid-hqz3ghsx] ul,.spec-content[data-astro-cid-hqz3ghsx] ol{margin-top:1rem}.spec-content[data-astro-cid-hqz3ghsx] li{color:var(--color-text-secondary)}.dark .spec-content[data-astro-cid-hqz3ghsx] li{color:var(--color-dark-text-secondary)}
|
|
</style></head> <body class="min-h-screen"> <header id="site-header" class="fixed top-0 inset-x-0 z-50 glass border-b border-transparent
|
|
translate-y-[-100%] transition-transform duration-300" data-astro-cid-3ef6ksr2> <div class="max-w-6xl mx-auto px-4 sm:px-6 h-16 flex items-center justify-between" data-astro-cid-3ef6ksr2> <!-- Logo / Title --> <a href="#hero" class="header-title flex items-center gap-3 no-underline
|
|
hover:text-[var(--color-accent)] transition-colors" data-astro-cid-3ef6ksr2> <span class="font-display font-bold text-lg tracking-tight" data-astro-cid-3ef6ksr2>
|
|
Git Common-Flow
|
|
</span> </a> <!-- Desktop Navigation --> <nav class="hidden md:flex items-center gap-1" data-astro-cid-3ef6ksr2> <a href="#about" class="btn btn-ghost text-sm" data-astro-cid-3ef6ksr2>About</a> <a href="#spec" class="btn btn-ghost text-sm" data-astro-cid-3ef6ksr2>Spec</a> <a href="#faq" class="btn btn-ghost text-sm" data-astro-cid-3ef6ksr2>FAQ</a> </nav> <!-- Right side: Version, Theme, GitHub --> <div class="flex items-center gap-3" data-astro-cid-3ef6ksr2> <div class="version-selector relative" data-astro-cid-wyud3ywt> <select data-version-select class="appearance-none bg-transparent border border-[var(--color-border)]
|
|
dark:border-[var(--color-dark-border)] rounded-lg px-3 py-1.5
|
|
pr-8 text-sm font-mono cursor-pointer
|
|
text-[var(--color-text-secondary)]
|
|
dark:text-[var(--color-dark-text-secondary)]
|
|
hover:border-[var(--color-accent)]
|
|
focus:border-[var(--color-accent)]
|
|
focus:outline-none transition-colors" data-astro-cid-wyud3ywt> <option value="1.0.0-rc.5" data-astro-cid-wyud3ywt>
|
|
v1.0.0-rc.5 </option><option value="1.0.0-rc.4" data-astro-cid-wyud3ywt>
|
|
v1.0.0-rc.4 </option><option value="1.0.0-rc.3" data-astro-cid-wyud3ywt>
|
|
v1.0.0-rc.3 </option><option value="1.0.0-rc.2" data-astro-cid-wyud3ywt>
|
|
v1.0.0-rc.2 </option><option value="1.0.0-rc.1" selected data-astro-cid-wyud3ywt>
|
|
v1.0.0-rc.1 </option> </select> <!-- Dropdown arrow --> <svg class="absolute right-2 top-1/2 -translate-y-1/2 w-4 h-4 pointer-events-none
|
|
text-[var(--color-text-muted)] dark:text-[var(--color-dark-text-muted)]" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-wyud3ywt> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" data-astro-cid-wyud3ywt></path> </svg> </div> <script type="module">function t(){document.querySelectorAll("[data-version-select]").forEach(e=>{e.dataset.initialized||(e.dataset.initialized="true",e.addEventListener("change",n=>{const a=n.target.value;window.location.href=`/spec/${a}`}))})}t();document.addEventListener("astro:after-swap",t);</script> <button data-theme-toggle type="button" class="p-2 rounded-lg text-[var(--color-text-muted)]
|
|
dark:text-[var(--color-dark-text-muted)]
|
|
hover:text-[var(--color-text-primary)]
|
|
dark:hover:text-[var(--color-dark-text-primary)]
|
|
hover:bg-[var(--color-bg-secondary)]
|
|
dark:hover:bg-[var(--color-dark-bg-secondary)]
|
|
transition-colors duration-200" aria-label="Toggle dark mode"> <!-- Sun icon (shown in dark mode) --> <svg data-sun-icon class="hidden w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343
|
|
6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16
|
|
12a4 4 0 11-8 0 4 4 0 018 0z"></path> </svg> <!-- Moon icon (shown in light mode) --> <svg data-moon-icon class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003
|
|
9.003 0 008.354-5.646z"></path> </svg> </button> <script type="module">function n(){const c=document.querySelectorAll("[data-theme-toggle]");function o(){const e=localStorage.getItem("theme");return e==="dark"||e==="light"?e:window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function r(e){document.querySelectorAll("[data-sun-icon]").forEach(t=>{t.classList.toggle("hidden",!e)}),document.querySelectorAll("[data-moon-icon]").forEach(t=>{t.classList.toggle("hidden",e)})}function a(e){localStorage.setItem("theme",e),document.documentElement.classList.toggle("dark",e==="dark"),r(e==="dark")}const d=o();a(d),c.forEach(e=>{e.dataset.initialized||(e.dataset.initialized="true",e.addEventListener("click",()=>{const t=document.documentElement.classList.contains("dark");a(t?"light":"dark")}))}),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{localStorage.getItem("theme")||a(e.matches?"dark":"light")})}n();document.addEventListener("astro:after-swap",n);</script> <a href="https://github.com/jimeh/common-flow" target="_blank" rel="noopener noreferrer" class="p-2 rounded-lg text-[var(--color-text-muted)]
|
|
dark:text-[var(--color-dark-text-muted)]
|
|
hover:text-[var(--color-text-primary)]
|
|
dark:hover:text-[var(--color-dark-text-primary)]
|
|
hover:bg-[var(--color-bg-secondary)]
|
|
dark:hover:bg-[var(--color-dark-bg-secondary)]
|
|
transition-colors" aria-label="View on GitHub" data-astro-cid-3ef6ksr2> <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24" data-astro-cid-3ef6ksr2> <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" data-astro-cid-3ef6ksr2></path> </svg> </a> <!-- Mobile menu button --> <button id="mobile-menu-btn" class="md:hidden p-2 rounded-lg text-[var(--color-text-muted)]
|
|
dark:text-[var(--color-dark-text-muted)]
|
|
hover:bg-[var(--color-bg-secondary)]
|
|
dark:hover:bg-[var(--color-dark-bg-secondary)]" aria-label="Toggle menu" data-astro-cid-3ef6ksr2> <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-3ef6ksr2> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" data-astro-cid-3ef6ksr2></path> </svg> </button> </div> </div> <!-- Mobile Navigation --> <nav id="mobile-nav" class="md:hidden hidden border-t border-[var(--color-border)]
|
|
dark:border-[var(--color-dark-border)]" data-astro-cid-3ef6ksr2> <div class="px-4 py-3 space-y-1" data-astro-cid-3ef6ksr2> <a href="#about" class="block py-2 text-[var(--color-text-secondary)]
|
|
dark:text-[var(--color-dark-text-secondary)]
|
|
hover:text-[var(--color-accent)]" data-astro-cid-3ef6ksr2>
|
|
About
|
|
</a> <a href="#spec" class="block py-2 text-[var(--color-text-secondary)]
|
|
dark:text-[var(--color-dark-text-secondary)]
|
|
hover:text-[var(--color-accent)]" data-astro-cid-3ef6ksr2>
|
|
Spec
|
|
</a> <a href="#faq" class="block py-2 text-[var(--color-text-secondary)]
|
|
dark:text-[var(--color-dark-text-secondary)]
|
|
hover:text-[var(--color-accent)]" data-astro-cid-3ef6ksr2>
|
|
FAQ
|
|
</a> </div> </nav> </header> <script type="module">function d(){const e=document.getElementById("site-header"),o=document.getElementById("hero"),s=document.getElementById("mobile-menu-btn"),r=document.getElementById("mobile-nav");if(!e||!o)return;new IntersectionObserver(([t])=>{t.isIntersecting?(e.classList.add("translate-y-[-100%]"),e.classList.remove("border-[var(--color-border)]"),e.classList.remove("dark:border-[var(--color-dark-border)]")):(e.classList.remove("translate-y-[-100%]"),e.classList.add("border-[var(--color-border)]"),e.classList.add("dark:border-[var(--color-dark-border)]"))},{threshold:0,rootMargin:"-64px 0px 0px 0px"}).observe(o),s&&r&&(s.addEventListener("click",()=>{r.classList.toggle("hidden")}),r.querySelectorAll("a").forEach(t=>{t.addEventListener("click",()=>{r.classList.add("hidden")})}))}d();document.addEventListener("astro:after-swap",d);</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-[var(--color-bg-secondary)]
|
|
to-[var(--color-bg-primary)]
|
|
dark:from-[var(--color-dark-bg-secondary)]
|
|
dark:to-[var(--color-dark-bg-primary)]"></div> <!-- Subtle grid pattern --> <div class="absolute inset-0 opacity-[0.03] dark:opacity-[0.05]" style="background-image: linear-gradient(var(--color-text-primary) 1px, transparent 1px),
|
|
linear-gradient(90deg, var(--color-text-primary) 1px, transparent 1px);
|
|
background-size: 60px 60px;"></div> <!-- Top bar with version & theme --> <div class="absolute top-0 inset-x-0 flex items-center justify-between
|
|
px-6 py-4 animate-fade-in-down"> <div class="flex items-center gap-3"> <div class="version-selector relative" data-astro-cid-wyud3ywt> <select data-version-select class="appearance-none bg-transparent border border-[var(--color-border)]
|
|
dark:border-[var(--color-dark-border)] rounded-lg px-3 py-1.5
|
|
pr-8 text-sm font-mono cursor-pointer
|
|
text-[var(--color-text-secondary)]
|
|
dark:text-[var(--color-dark-text-secondary)]
|
|
hover:border-[var(--color-accent)]
|
|
focus:border-[var(--color-accent)]
|
|
focus:outline-none transition-colors" data-astro-cid-wyud3ywt> <option value="1.0.0-rc.5" data-astro-cid-wyud3ywt>
|
|
v1.0.0-rc.5 </option><option value="1.0.0-rc.4" data-astro-cid-wyud3ywt>
|
|
v1.0.0-rc.4 </option><option value="1.0.0-rc.3" data-astro-cid-wyud3ywt>
|
|
v1.0.0-rc.3 </option><option value="1.0.0-rc.2" data-astro-cid-wyud3ywt>
|
|
v1.0.0-rc.2 </option><option value="1.0.0-rc.1" selected data-astro-cid-wyud3ywt>
|
|
v1.0.0-rc.1 </option> </select> <!-- Dropdown arrow --> <svg class="absolute right-2 top-1/2 -translate-y-1/2 w-4 h-4 pointer-events-none
|
|
text-[var(--color-text-muted)] dark:text-[var(--color-dark-text-muted)]" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-wyud3ywt> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" data-astro-cid-wyud3ywt></path> </svg> </div> </div> <div class="flex items-center gap-2"> <button data-theme-toggle type="button" class="p-2 rounded-lg text-[var(--color-text-muted)]
|
|
dark:text-[var(--color-dark-text-muted)]
|
|
hover:text-[var(--color-text-primary)]
|
|
dark:hover:text-[var(--color-dark-text-primary)]
|
|
hover:bg-[var(--color-bg-secondary)]
|
|
dark:hover:bg-[var(--color-dark-bg-secondary)]
|
|
transition-colors duration-200" aria-label="Toggle dark mode"> <!-- Sun icon (shown in dark mode) --> <svg data-sun-icon class="hidden w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343
|
|
6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16
|
|
12a4 4 0 11-8 0 4 4 0 018 0z"></path> </svg> <!-- Moon icon (shown in light mode) --> <svg data-moon-icon class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003
|
|
9.003 0 008.354-5.646z"></path> </svg> </button> <a href="https://github.com/jimeh/common-flow" target="_blank" rel="noopener noreferrer" class="p-2 rounded-lg text-[var(--color-text-muted)]
|
|
dark:text-[var(--color-dark-text-muted)]
|
|
hover:text-[var(--color-text-primary)]
|
|
dark:hover:text-[var(--color-dark-text-primary)]
|
|
hover:bg-white/50 dark:hover:bg-white/10
|
|
transition-colors" aria-label="View on GitHub"> <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"> <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd"></path> </svg> </a> </div> </div> <!-- Main content --> <div class="relative z-10 w-full max-w-4xl mx-auto text-center"> <!-- Title --> <h1 class="animate-fade-in-up mb-4
|
|
text-[var(--color-text-primary)]
|
|
dark:text-[var(--color-dark-text-primary)]">
|
|
Git Common-Flow
|
|
</h1> <!-- Tagline --> <p class="animate-fade-in-up delay-100
|
|
text-lg sm:text-xl max-w-2xl mx-auto mb-8
|
|
text-[var(--color-text-secondary)]
|
|
dark:text-[var(--color-dark-text-secondary)]">
|
|
A sensible git workflow for teams who ship
|
|
</p> <!-- Version badge --> <div class="animate-fade-in-up delay-200 mb-10"> <span class="version-badge">v1.0.0-rc.1</span> </div> <!-- SVG Diagram --> <div class="animate-fade-in-up delay-300
|
|
relative mx-auto mb-12 p-4 sm:p-8
|
|
bg-white dark:bg-[var(--color-dark-bg-secondary)]
|
|
rounded-2xl shadow-lg dark:shadow-none
|
|
border border-[var(--color-border)]
|
|
dark:border-[var(--color-dark-border)]"> <img src="/spec/1.0.0-rc.1.svg" alt="Git Common-Flow diagram" class="w-full h-auto max-w-3xl mx-auto
|
|
dark:invert dark:hue-rotate-180 dark:contrast-90"> </div> <!-- Navigation links --> <nav class="animate-fade-in-up delay-400
|
|
flex flex-wrap items-center justify-center gap-4"> <a href="#about" class="btn btn-ghost">About</a> <a href="#spec" class="btn btn-primary">Read the Spec</a> <a href="#faq" class="btn btn-ghost">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-[var(--color-text-muted)]
|
|
dark:text-[var(--color-dark-text-muted)]
|
|
hover:text-[var(--color-accent)] 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-[var(--color-text-secondary)]
|
|
dark:text-[var(--color-dark-text-secondary)]" data-astro-cid-x2lc2h5w>
|
|
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-[var(--color-text-primary)]
|
|
dark:text-[var(--color-dark-text-primary)]" data-astro-cid-x2lc2h5w>
|
|
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
|
|
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> <!-- Author & License --> <div class="pt-8 border-t border-[var(--color-border)]
|
|
dark:border-[var(--color-dark-border)]" 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-[var(--color-text-muted)]
|
|
dark:text-[var(--color-dark-text-muted)]" data-astro-cid-x2lc2h5w>
|
|
Author
|
|
</h4> <div class="spec-content text-[var(--color-text-secondary)]
|
|
dark:text-[var(--color-dark-text-secondary)]" data-astro-cid-x2lc2h5w><p>The Git Common-Flow specification is authored
|
|
by <a href="http://jimeh.me">Jim Myhrberg</a>.</p>
|
|
<p>If you'd like to leave feedback,
|
|
please <a href="https://github.com/jimeh/common-flow/issues">open an issue on GitHub</a>.</p></div> </div> <div data-astro-cid-x2lc2h5w> <h4 class="text-sm font-semibold uppercase tracking-wider mb-3
|
|
text-[var(--color-text-muted)]
|
|
dark:text-[var(--color-dark-text-muted)]" data-astro-cid-x2lc2h5w>
|
|
License
|
|
</h4> <div class="spec-content text-[var(--color-text-secondary)]
|
|
dark:text-[var(--color-dark-text-secondary)]" 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-[var(--color-text-secondary)]
|
|
dark:text-[var(--color-dark-text-secondary)]" data-astro-cid-6lwcykzv>
|
|
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
|
|
lg:max-h-[calc(100vh-8rem)] lg:overflow-y-auto
|
|
lg:pr-8 lg:mr-8 lg:border-r border-[var(--color-border)]
|
|
dark:border-[var(--color-dark-border)]" 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-[var(--color-text-muted)]
|
|
dark:text-[var(--color-dark-text-muted)]" data-astro-cid-lfaoh65k>
|
|
On This Page
|
|
</div> <a href="#summary" class="sidebar-link " data-sidebar-link data-section-id="summary" data-astro-cid-lfaoh65k> Summary </a><a href="#terminology" class="sidebar-link " data-sidebar-link data-section-id="terminology" data-astro-cid-lfaoh65k> Terminology </a><a href="#specification" class="sidebar-link " data-sidebar-link data-section-id="specification" data-astro-cid-lfaoh65k> Specification </a><a href="#spec-tldr" class="sidebar-link sidebar-link-sub" data-sidebar-link data-section-id="spec-tldr" data-astro-cid-lfaoh65k> TL;DR </a><a href="#spec-the-master-branch" class="sidebar-link sidebar-link-sub" 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 sidebar-link-sub" data-sidebar-link data-section-id="spec-change-branches" data-astro-cid-lfaoh65k> Change Branches </a><a href="#spec-pull-requests" class="sidebar-link sidebar-link-sub" data-sidebar-link data-section-id="spec-pull-requests" data-astro-cid-lfaoh65k> Pull Requests </a><a href="#spec-versioning" class="sidebar-link sidebar-link-sub" data-sidebar-link data-section-id="spec-versioning" data-astro-cid-lfaoh65k> Versioning </a><a href="#spec-releases" class="sidebar-link sidebar-link-sub" data-sidebar-link data-section-id="spec-releases" data-astro-cid-lfaoh65k> Releases </a><a href="#spec-short-term-release-branches" class="sidebar-link sidebar-link-sub" data-sidebar-link data-section-id="spec-short-term-release-branches" data-astro-cid-lfaoh65k> Short-Term Release Branches </a><a href="#spec-long-term-release-branches" class="sidebar-link sidebar-link-sub" data-sidebar-link data-section-id="spec-long-term-release-branches" data-astro-cid-lfaoh65k> Long-term Release Branches </a><a href="#spec-bug-fixes-rollback" class="sidebar-link sidebar-link-sub" data-sidebar-link data-section-id="spec-bug-fixes-rollback" data-astro-cid-lfaoh65k> Bug Fixes & Rollback </a><a href="#spec-git-best-practices" class="sidebar-link sidebar-link-sub" 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
|
|
w-12 h-12 rounded-full shadow-lg
|
|
bg-[var(--color-accent)] text-white
|
|
flex items-center justify-center
|
|
hover:bg-[var(--color-accent-light)]
|
|
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
|
|
bg-[var(--color-bg-primary)] dark:bg-[var(--color-dark-bg-primary)]
|
|
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-[var(--color-text-muted)]
|
|
dark:text-[var(--color-dark-text-muted)]" data-astro-cid-lfaoh65k>
|
|
Jump to Section
|
|
</span> <button class="p-2 rounded-lg hover:bg-[var(--color-bg-secondary)]
|
|
dark:hover:bg-[var(--color-dark-bg-secondary)]" 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="#summary" class="sidebar-link " data-toc-link data-astro-cid-lfaoh65k> Summary </a><a href="#terminology" class="sidebar-link " data-toc-link data-astro-cid-lfaoh65k> Terminology </a><a href="#specification" class="sidebar-link " data-toc-link data-astro-cid-lfaoh65k> Specification </a><a href="#spec-tldr" class="sidebar-link sidebar-link-sub" data-toc-link data-astro-cid-lfaoh65k> TL;DR </a><a href="#spec-the-master-branch" class="sidebar-link sidebar-link-sub" data-toc-link data-astro-cid-lfaoh65k> The Master Branch </a><a href="#spec-change-branches" class="sidebar-link sidebar-link-sub" data-toc-link data-astro-cid-lfaoh65k> Change Branches </a><a href="#spec-pull-requests" class="sidebar-link sidebar-link-sub" data-toc-link data-astro-cid-lfaoh65k> Pull Requests </a><a href="#spec-versioning" class="sidebar-link sidebar-link-sub" data-toc-link data-astro-cid-lfaoh65k> Versioning </a><a href="#spec-releases" class="sidebar-link sidebar-link-sub" data-toc-link data-astro-cid-lfaoh65k> Releases </a><a href="#spec-short-term-release-branches" class="sidebar-link sidebar-link-sub" data-toc-link data-astro-cid-lfaoh65k> Short-Term Release Branches </a><a href="#spec-long-term-release-branches" class="sidebar-link sidebar-link-sub" data-toc-link data-astro-cid-lfaoh65k> Long-term Release Branches </a><a href="#spec-bug-fixes-rollback" class="sidebar-link sidebar-link-sub" data-toc-link data-astro-cid-lfaoh65k> Bug Fixes & Rollback </a><a href="#spec-git-best-practices" class="sidebar-link sidebar-link-sub" data-toc-link data-astro-cid-lfaoh65k> Git Best Practices </a> </nav> </div> </div> <script type="module">function l(){const r=document.querySelectorAll("[data-sidebar-link]"),d=new Map;r.forEach(e=>{const t=e.getAttribute("data-section-id");if(t){const o=document.getElementById(t);o&&d.set(t,o)}});const g=new IntersectionObserver(e=>{e.forEach(t=>{if(t.isIntersecting){const o=t.target.getAttribute("id");r.forEach(a=>{const E=a.getAttribute("data-section-id");a.classList.toggle("active",E===o)})}})},{rootMargin:"-20% 0% -60% 0%",threshold:0});d.forEach(e=>g.observe(e));const n=document.getElementById("spec-toc-toggle"),c=document.getElementById("spec-toc-drawer"),u=c?.querySelector("[data-toc-backdrop]"),b=c?.querySelector("[data-toc-close]"),v=c?.querySelectorAll("[data-toc-link]");function f(){c?.classList.remove("hidden"),document.body.style.overflow="hidden"}function s(){c?.classList.add("hidden"),document.body.style.overflow=""}n?.addEventListener("click",f),u?.addEventListener("click",s),b?.addEventListener("click",s),v?.forEach(e=>{e.addEventListener("click",s)});const i=document.getElementById("spec");i&&n&&new IntersectionObserver(([t])=>{n.classList.toggle("hidden",!t.isIntersecting)},{threshold:0}).observe(i)}l();document.addEventListener("astro:after-swap",l);</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>
|
|
<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
|
|
bug fix, etc.</li>
|
|
<li><strong>Source Branch</strong> - The branch that a change branch was created from. New
|
|
changes in the source branch should be incorporated into the change branch via
|
|
rebasing.</li>
|
|
<li><strong>Merge Target</strong> - A branch that is the intended merge target for a change
|
|
branch. Typically the merge target branch will be the same as the source
|
|
branch.</li>
|
|
<li><strong>Maintenance Branches</strong> - Used for maintaining old versions and releasing
|
|
PATCH updates when the master branch has moved on. Should follow a
|
|
<code>stable-X.Y</code> naming pattern, where <code>X</code> is MAJOR version and <code>Y</code> is MINOR
|
|
version.</li>
|
|
<li><strong>Pull Request</strong> - A means of requesting that a change branch is merged in to
|
|
its merge target, allowing others to review, discuss and approve the changes.</li>
|
|
<li><strong>Release</strong> - Consists of a version bump commit directly on the master branch,
|
|
and a git tag named according to the new version string placed on said commit.</li>
|
|
<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>Git Common-Flow 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>
|
|
<li>The Master Branch
|
|
<ol>
|
|
<li>A branch named "master" MUST exist and it MUST be referred to as the
|
|
"master branch".</li>
|
|
<li>The master branch MUST be considered bleeding edge.</li>
|
|
<li>The master branch MUST always be in a non-broken state with its test
|
|
suite passing.</li>
|
|
<li>The master branch SHOULD always be in a "as near as possible ready for
|
|
release/production" state to reduce the friction of creating a new
|
|
release.</li>
|
|
</ol>
|
|
</li>
|
|
<li>Changes
|
|
<ol>
|
|
<li>Changes MUST be performed on a separate branch that SHOULD be referred to
|
|
as a "change branch". All change branches MUST have descriptive names. It
|
|
is RECOMMENDED that you commit often locally, and you SHOULD regularly
|
|
push your work to the same named branch on the remote server.</li>
|
|
<li>When a change branch is created, the branch that it is created from
|
|
SHOULD be referred to as the "source branch". Each change branch also
|
|
needs a designated "merge target branch", typically this will be the same
|
|
as the source branch.</li>
|
|
<li>Change branches MUST be regularly updated with any changes from their
|
|
source branch. This MUST be done by rebasing the change branch on top of
|
|
the source branch. To be clear you MUST NOT merge a source branch into a
|
|
change branch.</li>
|
|
<li>After rebasing a change branch on top of its source branch you MUST push
|
|
the change branch to the remote server. This will require you do a force
|
|
push, and you SHOULD use the "--force-with-lease" git push option.</li>
|
|
<li>To merge a change branch into its merge target branch, you MUST open a
|
|
"pull request" (or equivalent) so others can review and approve your
|
|
changes.</li>
|
|
<li>A pull request MUST only be merged when the change branch is up-to-date
|
|
with its source branch, the test suite is passing, and you and others are
|
|
happy with the change. This is especially important if the merge target
|
|
is the master branch.</li>
|
|
<li>To get feedback, help, or generally just discuss a change branch with
|
|
others, it is RECOMMENDED you do this by creating a pull request and
|
|
discuss the changes with others there.</li>
|
|
</ol>
|
|
</li>
|
|
<li>Git Best Practices
|
|
<ol>
|
|
<li>All commit messages SHOULD follow the Commit Guidelines and format from
|
|
the official git
|
|
documentation:
|
|
<a href="https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project">https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project</a></li>
|
|
<li>You SHOULD always use "--force-with-lease" when doing a force push. The
|
|
plain "--force" option is dangerous and destructive. More
|
|
information:
|
|
<a href="https://developer.atlassian.com/blog/2015/04/force-with-lease/">https://developer.atlassian.com/blog/2015/04/force-with-lease/</a></li>
|
|
<li>You SHOULD understand and be comfortable with
|
|
rebasing: <a href="https://git-scm.com/book/en/v2/Git-Branching-Rebasing">https://git-scm.com/book/en/v2/Git-Branching-Rebasing</a></li>
|
|
<li>It is RECOMMENDED that you always do "git pull --rebase" instead of "git
|
|
pull" to avoid unnecessary merge commits. You can make this the default
|
|
behavior of "git pull" with "git config --global pull.rebase true".</li>
|
|
<li>It is RECOMMENDED that all branches be merged using "git merge --no-ff".
|
|
This makes sure the reference to the original branch is kept in the commits,
|
|
allows one to revert a merge by reverting a single merge commit, and creates
|
|
a merge commit to mark the integration of the branch with master.</li>
|
|
</ol>
|
|
</li>
|
|
<li>Versioning
|
|
<ol>
|
|
<li>The project MUST have its version hard-coded somewhere in the
|
|
code-base. It is RECOMMENDED that this is done in a file called "VERSION"
|
|
located in the root of the project.</li>
|
|
<li>If you are using a "VERSION" file in the root of the project, this MUST
|
|
only contain the exact version string.</li>
|
|
<li>The version string SHOULD follow the Semantic Versioning
|
|
(<a href="http://semver.org/">http://semver.org/</a>) format. Use of Semantic Versioning is OPTIONAL,
|
|
but the version string MUST NOT have a "v" prefix. For example "v2.11.4"
|
|
is bad, and "2.11.4" is good.</li>
|
|
</ol>
|
|
</li>
|
|
<li>Releases
|
|
<ol>
|
|
<li>To create a new release, you MUST create a "version bump" commit directly
|
|
on the master branch which changes the hard-coded version value of the
|
|
project. The version bump commit MUST have a git tag created on it and
|
|
named as the exact version string.</li>
|
|
<li>A version bump commit MUST have a commit message title of "Bump version
|
|
to VERSION". For example, if the new version string is "2.11.4", the
|
|
first line of the commit message MUST read: "Bump version to 2.11.4"</li>
|
|
<li>The release tag on the version bump commit MUST be named exactly the same
|
|
as the version string. The tag name can OPTIONALLY be prefixed with
|
|
"v". For example the tag name can be either "2.11.4" or "v2.11.4".</li>
|
|
<li>It is RECOMMENDED that release tags are lightweight tags, but you can
|
|
OPTIONALLY use annotated tags if you want to include changelog
|
|
information in the release tag itself.</li>
|
|
<li>If you use annotated release tags, the first line of the annotation MUST
|
|
read "Release VERSION". For example for version "2.11.4" the first line
|
|
of the tag annotation would read "Release 2.11.4". The second line must
|
|
be blank, and the changelog MUST start on the third line.</li>
|
|
</ol>
|
|
</li>
|
|
<li>Bug Fixes & Rollback
|
|
<ol>
|
|
<li>You MUST NOT under any circumstances force push to the master branch.</li>
|
|
<li>If a change branch which has been merged in to the master branch is found
|
|
to have a bug in it, the bug fix work MUST be done as a new separate
|
|
change branch and MUST follow the same workflow as any other change
|
|
branch.</li>
|
|
<li>If a change branch is wrongfully merged in to master, or for any other
|
|
reason the merge must be undone, you MUST undo the merge by reverting the
|
|
merge commit itself. Effectively creating a new commit that reverses all
|
|
the relevant changes.</li>
|
|
</ol>
|
|
</li>
|
|
<li>Maintenance Releases
|
|
<ol>
|
|
<li>Any branch that has a name starting with "stable-" SHOULD be referred to
|
|
as a "maintenance branch".</li>
|
|
<li>Maintenance branches are used for managing new releases of older
|
|
versions. Typically this is used to provide security updates for older
|
|
versions when the master branch has moved on to a point that a new
|
|
release for the old version cannot be made from the master branch.</li>
|
|
<li>A "maintenance release" is identical to a regular release, except the
|
|
version bump commit and the release tag are placed on the maintenance
|
|
branch instead of on the master branch.</li>
|
|
<li>A maintenance branch SHOULD follow a "stable-X.Y" naming pattern, where
|
|
"X" is the MAJOR version and "Y" is the minor version.</li>
|
|
<li>A maintenance branch MUST be created from the relevant release tag. For
|
|
example if there is a security fix for all 2.9.x releases, the latest of
|
|
which is "2.9.7", we create a new branch called "stable-2.9" off of the
|
|
"2.9.7" release tag. The security fix release will then end up being
|
|
version "2.9.8".</li>
|
|
<li>When working on a maintenance release, the relevant maintenance branch
|
|
MUST be thought of as the master branch for that maintenance work.</li>
|
|
<li>Changes in a maintenance branch SHOULD typically come from work being
|
|
done against the master branch. Meaning changes SHOULD only trickle
|
|
downwards from the master branch. If a change needs to trickle back up
|
|
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="faq-section py-20 sm:py-28" data-astro-cid-hqz3ghsx> <div class="section-container" data-astro-cid-hqz3ghsx> <div class="max-w-3xl mx-auto" data-astro-cid-hqz3ghsx> <!-- Section header --> <div class="mb-12 text-center" data-astro-cid-hqz3ghsx> <h2 class="text-3xl sm:text-4xl mb-4" data-astro-cid-hqz3ghsx>FAQ</h2> <p class="text-lg text-[var(--color-text-secondary)]
|
|
dark:text-[var(--color-dark-text-secondary)]" data-astro-cid-hqz3ghsx>
|
|
Common questions about Git Common-Flow
|
|
</p> </div> <!-- FAQ Items --> <div class="space-y-0" data-astro-cid-hqz3ghsx> </div> </div> </div> </section> <script type="module">function s(){const r=document.querySelectorAll("[data-faq-item]");r.forEach(t=>{const e=t.querySelector("[data-faq-trigger]"),o=t.querySelector("[data-faq-content]"),i=t.querySelector("[data-faq-icon]");!e||!o||!i||e.addEventListener("click",()=>{const c=e.getAttribute("aria-expanded")==="true";r.forEach(a=>{if(a!==t){const d=a.querySelector("[data-faq-trigger]"),l=a.querySelector("[data-faq-content]"),f=a.querySelector("[data-faq-icon]");d?.setAttribute("aria-expanded","false"),l?.classList.add("hidden"),f?.classList.remove("rotate-180")}}),e.setAttribute("aria-expanded",c?"false":"true"),o.classList.toggle("hidden",c),i.classList.toggle("rotate-180",!c)})});const n=r[0]?.querySelector("[data-faq-trigger]");n&&n.click()}s();document.addEventListener("astro:after-swap",s);</script> </main> <footer class="py-8 text-center text-sm
|
|
text-[var(--color-text-muted)]
|
|
dark:text-[var(--color-dark-text-muted)]
|
|
border-t border-[var(--color-border)]
|
|
dark:border-[var(--color-dark-border)]"> <div class="section-container"> <p>
|
|
Git Common-Flow is authored by
|
|
<a href="https://jimeh.me/" class="hover:text-[var(--color-accent)]" 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-[var(--color-accent)]" 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> |