Compare commits
24 Commits
1.0.0-rc.1
...
1.0.0-rc.4
| Author | SHA1 | Date | |
|---|---|---|---|
|
42deba342a
|
|||
|
95f217fa2e
|
|||
|
8028308194
|
|||
|
28f128b355
|
|||
|
42fd1b4358
|
|||
|
65b73bce68
|
|||
|
80ce565080
|
|||
|
1f5b48f5f3
|
|||
|
4f8f4d434d
|
|||
|
33c90a3c1e
|
|||
|
d2689d1c79
|
|||
|
d3703dba89
|
|||
|
cc198331c3
|
|||
|
28c824ebb2
|
|||
|
f5b4d3c994
|
|||
|
6e96511e78
|
|||
|
8a51061b61
|
|||
|
054e3ec0f4
|
|||
|
aa3d03a4a4
|
|||
|
2e54b67e17
|
|||
|
38f557c49b
|
|||
|
dbd58eb80d
|
|||
|
02632bbf20
|
|||
|
1216fa2bc0
|
2
.gitignore
vendored
@@ -1,3 +1,5 @@
|
|||||||
_site
|
_site
|
||||||
|
.asset-cache
|
||||||
.sass-cache
|
.sass-cache
|
||||||
.jekyll-metadata
|
.jekyll-metadata
|
||||||
|
docs/assets/.sprockets-manifest-*.json
|
||||||
|
|||||||
1
404.html
@@ -1,5 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: 404 Page Not Found
|
title: 404 Page Not Found
|
||||||
|
sitemap: false
|
||||||
---
|
---
|
||||||
<div class="header">
|
<div class="header">
|
||||||
<h1>404</h1>
|
<h1>404</h1>
|
||||||
|
|||||||
18
Gemfile
@@ -1,18 +1,6 @@
|
|||||||
source 'https://rubygems.org'
|
source 'https://rubygems.org'
|
||||||
|
|
||||||
# Hello! This is where you manage which Jekyll version is used to run.
|
gem 'jekyll', '3.5.0'
|
||||||
# When you want to use a different version, change it below, save the
|
|
||||||
# file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
|
|
||||||
#
|
|
||||||
# bundle exec jekyll serve
|
|
||||||
#
|
|
||||||
# This will help ensure the proper Jekyll version is running.
|
|
||||||
# Happy Jekylling!
|
|
||||||
# gem 'jekyll', '3.5.0'
|
|
||||||
|
|
||||||
# If you want to use GitHub Pages, remove the "gem "jekyll"" above and
|
|
||||||
# uncomment the line below. To upgrade, run `bundle update github-pages`.
|
|
||||||
gem 'github-pages', group: :jekyll_plugins
|
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem 'rake'
|
gem 'rake'
|
||||||
@@ -21,8 +9,12 @@ end
|
|||||||
|
|
||||||
# If you have any plugins, put them here!
|
# If you have any plugins, put them here!
|
||||||
group :jekyll_plugins do
|
group :jekyll_plugins do
|
||||||
|
gem 'jekyll-assets'
|
||||||
|
gem 'jekyll-pants'
|
||||||
gem 'jekyll-seo-tag'
|
gem 'jekyll-seo-tag'
|
||||||
gem 'jekyll-sitemap'
|
gem 'jekyll-sitemap'
|
||||||
|
gem 'jekyll-tidy'
|
||||||
|
gem 'uglifier' # required by 'jekyll-assets' for JS compression
|
||||||
end
|
end
|
||||||
|
|
||||||
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
||||||
|
|||||||
195
Gemfile.lock
@@ -1,180 +1,65 @@
|
|||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
activesupport (4.2.8)
|
|
||||||
i18n (~> 0.7)
|
|
||||||
minitest (~> 5.1)
|
|
||||||
thread_safe (~> 0.3, >= 0.3.4)
|
|
||||||
tzinfo (~> 1.1)
|
|
||||||
addressable (2.5.1)
|
addressable (2.5.1)
|
||||||
public_suffix (~> 2.0, >= 2.0.2)
|
public_suffix (~> 2.0, >= 2.0.2)
|
||||||
ast (2.3.0)
|
ast (2.3.0)
|
||||||
coffee-script (2.4.1)
|
|
||||||
coffee-script-source
|
|
||||||
execjs
|
|
||||||
coffee-script-source (1.12.2)
|
|
||||||
colorator (1.1.0)
|
colorator (1.1.0)
|
||||||
ethon (0.10.1)
|
concurrent-ruby (1.0.5)
|
||||||
ffi (>= 1.3.0)
|
|
||||||
execjs (2.7.0)
|
execjs (2.7.0)
|
||||||
faraday (0.12.1)
|
extras (0.3.0)
|
||||||
multipart-post (>= 1.2, < 3)
|
forwardable-extended (~> 2.5)
|
||||||
|
fastimage (2.1.0)
|
||||||
ffi (1.9.18)
|
ffi (1.9.18)
|
||||||
forwardable-extended (2.6.0)
|
forwardable-extended (2.6.0)
|
||||||
gemoji (3.0.0)
|
htmlbeautifier (1.3.1)
|
||||||
github-pages (141)
|
htmlcompressor (0.3.1)
|
||||||
activesupport (= 4.2.8)
|
jekyll (3.5.0)
|
||||||
github-pages-health-check (= 1.3.4)
|
|
||||||
jekyll (= 3.4.3)
|
|
||||||
jekyll-avatar (= 0.4.2)
|
|
||||||
jekyll-coffeescript (= 1.0.1)
|
|
||||||
jekyll-default-layout (= 0.1.4)
|
|
||||||
jekyll-feed (= 0.9.2)
|
|
||||||
jekyll-gist (= 1.4.0)
|
|
||||||
jekyll-github-metadata (= 2.4.0)
|
|
||||||
jekyll-mentions (= 1.2.0)
|
|
||||||
jekyll-optional-front-matter (= 0.1.2)
|
|
||||||
jekyll-paginate (= 1.1.0)
|
|
||||||
jekyll-readme-index (= 0.1.0)
|
|
||||||
jekyll-redirect-from (= 0.12.1)
|
|
||||||
jekyll-relative-links (= 0.4.1)
|
|
||||||
jekyll-sass-converter (= 1.5.0)
|
|
||||||
jekyll-seo-tag (= 2.2.3)
|
|
||||||
jekyll-sitemap (= 1.0.0)
|
|
||||||
jekyll-swiss (= 0.4.0)
|
|
||||||
jekyll-theme-architect (= 0.0.4)
|
|
||||||
jekyll-theme-cayman (= 0.0.4)
|
|
||||||
jekyll-theme-dinky (= 0.0.4)
|
|
||||||
jekyll-theme-hacker (= 0.0.4)
|
|
||||||
jekyll-theme-leap-day (= 0.0.4)
|
|
||||||
jekyll-theme-merlot (= 0.0.4)
|
|
||||||
jekyll-theme-midnight (= 0.0.4)
|
|
||||||
jekyll-theme-minimal (= 0.0.4)
|
|
||||||
jekyll-theme-modernist (= 0.0.4)
|
|
||||||
jekyll-theme-primer (= 0.2.1)
|
|
||||||
jekyll-theme-slate (= 0.0.4)
|
|
||||||
jekyll-theme-tactile (= 0.0.4)
|
|
||||||
jekyll-theme-time-machine (= 0.0.4)
|
|
||||||
jekyll-titles-from-headings (= 0.2.0)
|
|
||||||
jemoji (= 0.8.0)
|
|
||||||
kramdown (= 1.13.2)
|
|
||||||
liquid (= 3.0.6)
|
|
||||||
listen (= 3.0.6)
|
|
||||||
mercenary (~> 0.3)
|
|
||||||
minima (= 2.1.1)
|
|
||||||
rouge (= 1.11.1)
|
|
||||||
terminal-table (~> 1.4)
|
|
||||||
github-pages-health-check (1.3.4)
|
|
||||||
addressable (~> 2.3)
|
|
||||||
net-dns (~> 0.8)
|
|
||||||
octokit (~> 4.0)
|
|
||||||
public_suffix (~> 2.0)
|
|
||||||
typhoeus (~> 0.7)
|
|
||||||
html-pipeline (2.6.0)
|
|
||||||
activesupport (>= 2)
|
|
||||||
nokogiri (>= 1.4)
|
|
||||||
i18n (0.8.4)
|
|
||||||
jekyll (3.4.3)
|
|
||||||
addressable (~> 2.4)
|
addressable (~> 2.4)
|
||||||
colorator (~> 1.0)
|
colorator (~> 1.0)
|
||||||
jekyll-sass-converter (~> 1.0)
|
jekyll-sass-converter (~> 1.0)
|
||||||
jekyll-watch (~> 1.1)
|
jekyll-watch (~> 1.1)
|
||||||
kramdown (~> 1.3)
|
kramdown (~> 1.3)
|
||||||
liquid (~> 3.0)
|
liquid (~> 4.0)
|
||||||
mercenary (~> 0.3.3)
|
mercenary (~> 0.3.3)
|
||||||
pathutil (~> 0.9)
|
pathutil (~> 0.9)
|
||||||
rouge (~> 1.7)
|
rouge (~> 1.7)
|
||||||
safe_yaml (~> 1.0)
|
safe_yaml (~> 1.0)
|
||||||
jekyll-avatar (0.4.2)
|
jekyll-assets (2.3.2)
|
||||||
jekyll (~> 3.0)
|
concurrent-ruby (~> 1.0)
|
||||||
jekyll-coffeescript (1.0.1)
|
extras (~> 0.2)
|
||||||
coffee-script (~> 2.2)
|
fastimage (~> 2.0, >= 1.8)
|
||||||
jekyll-default-layout (0.1.4)
|
jekyll (~> 3.1, >= 3.0)
|
||||||
jekyll (~> 3.0)
|
pathutil (>= 0.8)
|
||||||
jekyll-feed (0.9.2)
|
rack (~> 1.6)
|
||||||
jekyll (~> 3.3)
|
sprockets (~> 3.3, < 3.8)
|
||||||
jekyll-gist (1.4.0)
|
jekyll-pants (0.2.1)
|
||||||
octokit (~> 4.2)
|
rubypants
|
||||||
jekyll-github-metadata (2.4.0)
|
|
||||||
jekyll (~> 3.1)
|
|
||||||
octokit (~> 4.0, != 4.4.0)
|
|
||||||
jekyll-mentions (1.2.0)
|
|
||||||
activesupport (~> 4.0)
|
|
||||||
html-pipeline (~> 2.3)
|
|
||||||
jekyll (~> 3.0)
|
|
||||||
jekyll-optional-front-matter (0.1.2)
|
|
||||||
jekyll (~> 3.0)
|
|
||||||
jekyll-paginate (1.1.0)
|
|
||||||
jekyll-readme-index (0.1.0)
|
|
||||||
jekyll (~> 3.0)
|
|
||||||
jekyll-redirect-from (0.12.1)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-relative-links (0.4.1)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-sass-converter (1.5.0)
|
jekyll-sass-converter (1.5.0)
|
||||||
sass (~> 3.4)
|
sass (~> 3.4)
|
||||||
jekyll-seo-tag (2.2.3)
|
jekyll-seo-tag (2.2.3)
|
||||||
jekyll (~> 3.3)
|
jekyll (~> 3.3)
|
||||||
jekyll-sitemap (1.0.0)
|
jekyll-sitemap (1.0.0)
|
||||||
jekyll (~> 3.3)
|
jekyll (~> 3.3)
|
||||||
jekyll-swiss (0.4.0)
|
jekyll-tidy (0.2.2)
|
||||||
jekyll-theme-architect (0.0.4)
|
htmlbeautifier
|
||||||
jekyll (~> 3.3)
|
htmlcompressor
|
||||||
jekyll-theme-cayman (0.0.4)
|
jekyll
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-theme-dinky (0.0.4)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-theme-hacker (0.0.4)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-theme-leap-day (0.0.4)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-theme-merlot (0.0.4)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-theme-midnight (0.0.4)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-theme-minimal (0.0.4)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-theme-modernist (0.0.4)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-theme-primer (0.2.1)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-theme-slate (0.0.4)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-theme-tactile (0.0.4)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-theme-time-machine (0.0.4)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-titles-from-headings (0.2.0)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
jekyll-watch (1.5.0)
|
jekyll-watch (1.5.0)
|
||||||
listen (~> 3.0, < 3.1)
|
listen (~> 3.0, < 3.1)
|
||||||
jemoji (0.8.0)
|
kramdown (1.14.0)
|
||||||
activesupport (~> 4.0)
|
liquid (4.0.0)
|
||||||
gemoji (~> 3.0)
|
listen (3.0.8)
|
||||||
html-pipeline (~> 2.2)
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
||||||
jekyll (>= 3.0)
|
rb-inotify (~> 0.9, >= 0.9.7)
|
||||||
kramdown (1.13.2)
|
|
||||||
liquid (3.0.6)
|
|
||||||
listen (3.0.6)
|
|
||||||
rb-fsevent (>= 0.9.3)
|
|
||||||
rb-inotify (>= 0.9.7)
|
|
||||||
mercenary (0.3.6)
|
mercenary (0.3.6)
|
||||||
mini_portile2 (2.2.0)
|
|
||||||
minima (2.1.1)
|
|
||||||
jekyll (~> 3.3)
|
|
||||||
minitest (5.10.2)
|
|
||||||
multipart-post (2.0.0)
|
|
||||||
net-dns (0.8.0)
|
|
||||||
nokogiri (1.8.0)
|
|
||||||
mini_portile2 (~> 2.2.0)
|
|
||||||
octokit (4.7.0)
|
|
||||||
sawyer (~> 0.8.0, >= 0.5.3)
|
|
||||||
parser (2.4.0.0)
|
parser (2.4.0.0)
|
||||||
ast (~> 2.2)
|
ast (~> 2.2)
|
||||||
pathutil (0.14.0)
|
pathutil (0.14.0)
|
||||||
forwardable-extended (~> 2.6)
|
forwardable-extended (~> 2.6)
|
||||||
powerpack (0.1.1)
|
powerpack (0.1.1)
|
||||||
public_suffix (2.0.5)
|
public_suffix (2.0.5)
|
||||||
|
rack (1.6.8)
|
||||||
rainbow (2.2.1)
|
rainbow (2.2.1)
|
||||||
rake (12.0.0)
|
rake (12.0.0)
|
||||||
rb-fsevent (0.10.2)
|
rb-fsevent (0.10.2)
|
||||||
@@ -188,30 +73,30 @@ GEM
|
|||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (~> 1.0, >= 1.0.1)
|
unicode-display_width (~> 1.0, >= 1.0.1)
|
||||||
ruby-progressbar (1.8.1)
|
ruby-progressbar (1.8.1)
|
||||||
|
rubypants (0.6.0)
|
||||||
safe_yaml (1.0.4)
|
safe_yaml (1.0.4)
|
||||||
sass (3.4.24)
|
sass (3.4.25)
|
||||||
sawyer (0.8.1)
|
sprockets (3.7.1)
|
||||||
addressable (>= 2.3.5, < 2.6)
|
concurrent-ruby (~> 1.0)
|
||||||
faraday (~> 0.8, < 1.0)
|
rack (> 1, < 3)
|
||||||
terminal-table (1.8.0)
|
uglifier (3.2.0)
|
||||||
unicode-display_width (~> 1.1, >= 1.1.1)
|
execjs (>= 0.3.0, < 3)
|
||||||
thread_safe (0.3.6)
|
|
||||||
typhoeus (0.8.0)
|
|
||||||
ethon (>= 0.8.0)
|
|
||||||
tzinfo (1.2.3)
|
|
||||||
thread_safe (~> 0.1)
|
|
||||||
unicode-display_width (1.3.0)
|
unicode-display_width (1.3.0)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
github-pages
|
jekyll (= 3.5.0)
|
||||||
|
jekyll-assets
|
||||||
|
jekyll-pants
|
||||||
jekyll-seo-tag
|
jekyll-seo-tag
|
||||||
jekyll-sitemap
|
jekyll-sitemap
|
||||||
|
jekyll-tidy
|
||||||
rake
|
rake
|
||||||
rubocop
|
rubocop
|
||||||
tzinfo-data
|
tzinfo-data
|
||||||
|
uglifier
|
||||||
|
|
||||||
BUNDLED WITH
|
BUNDLED WITH
|
||||||
1.14.6
|
1.14.6
|
||||||
|
|||||||
43
Rakefile
@@ -1,6 +1,11 @@
|
|||||||
require 'open-uri'
|
require 'open-uri'
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
|
|
||||||
|
desc 'Build site into docs directory'
|
||||||
|
task :build do
|
||||||
|
jekyll_build
|
||||||
|
end
|
||||||
|
|
||||||
desc 'Update index.md and spec folder based on versions in _config.yml'
|
desc 'Update index.md and spec folder based on versions in _config.yml'
|
||||||
task :update do
|
task :update do
|
||||||
config = YAML.load_file('_config.yml')
|
config = YAML.load_file('_config.yml')
|
||||||
@@ -22,6 +27,13 @@ task :update do
|
|||||||
write_file("#{filename}.md", spec[:body])
|
write_file("#{filename}.md", spec[:body])
|
||||||
write_file("#{filename}.svg", spec[:diagram]) if spec[:diagram]
|
write_file("#{filename}.svg", spec[:diagram]) if spec[:diagram]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
jekyll_build
|
||||||
|
end
|
||||||
|
|
||||||
|
def jekyll_build
|
||||||
|
puts 'Rebuilding output into docs directory...'
|
||||||
|
exec 'jekyll build --destination docs && touch docs/.nojekyll'
|
||||||
end
|
end
|
||||||
|
|
||||||
def write_file(file, content, comment = nil)
|
def write_file(file, content, comment = nil)
|
||||||
@@ -30,15 +42,8 @@ def write_file(file, content, comment = nil)
|
|||||||
end
|
end
|
||||||
|
|
||||||
def fetch_spec(version, config)
|
def fetch_spec(version, config)
|
||||||
doc_url = config['url_tpl']
|
document = get(build_file_url('document', version, config))
|
||||||
.gsub('{{version}}', version)
|
diagram = get(build_file_url('diagram', version, config))
|
||||||
.gsub('{{file}}', config['files']['document'])
|
|
||||||
diagram_url = config['url_tpl']
|
|
||||||
.gsub('{{version}}', version)
|
|
||||||
.gsub('{{file}}', config['files']['diagram'])
|
|
||||||
|
|
||||||
document = get(doc_url)
|
|
||||||
diagram = get(diagram_url)
|
|
||||||
|
|
||||||
if diagram
|
if diagram
|
||||||
img_tag = config['img_tpl'].gsub('{{file}}', "#{version}.svg")
|
img_tag = config['img_tpl'].gsub('{{file}}', "#{version}.svg")
|
||||||
@@ -46,10 +51,9 @@ def fetch_spec(version, config)
|
|||||||
end
|
end
|
||||||
|
|
||||||
title = document.split("\n", 2).first
|
title = document.split("\n", 2).first
|
||||||
body = config['body_tpl']
|
body = config['body_tpl'].gsub('{{content}}', document)
|
||||||
.gsub('{{title}}', title)
|
.gsub('{{title}}', title)
|
||||||
.gsub('{{version}}', version)
|
.gsub('{{version}}', version)
|
||||||
.gsub('{{content}}', document)
|
|
||||||
|
|
||||||
{
|
{
|
||||||
version: version,
|
version: version,
|
||||||
@@ -59,15 +63,10 @@ def fetch_spec(version, config)
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def fetch_document(url)
|
def build_file_url(file, version, config)
|
||||||
response = get(url)
|
config['url_tpl']
|
||||||
{
|
.gsub('{{version}}', version)
|
||||||
|
.gsub('{{file}}', config['files'][file])
|
||||||
body: response
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_diagram(url)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def get(url)
|
def get(url)
|
||||||
|
|||||||
77
_assets/css/_base.scss
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
html {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Open Sans', Helvetica, Arial, sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: 1.5;
|
||||||
|
color: #1a1a1a;
|
||||||
|
background-color: #fdfdfd;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
font-family: 'Open Sans Condensed', Helvetica, Arial, sans-serif;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 2.5em;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
ol ol, ul ol {
|
||||||
|
list-style-type: lower-roman;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul ul ol, ul ol ol, ol ul ol, ol ol ol {
|
||||||
|
list-style-type: lower-alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
margin-top: 80px;
|
||||||
|
|
||||||
|
a {
|
||||||
|
word-break: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
background-color: rgba(27,31,35,0.05);
|
||||||
|
border-radius: 3px;
|
||||||
|
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
||||||
|
font-size: 90%;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0.2em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#menu {
|
||||||
|
.pure-menu-label {
|
||||||
|
color: #999;
|
||||||
|
border: none;
|
||||||
|
padding: 0.6em 0 0.6em 0.6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.links {
|
||||||
|
font-size: 50px;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 10px;
|
||||||
|
left: 0px;
|
||||||
|
right: 0px;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #555;
|
||||||
|
padding: 0;
|
||||||
|
position: relative;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #777;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
2
_assets/css/main.scss
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
@import "side-menu";
|
||||||
|
@import "base";
|
||||||
1
_assets/js/main.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
// = require ui
|
||||||
44
_assets/js/ui.js
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
(function (window, document) {
|
||||||
|
var layout = document.getElementById('layout');
|
||||||
|
var menu = document.getElementById('menu');
|
||||||
|
var menuLink = document.getElementById('menuLink');
|
||||||
|
var content = document.getElementById('main');
|
||||||
|
|
||||||
|
function toggleClass (element, className) {
|
||||||
|
var classes = element.className.split(/\s+/);
|
||||||
|
var length = classes.length;
|
||||||
|
var i = 0;
|
||||||
|
|
||||||
|
for (; i < length; i++) {
|
||||||
|
if (classes[i] === className) {
|
||||||
|
classes.splice(i, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// The className is not found
|
||||||
|
if (length === classes.length) {
|
||||||
|
classes.push(className);
|
||||||
|
}
|
||||||
|
|
||||||
|
element.className = classes.join(' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggleAll (e) {
|
||||||
|
var active = 'active';
|
||||||
|
|
||||||
|
e.preventDefault();
|
||||||
|
toggleClass(layout, active);
|
||||||
|
toggleClass(menu, active);
|
||||||
|
toggleClass(menuLink, active);
|
||||||
|
}
|
||||||
|
|
||||||
|
menuLink.onclick = function (e) {
|
||||||
|
toggleAll(e);
|
||||||
|
};
|
||||||
|
|
||||||
|
content.onclick = function (e) {
|
||||||
|
if (menu.className.indexOf('active') !== -1) {
|
||||||
|
toggleAll(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}(this, this.document));
|
||||||
25
_config.yml
@@ -3,12 +3,22 @@ description: >
|
|||||||
An attempt to gather a sensible selection of the most common usage patterns of
|
An attempt to gather a sensible selection of the most common usage patterns of
|
||||||
git into a single and concise specification.
|
git into a single and concise specification.
|
||||||
author: Jim Myhrberg
|
author: Jim Myhrberg
|
||||||
|
hostname: commonflow.org
|
||||||
url: https://commonflow.org
|
url: https://commonflow.org
|
||||||
|
|
||||||
current_version: 1.0.0-rc.1
|
current_version: 1.0.0-rc.4
|
||||||
versions:
|
versions:
|
||||||
|
- 1.0.0-rc.4
|
||||||
|
- 1.0.0-rc.3
|
||||||
|
- 1.0.0-rc.2
|
||||||
- 1.0.0-rc.1
|
- 1.0.0-rc.1
|
||||||
|
|
||||||
|
exclude:
|
||||||
|
- Gemfile
|
||||||
|
- Gemfile.lock
|
||||||
|
- Rakefile
|
||||||
|
- README.md
|
||||||
|
|
||||||
update:
|
update:
|
||||||
body_tpl: |
|
body_tpl: |
|
||||||
---
|
---
|
||||||
@@ -23,9 +33,12 @@ update:
|
|||||||
document: common-flow.md
|
document: common-flow.md
|
||||||
diagram: common-flow.svg
|
diagram: common-flow.svg
|
||||||
|
|
||||||
gems:
|
plugins:
|
||||||
|
- jekyll-assets
|
||||||
|
- jekyll-pants
|
||||||
- jekyll-sitemap
|
- jekyll-sitemap
|
||||||
- jekyll-seo-tag
|
- jekyll-seo-tag
|
||||||
|
- jekyll-tidy
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
-
|
-
|
||||||
@@ -34,4 +47,12 @@ defaults:
|
|||||||
values:
|
values:
|
||||||
layout: "default"
|
layout: "default"
|
||||||
|
|
||||||
|
assets:
|
||||||
|
digest: true
|
||||||
|
compress:
|
||||||
|
css: true
|
||||||
|
js: true
|
||||||
|
|
||||||
markdown: kramdown
|
markdown: kramdown
|
||||||
|
kramdown:
|
||||||
|
input: Pantsdown # disable smart quotes typographic symbols
|
||||||
|
|||||||
@@ -6,12 +6,8 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:700,300|Open+Sans:400italic,700italic,400,700' rel='stylesheet' type='text/css'>
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:700,300|Open+Sans:400italic,700italic,400,700' rel='stylesheet' type='text/css'>
|
||||||
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous">
|
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous">
|
||||||
<!--[if lte IE 8]>
|
<link rel="stylesheet" href="https:////maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
<link rel="stylesheet" href="/css/main-old-ie.css">
|
{% css main %}
|
||||||
<![endif]-->
|
|
||||||
<!--[if gt IE 8]><!-->
|
|
||||||
<link rel="stylesheet" href="/css/main.css">
|
|
||||||
<!--<![endif]-->
|
|
||||||
{% seo %}
|
{% seo %}
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@@ -40,6 +36,11 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="links">
|
||||||
|
<a href="https://github.com/jimeh/common-flow">
|
||||||
|
<i class="fa fa-github" aria-hidden="true"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="main">
|
<div id="main">
|
||||||
@@ -48,6 +49,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script src="/js/ui.js"></script>
|
{% js main %}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,50 +0,0 @@
|
|||||||
html {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: 'Open Sans', Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 400;
|
|
||||||
line-height: 1.5;
|
|
||||||
color: #1a1a1a;
|
|
||||||
background-color: #fdfdfd;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: 'Open Sans Condensed', Helvetica, Arial, sans-serif;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #333;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
font-size: 2.5em;
|
|
||||||
line-height: 1.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
ol ol, ul ol {
|
|
||||||
list-style-type: lower-roman;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content {
|
|
||||||
margin-top: 80px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content a {
|
|
||||||
word-break: break-word;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content code {
|
|
||||||
background-color: rgba(27,31,35,0.05);
|
|
||||||
border-radius: 3px;
|
|
||||||
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
|
|
||||||
font-size: 90%;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0.2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu .pure-menu-label {
|
|
||||||
color: #999;
|
|
||||||
border: none;
|
|
||||||
padding: 0.6em 0 0.6em 0.6em;
|
|
||||||
}
|
|
||||||
@@ -1,255 +0,0 @@
|
|||||||
body {
|
|
||||||
color: #777;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pure-img-responsive {
|
|
||||||
max-width: 100%;
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Add transition to containers so they can push in and out.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#layout,
|
|
||||||
#menu,
|
|
||||||
.menu-link {
|
|
||||||
-webkit-transition: all 0.2s ease-out;
|
|
||||||
-moz-transition: all 0.2s ease-out;
|
|
||||||
-ms-transition: all 0.2s ease-out;
|
|
||||||
-o-transition: all 0.2s ease-out;
|
|
||||||
transition: all 0.2s ease-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
This is the parent `<div>` that contains the menu and the content area.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#layout {
|
|
||||||
position: relative;
|
|
||||||
left: 0;
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#layout.active #menu {
|
|
||||||
left: 150px;
|
|
||||||
width: 150px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#layout.active .menu-link {
|
|
||||||
left: 150px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
The content `<div>` is where all your content goes.
|
|
||||||
*/
|
|
||||||
|
|
||||||
.content {
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 0 2em;
|
|
||||||
max-width: 800px;
|
|
||||||
margin-bottom: 50px;
|
|
||||||
line-height: 1.6em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
|
||||||
margin: 0;
|
|
||||||
color: #333;
|
|
||||||
text-align: center;
|
|
||||||
padding: 2.5em 2em 0;
|
|
||||||
border-bottom: 1px solid #eee;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header h1 {
|
|
||||||
margin: 0.2em 0;
|
|
||||||
font-size: 3em;
|
|
||||||
font-weight: 300;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header h2 {
|
|
||||||
font-weight: 300;
|
|
||||||
color: #ccc;
|
|
||||||
padding: 0;
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content-subhead {
|
|
||||||
margin: 50px 0 20px 0;
|
|
||||||
font-weight: 300;
|
|
||||||
color: #888;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
The `#menu` `<div>` is the parent `<div>` that contains the `.pure-menu` that
|
|
||||||
appears on the left side of the page.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#menu {
|
|
||||||
margin-left: -150px;
|
|
||||||
/* "#menu" width */
|
|
||||||
width: 150px;
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
z-index: 1000;
|
|
||||||
/* so the menu or its navicon stays above all content */
|
|
||||||
background: #191818;
|
|
||||||
overflow-y: auto;
|
|
||||||
-webkit-overflow-scrolling: touch;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
All anchors inside the menu should be styled like this.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#menu a {
|
|
||||||
color: #999;
|
|
||||||
border: none;
|
|
||||||
padding: 0.6em 0 0.6em 0.6em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Remove all background/borders, since we are applying them to #menu.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#menu .pure-menu,
|
|
||||||
#menu .pure-menu ul {
|
|
||||||
border: none;
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Add that light border to separate items into groups.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#menu .pure-menu ul,
|
|
||||||
#menu .pure-menu .menu-item-divided {
|
|
||||||
border-top: 1px solid #333;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Change color of the anchor links on hover/focus.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#menu .pure-menu li a:hover,
|
|
||||||
#menu .pure-menu li a:focus {
|
|
||||||
background: #333;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
This styles the selected menu item `<li>`.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#menu .pure-menu-selected,
|
|
||||||
#menu .pure-menu-heading {
|
|
||||||
background: #1f8dd6;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
This styles a link within a selected menu item `<li>`.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#menu .pure-menu-selected a {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
This styles the menu heading.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#menu .pure-menu-heading {
|
|
||||||
font-size: 110%;
|
|
||||||
color: #fff;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- Dynamic Button For Responsive Menu -------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
The button to open/close the Menu is custom-made and not part of Pure. Here's
|
|
||||||
how it works:
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
`.menu-link` represents the responsive menu toggle that shows/hides on
|
|
||||||
small screens.
|
|
||||||
*/
|
|
||||||
|
|
||||||
.menu-link {
|
|
||||||
position: fixed;
|
|
||||||
display: block;
|
|
||||||
/* show this only on small screens */
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
/* "#menu width" */
|
|
||||||
background: #000;
|
|
||||||
background: rgba(0,0,0,0.7);
|
|
||||||
font-size: 10px;
|
|
||||||
/* change this value to increase/decrease button size */
|
|
||||||
z-index: 10;
|
|
||||||
width: 2em;
|
|
||||||
height: auto;
|
|
||||||
padding: 2.1em 1.6em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-link:hover,
|
|
||||||
.menu-link:focus {
|
|
||||||
background: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-link span {
|
|
||||||
position: relative;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-link span,
|
|
||||||
.menu-link span:before,
|
|
||||||
.menu-link span:after {
|
|
||||||
background-color: #fff;
|
|
||||||
width: 100%;
|
|
||||||
height: 0.2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-link span:before,
|
|
||||||
.menu-link span:after {
|
|
||||||
position: absolute;
|
|
||||||
margin-top: -0.6em;
|
|
||||||
content: " ";
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-link span:after {
|
|
||||||
margin-top: 0.6em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- Responsive Styles (Media Queries) ------------------------------------- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
Hides the menu at `48em`, but modify this based on your app's needs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
.header,
|
|
||||||
.content {
|
|
||||||
padding-left: 2em;
|
|
||||||
padding-right: 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#layout {
|
|
||||||
padding-left: 150px;
|
|
||||||
/* left col width "#menu" */
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#menu {
|
|
||||||
left: 150px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu-link {
|
|
||||||
position: fixed;
|
|
||||||
left: 150px;
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#layout.active .menu-link {
|
|
||||||
left: 150px;
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
layout: none
|
|
||||||
---
|
|
||||||
|
|
||||||
// Import partials from `sass_dir` (defaults to `_sass`)
|
|
||||||
@import
|
|
||||||
"side-menu-old-ie",
|
|
||||||
"base"
|
|
||||||
;
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
---
|
|
||||||
layout: none
|
|
||||||
---
|
|
||||||
|
|
||||||
// Import partials from `sass_dir` (defaults to `_sass`)
|
|
||||||
@import
|
|
||||||
"side-menu",
|
|
||||||
"base"
|
|
||||||
;
|
|
||||||
0
docs/.nojekyll
Normal file
69
docs/404.html
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:700,300|Open+Sans:400italic,700italic,400,700' rel='stylesheet' type='text/css'>
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous">
|
||||||
|
<link rel="stylesheet" href="https:////maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
<link type="text/css" rel="stylesheet" href="/assets/main-16db41e8ef2362fe9967bb0bee92e459cf76f2a846e85c96322243077a88c301.css">
|
||||||
|
<!-- Begin Jekyll SEO tag v2.2.3 -->
|
||||||
|
<title>404 Page Not Found | Git Common Flow</title>
|
||||||
|
<meta property="og:title" content="404 Page Not Found" />
|
||||||
|
<meta name="author" content="Jim Myhrberg" />
|
||||||
|
<meta property="og:locale" content="en_US" />
|
||||||
|
<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 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." />
|
||||||
|
<link rel="canonical" href="https://commonflow.org/404.html" />
|
||||||
|
<meta property="og:url" content="https://commonflow.org/404.html" />
|
||||||
|
<meta property="og:site_name" content="Git Common Flow" />
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{"@context":"http://schema.org","@type":"WebPage","headline":"404 Page Not Found","author":{"@type":"Person","name":"Jim Myhrberg"},"description":"An attempt to gather a sensible selection of the most common usage patterns of git into a single and concise specification.","url":"https://commonflow.org/404.html"}
|
||||||
|
</script>
|
||||||
|
<!-- End Jekyll SEO tag -->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="layout">
|
||||||
|
<a href="#menu" id="menuLink" class="menu-link">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
|
<div id="menu">
|
||||||
|
<div class="pure-menu">
|
||||||
|
<ul class="pure-menu-list">
|
||||||
|
<li class="pure-menu-item">
|
||||||
|
<div class="pure-menu-label">Versions:</div>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.4">
|
||||||
|
<a href="/spec/1.0.0-rc.4.html" class="pure-menu-link">1.0.0-rc.4</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.3">
|
||||||
|
<a href="/spec/1.0.0-rc.3.html" class="pure-menu-link">1.0.0-rc.3</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.2">
|
||||||
|
<a href="/spec/1.0.0-rc.2.html" class="pure-menu-link">1.0.0-rc.2</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.1">
|
||||||
|
<a href="/spec/1.0.0-rc.1.html" class="pure-menu-link">1.0.0-rc.1</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="links">
|
||||||
|
<a href="https://github.com/jimeh/common-flow">
|
||||||
|
<i class="fa fa-github" aria-hidden="true"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main">
|
||||||
|
<div class="content">
|
||||||
|
<div class="header">
|
||||||
|
<h1>404</h1>
|
||||||
|
<p><strong>Page not found :(</strong></p>
|
||||||
|
<p>The requested page could not be found.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript" src="/assets/main-870855580c69dec57be4c965d0cf8afe78afa6b7b6f6bdb5aff91ac0256c0a1a.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
1
docs/CNAME
Normal file
@@ -0,0 +1 @@
|
|||||||
|
commonflow.org
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
body{color:#777}.pure-img-responsive{max-width:100%;height:auto}#layout,#menu,.menu-link{-webkit-transition:all 0.2s ease-out;-moz-transition:all 0.2s ease-out;-ms-transition:all 0.2s ease-out;-o-transition:all 0.2s ease-out;transition:all 0.2s ease-out}#layout{position:relative;left:0;padding-left:0}#layout.active #menu{left:150px;width:150px}#layout.active .menu-link{left:150px}.content{margin:0 auto;padding:0 2em;max-width:800px;margin-bottom:50px;line-height:1.6em}.header{margin:0;color:#333;text-align:center;padding:2.5em 2em 0;border-bottom:1px solid #eee}.header h1{margin:0.2em 0;font-size:3em;font-weight:300}.header h2{font-weight:300;color:#ccc;padding:0;margin-top:0}.content-subhead{margin:50px 0 20px 0;font-weight:300;color:#888}#menu{margin-left:-150px;width:150px;position:fixed;top:0;left:0;bottom:0;z-index:1000;background:#191818;overflow-y:auto;-webkit-overflow-scrolling:touch}#menu a{color:#999;border:none;padding:0.6em 0 0.6em 0.6em}#menu .pure-menu,#menu .pure-menu ul{border:none;background:transparent}#menu .pure-menu ul,#menu .pure-menu .menu-item-divided{border-top:1px solid #333}#menu .pure-menu li a:hover,#menu .pure-menu li a:focus{background:#333}#menu .pure-menu-selected,#menu .pure-menu-heading{background:#1f8dd6}#menu .pure-menu-selected a{color:#fff}#menu .pure-menu-heading{font-size:110%;color:#fff;margin:0}.menu-link{position:fixed;display:block;top:0;left:0;background:#000;background:rgba(0,0,0,0.7);font-size:10px;z-index:10;width:2em;height:auto;padding:2.1em 1.6em}.menu-link:hover,.menu-link:focus{background:#000}.menu-link span{position:relative;display:block}.menu-link span,.menu-link span:before,.menu-link span:after{background-color:#fff;width:100%;height:0.2em}.menu-link span:before,.menu-link span:after{position:absolute;margin-top:-0.6em;content:" "}.menu-link span:after{margin-top:0.6em}@media (min-width: 48em){.header,.content{padding-left:2em;padding-right:2em}#layout{padding-left:150px;left:0}#menu{left:150px}.menu-link{position:fixed;left:150px;display:none}#layout.active .menu-link{left:150px}}@media (max-width: 48em){#layout.active{position:relative;left:150px}}html{height:100%}body{font-family:'Open Sans', Helvetica, Arial, sans-serif;font-size:16px;font-weight:400;line-height:1.5;color:#1a1a1a;background-color:#fdfdfd}h1,h2,h3,h4,h5,h6{font-family:'Open Sans Condensed', Helvetica, Arial, sans-serif;font-weight:700;color:#333}h1{font-size:2.5em;line-height:1.2}ol ol,ul ol{list-style-type:lower-roman}ul ul ol,ul ol ol,ol ul ol,ol ol ol{list-style-type:lower-alpha}.content{margin-top:80px}.content a{word-break:break-word}.content code{background-color:rgba(27,31,35,0.05);border-radius:3px;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:90%;margin:0;padding:0.2em}#menu .pure-menu-label{color:#999;border:none;padding:0.6em 0 0.6em 0.6em}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
body{color:#777}.pure-img-responsive{max-width:100%;height:auto}#layout,#menu,.menu-link{-webkit-transition:all 0.2s ease-out;-moz-transition:all 0.2s ease-out;-ms-transition:all 0.2s ease-out;-o-transition:all 0.2s ease-out;transition:all 0.2s ease-out}#layout{position:relative;left:0;padding-left:0}#layout.active #menu{left:150px;width:150px}#layout.active .menu-link{left:150px}.content{margin:0 auto;padding:0 2em;max-width:800px;margin-bottom:50px;line-height:1.6em}.header{margin:0;color:#333;text-align:center;padding:2.5em 2em 0;border-bottom:1px solid #eee}.header h1{margin:0.2em 0;font-size:3em;font-weight:300}.header h2{font-weight:300;color:#ccc;padding:0;margin-top:0}.content-subhead{margin:50px 0 20px 0;font-weight:300;color:#888}#menu{margin-left:-150px;width:150px;position:fixed;top:0;left:0;bottom:0;z-index:1000;background:#191818;overflow-y:auto;-webkit-overflow-scrolling:touch}#menu a{color:#999;border:none;padding:0.6em 0 0.6em 0.6em}#menu .pure-menu,#menu .pure-menu ul{border:none;background:transparent}#menu .pure-menu ul,#menu .pure-menu .menu-item-divided{border-top:1px solid #333}#menu .pure-menu li a:hover,#menu .pure-menu li a:focus{background:#333}#menu .pure-menu-selected,#menu .pure-menu-heading{background:#1f8dd6}#menu .pure-menu-selected a{color:#fff}#menu .pure-menu-heading{font-size:110%;color:#fff;margin:0}.menu-link{position:fixed;display:block;top:0;left:0;background:#000;background:rgba(0,0,0,0.7);font-size:10px;z-index:10;width:2em;height:auto;padding:2.1em 1.6em}.menu-link:hover,.menu-link:focus{background:#000}.menu-link span{position:relative;display:block}.menu-link span,.menu-link span:before,.menu-link span:after{background-color:#fff;width:100%;height:0.2em}.menu-link span:before,.menu-link span:after{position:absolute;margin-top:-0.6em;content:" "}.menu-link span:after{margin-top:0.6em}@media (min-width: 48em){.header,.content{padding-left:2em;padding-right:2em}#layout{padding-left:150px;left:0}#menu{left:150px}.menu-link{position:fixed;left:150px;display:none}#layout.active .menu-link{left:150px}}@media (max-width: 48em){#layout.active{position:relative;left:150px}}html{height:100%}body{font-family:'Open Sans', Helvetica, Arial, sans-serif;font-size:16px;font-weight:400;line-height:1.5;color:#1a1a1a;background-color:#fdfdfd}h1,h2,h3,h4,h5,h6{font-family:'Open Sans Condensed', Helvetica, Arial, sans-serif;font-weight:700;color:#333}h1{font-size:2.5em;line-height:1.2}ol ol,ul ol{list-style-type:lower-roman}ul ul ol,ul ol ol,ol ul ol,ol ol ol{list-style-type:lower-alpha}.content{margin-top:80px}.content a{word-break:break-word}.content code{background-color:rgba(27,31,35,0.05);border-radius:3px;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:90%;margin:0;padding:0.2em}#menu .pure-menu-label{color:#999;border:none;padding:0.6em 0 0.6em 0.6em}#menu .links{font-size:50px;position:absolute;bottom:10px;left:0px;right:0px;text-align:center}#menu .links a{color:#555;padding:0;position:relative;text-decoration:none}#menu .links a:hover{color:#777}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(e,n){function t(e,n){for(var t=e.className.split(/\s+/),i=t.length,c=0;c<i;c++)if(t[c]===n){t.splice(c,1);break}i===t.length&&t.push(n),e.className=t.join(" ")}function i(e){var n="active";e.preventDefault(),t(c,n),t(a,n),t(l,n)}var c=n.getElementById("layout"),a=n.getElementById("menu"),l=n.getElementById("menuLink"),m=n.getElementById("main");l.onclick=function(e){i(e)},m.onclick=function(e){-1!==a.className.indexOf("active")&&i(e)}}(0,this.document);
|
||||||
403
docs/index.html
Normal file
@@ -0,0 +1,403 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:700,300|Open+Sans:400italic,700italic,400,700' rel='stylesheet' type='text/css'>
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous">
|
||||||
|
<link rel="stylesheet" href="https:////maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
<link type="text/css" rel="stylesheet" href="/assets/main-16db41e8ef2362fe9967bb0bee92e459cf76f2a846e85c96322243077a88c301.css">
|
||||||
|
<!-- Begin Jekyll SEO tag v2.2.3 -->
|
||||||
|
<title>Git Common-Flow 1.0.0-rc.4 | Git Common Flow</title>
|
||||||
|
<meta property="og:title" content="Git Common-Flow 1.0.0-rc.4" />
|
||||||
|
<meta name="author" content="Jim Myhrberg" />
|
||||||
|
<meta property="og:locale" content="en_US" />
|
||||||
|
<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 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." />
|
||||||
|
<link rel="canonical" href="https://commonflow.org/" />
|
||||||
|
<meta property="og:url" content="https://commonflow.org/" />
|
||||||
|
<meta property="og:site_name" content="Git Common Flow" />
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{"@context":"http://schema.org","@type":"WebSite","name":"Git Common Flow","headline":"Git Common-Flow 1.0.0-rc.4","author":{"@type":"Person","name":"Jim Myhrberg"},"description":"An attempt to gather a sensible selection of the most common usage patterns of git into a single and concise specification.","url":"https://commonflow.org/"}
|
||||||
|
</script>
|
||||||
|
<!-- End Jekyll SEO tag -->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="layout">
|
||||||
|
<a href="#menu" id="menuLink" class="menu-link">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
|
<div id="menu">
|
||||||
|
<div class="pure-menu">
|
||||||
|
<ul class="pure-menu-list">
|
||||||
|
<li class="pure-menu-item">
|
||||||
|
<div class="pure-menu-label">Versions:</div>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.4 pure-menu-selected">
|
||||||
|
<a href="/spec/1.0.0-rc.4.html" class="pure-menu-link">1.0.0-rc.4</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.3">
|
||||||
|
<a href="/spec/1.0.0-rc.3.html" class="pure-menu-link">1.0.0-rc.3</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.2">
|
||||||
|
<a href="/spec/1.0.0-rc.2.html" class="pure-menu-link">1.0.0-rc.2</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.1">
|
||||||
|
<a href="/spec/1.0.0-rc.1.html" class="pure-menu-link">1.0.0-rc.1</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="links">
|
||||||
|
<a href="https://github.com/jimeh/common-flow">
|
||||||
|
<i class="fa fa-github" aria-hidden="true"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main">
|
||||||
|
<div class="content">
|
||||||
|
<h1 id="git-common-flow-100-rc4">Git Common-Flow 1.0.0-rc.4</h1>
|
||||||
|
<p><img src="/spec/1.0.0-rc.4.svg" width="100%" /></p>
|
||||||
|
<h2 id="summary">Summary</h2>
|
||||||
|
<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>In short, Common-Flow is essentially GitHub Flow with the addition of versioned
|
||||||
|
releases, optional release branches, and without the requirement to deploy to
|
||||||
|
production all the time.</p>
|
||||||
|
<h2 id="terminology">Terminology</h2>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Master Branch</strong> - Must be named "master", must always have passing tests,
|
||||||
|
and is not guaranteed to always work in production environments.</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>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> - May be considered safe to use in production environments. Is
|
||||||
|
effectively just a git tag named after the version of the release.</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>
|
||||||
|
<h2 id="git-common-flow-specification-common-flow">Git Common-Flow Specification (Common-Flow)</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>TL;DR
|
||||||
|
<ol>
|
||||||
|
<li>Don't break the master branch.</li>
|
||||||
|
<li>A release is a git tag.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<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 always be in a non-broken state with its test
|
||||||
|
suite passing.</li>
|
||||||
|
<li>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.</li>
|
||||||
|
<li>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.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Change Branches
|
||||||
|
<ol>
|
||||||
|
<li>Each change (feature, bugfix, etc.) MUST be performed on separate
|
||||||
|
branches that SHOULD be referred to as "change branches".</li>
|
||||||
|
<li>All change branches MUST have descriptive names.</li>
|
||||||
|
<li>It is RECOMMENDED that you commit often locally, and that you try and
|
||||||
|
keep the commits reasonably structured to avoid a messy and confusing git
|
||||||
|
history.</li>
|
||||||
|
<li>You SHOULD regularly push your work to the same named branch on the
|
||||||
|
remote server.</li>
|
||||||
|
<li>You SHOULD create separate change branches for each distinctly different
|
||||||
|
change. You SHOULD NOT include multiple unrelated changes into a single
|
||||||
|
change branch.</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.</li>
|
||||||
|
<li>After updating a change branch from its source branch you MUST push the
|
||||||
|
change branch to the remote server. Due to the nature of rebasing, you
|
||||||
|
will be required to do a force push, and you MUST use the
|
||||||
|
"--force-with-lease" git push option when doing so instead of the regular
|
||||||
|
"--force".</li>
|
||||||
|
<li>If there is a truly valid technical reason to not use rebase when
|
||||||
|
updating change branches, then you can update change branches via merge
|
||||||
|
instead of rebase. The decision to use merge MUST only be taken after all
|
||||||
|
possible options to use rebase have been tried and failed. People not
|
||||||
|
understanding how to use rebase is NOT a valid reason to use merge. If
|
||||||
|
you do decide to use merge instead of rebase, you MUST NOT use a mixture
|
||||||
|
of both methods, pick one and stick to it.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Pull Requests
|
||||||
|
<ol>
|
||||||
|
<li>To merge a change branch into its merge target, you MUST open a "pull
|
||||||
|
request" (or equivalent).</li>
|
||||||
|
<li>The purpose of a pull request is to allow others to review your changes
|
||||||
|
and give feedback. You can then fix any issues, complaints, and more that
|
||||||
|
might arise, and then let people review again.</li>
|
||||||
|
<li>Before creating a pull request, it is RECOMMENDED that you consider the
|
||||||
|
state of your change branch's commit history. If it is messy and
|
||||||
|
confusing, it might be a good idea to rebase your branch with "git rebase
|
||||||
|
-i" to present a cleaner and easier to follow commit history for your
|
||||||
|
reviewers.</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, the RECOMMENDED way to do so is by creating a pull request and
|
||||||
|
discuss the changes with others there.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Versioning
|
||||||
|
<ol>
|
||||||
|
<li>A "version string" is a typically mostly numeric string that identifies a
|
||||||
|
specific version of a project. The version string itself MUST NOT have a
|
||||||
|
"v" prefix, but the version string can be displayed with a "v" prefix to
|
||||||
|
indicate it is a version that is being referred to.</li>
|
||||||
|
<li>The source of truth for a project's version MUST be a git tag with a name
|
||||||
|
based on the version string. This kind of tag MUST be referred to as a
|
||||||
|
"release tag".</li>
|
||||||
|
<li>It is OPTIONAL, but RECOMMENDED to also keep the version string
|
||||||
|
hard-coded somewhere in the project code-base.</li>
|
||||||
|
<li>If you hard-code the version string into the code-base, it is RECOMMENDED
|
||||||
|
that you do so in a file called "VERSION" located in the root of the
|
||||||
|
project. But be mindful of the conventions of your programming language
|
||||||
|
and community when choosing if, where and how to hard-code the version
|
||||||
|
string.</li>
|
||||||
|
<li>If you are using a "VERSION" file in the root of the project, this file
|
||||||
|
MUST only contain the exact version string, meaning it MUST NOT have a
|
||||||
|
"v" prefix. For example "v2.11.4" is bad, and "2.11.4" is good.</li>
|
||||||
|
<li>It is OPTIONAL, but RECOMMENDED that that the version string follows
|
||||||
|
Semantic Versioning (<a href="http://semver.org/">http://semver.org/</a>).</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Releases
|
||||||
|
<ol>
|
||||||
|
<li>To create a new release, you MUST create a git tag named as the exact
|
||||||
|
version string of the release. This kind of tag MUST be referred to as a
|
||||||
|
"release tag".</li>
|
||||||
|
<li>The release tag name can OPTIONALLY be prefixed with "v". For example the
|
||||||
|
tag name can be either "2.11.4" or "v2.11.4". It is however RECOMMENDED
|
||||||
|
that you do not use a "v" prefix. You MUST NOT use a mixture of "v"
|
||||||
|
prefixed and non-prefixed tags. Pick one form and stick to it.</li>
|
||||||
|
<li>If the version string is hard-coded into the code-base, you MUST create a
|
||||||
|
"version bump" commit which changes the hard-coded version string of the
|
||||||
|
project.</li>
|
||||||
|
<li>When using version bump commits, the release tag MUST be placed on the
|
||||||
|
version bump commit.</li>
|
||||||
|
<li>If you are not using a release branch, then the release tag, and if
|
||||||
|
relevant the version bump commit, MUST be created directly on the master
|
||||||
|
branch.</li>
|
||||||
|
<li>The version bump commit SHOULD 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 SHOULD read: "Bump version to
|
||||||
|
2.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
|
||||||
|
SHOULD read "Release VERSION". For example for version "2.11.4" the first
|
||||||
|
line of the tag annotation SHOULD read "Release 2.11.4". The second line
|
||||||
|
MUST be blank, and the changelog MUST start on the third line.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Short-Term Release Branches
|
||||||
|
<ol>
|
||||||
|
<li>Any branch that has a name starting with "release-" SHOULD be referred to
|
||||||
|
as a "release branch".</li>
|
||||||
|
<li>Any release branch which has a name ending with a specific version
|
||||||
|
string, MUST be referred to as a "short-term release branch".</li>
|
||||||
|
<li>Use of short-term release branches are OPTIONAL, and intended to be used
|
||||||
|
to create a specific versioned release.</li>
|
||||||
|
<li>A short-term release branch is RECOMMENDED if there is a lengthy
|
||||||
|
pre-release verification process to avoid a code freeze on the master
|
||||||
|
branch.</li>
|
||||||
|
<li>Short-term release branches MUST have a name of "release-VERSION". For
|
||||||
|
example for version "2.11.4" the release branch name MUST be
|
||||||
|
"release-2.11.4".</li>
|
||||||
|
<li>When using a short-term release branch to create a release, the release
|
||||||
|
tag and if used, version bump commit, MUST be placed directly on the
|
||||||
|
short-term release branch itself.</li>
|
||||||
|
<li>Only very minor changes should be performed on a short-term release
|
||||||
|
branch directly. Any larger changes SHOULD be done in the master branch,
|
||||||
|
and SHOULD be pulled into the release branch by rebasing it on top of the
|
||||||
|
master branch the same way a change branch pulls in updates from its
|
||||||
|
source branch.</li>
|
||||||
|
<li>After a release tag has been created, the release branch MUST be merged
|
||||||
|
back into its source branch and then deleted. Typically the source branch
|
||||||
|
will be the master branch.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Long-term Release Branches
|
||||||
|
<ol>
|
||||||
|
<li>Any release branch which has a name ending with a non-specific version
|
||||||
|
string, MUST be referred to as a "long-term release branch". For example
|
||||||
|
"release-2.11" is a long-term release branch, while "release-2.11.4" is a
|
||||||
|
short-term release branch.</li>
|
||||||
|
<li>Use of long-term release branches are OPTIONAL, and intended for work on
|
||||||
|
versions which are not currently part of the master branch. Typically
|
||||||
|
this is useful when you need to create a new maintenance release for a
|
||||||
|
older version.</li>
|
||||||
|
<li>A long-term release branch MUST have a name with a non-specific version
|
||||||
|
number. For example a long-term release branch for creating new 2.9.x
|
||||||
|
releases MUST be named "release-2.9".</li>
|
||||||
|
<li>Long-term release branches for maintenance releases of older versions
|
||||||
|
MUST be created from the relevant release tag. For example if the master
|
||||||
|
branch is on version 2.11.4 and there is a security fix for all 2.9.x
|
||||||
|
releases, the latest of which is "2.9.7". Create a new branch called
|
||||||
|
"release-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>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.</li>
|
||||||
|
<li>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.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Bug Fixes & Rollback
|
||||||
|
<ol>
|
||||||
|
<li>You MUST NOT under any circumstances force push to the master branch or
|
||||||
|
to long-term release branches.</li>
|
||||||
|
<li>If a change branch which has been merged into 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 into 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>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#_commit_guidelines">https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project#_commit_guidelines</a></li>
|
||||||
|
<li>You SHOULD never blindly commit all changes with "git commit -a". It is
|
||||||
|
RECOMMENDED you use "git add -i" or "git add -p" to add individual
|
||||||
|
changes to the staging area so you are fully aware of what you are
|
||||||
|
committing.</li>
|
||||||
|
<li>You SHOULD always use "--force-with-lease" when doing a force push. The
|
||||||
|
regular "--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>
|
||||||
|
</ol>
|
||||||
|
<h2 id="faq">FAQ</h2>
|
||||||
|
<h3 id="why-use-common-flow-instead-of-git-flow-and-how-does-it-differ">Why use Common-Flow instead of Git Flow, and how does it differ?</h3>
|
||||||
|
<p>Common-Flow tries to be a lot less complicated than Git Flow by having fewer
|
||||||
|
types of branches, and simpler rules. Normal day to day development doesn't
|
||||||
|
really change much:</p>
|
||||||
|
<ul>
|
||||||
|
<li>You create change branches instead of feature branches, without the need of a
|
||||||
|
"feature/" or "change/" prefix in the branch name.</li>
|
||||||
|
<li>Change branches are typically created off of and merged back into "master"
|
||||||
|
instead of "develop".</li>
|
||||||
|
<li>Creating a release is done by simply creating a git tag, typically on the
|
||||||
|
master branch.</li>
|
||||||
|
</ul>
|
||||||
|
<p>In detail, the main differences between Git Flow and Common-Flow are:</p>
|
||||||
|
<ul>
|
||||||
|
<li>There is no "develop" branch, there is only a "master" branch which contains
|
||||||
|
the latest work. In Git Flow the master branch effectively ends up just being
|
||||||
|
a pointer to the latest release, despite the fact that Git Flow includes
|
||||||
|
release tags too. In Common-Flow you just look at the tags to find the latest
|
||||||
|
release.</li>
|
||||||
|
<li>There are no "feature" or "hotfix" branches, there's only "change"
|
||||||
|
branches. Any branch that is not master and introduces changes is a change
|
||||||
|
branch. Change branches also don't have a enforced naming convention, they
|
||||||
|
just have to have a "descriptive name". This makes things simpler and allows
|
||||||
|
more flexibility.</li>
|
||||||
|
<li>Release branches are available, but optional. Instead of enforcing the use of
|
||||||
|
release branches like Git Flow, Common-Flow only recommends the use of release
|
||||||
|
branches when it makes things easier. If creating a new release by tagging
|
||||||
|
"master" works for you, great, do that.</li>
|
||||||
|
</ul>
|
||||||
|
<h3 id="why-use-common-flow-instead-of-github-flow-and-how-does-it-differ">Why use Common-Flow instead of GitHub Flow, and how does it differ?</h3>
|
||||||
|
<p>Common-Flow is essentially GitHub Flow with the addition of a "Release" concept
|
||||||
|
that uses tags. It also attempts to define how certain common tasks are done,
|
||||||
|
like updating change/feature branches from their source branches for
|
||||||
|
example. This is to help end arguments about how such things are done.</p>
|
||||||
|
<p>If a deployment/release for you is just getting the latest code in the master
|
||||||
|
branch out, without caring about bumping version numbers or anything, then
|
||||||
|
GitHub Flow is a good fit for you, and you probably don't need the extras of
|
||||||
|
Common-Flow.</p>
|
||||||
|
<p>However if your deployments/releases have specific version numbers, then
|
||||||
|
Common-Flow gives you a simple set of rules of how to create and manage
|
||||||
|
releases, on top of what GitHub Flow already does.</p>
|
||||||
|
<h3 id="what-does-descriptive-name-mean-for-change-branches">What does "descriptive name" mean for change branches?</h3>
|
||||||
|
<p>It means what it sounds like. The name should be descriptive, as in by just
|
||||||
|
reading the name of the branch you should understand what the branch's purpose
|
||||||
|
is and what it does. Here's a few examples:</p>
|
||||||
|
<ul>
|
||||||
|
<li>add-2fa-support</li>
|
||||||
|
<li>fix-login-issue</li>
|
||||||
|
<li>remove-sort-by-middle-name-functionality</li>
|
||||||
|
<li>update-font-awesome</li>
|
||||||
|
<li>change-search-behavior</li>
|
||||||
|
<li>tweak-footer-style</li>
|
||||||
|
</ul>
|
||||||
|
<p>Notice how none of these have any prefixes like "feature/" or "hotfix/", they're
|
||||||
|
not needed when branch names are properly descriptive. However there's nothing
|
||||||
|
to say you can't use such prefixes if you want. That also means that you can add
|
||||||
|
ticket number prefixes if your team/org has that as part of it's process.</p>
|
||||||
|
<h3 id="how-do-we-release-an-emergency-hotfix-when-the-master-branch-is-broken">How do we release an emergency hotfix when the master branch is broken?</h3>
|
||||||
|
<p>This should ideally never happen, however if it does you can do one of the
|
||||||
|
following:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Review why the master branch is broken and revert the changes that caused the
|
||||||
|
issues. Then apply the hotfix and release.</li>
|
||||||
|
<li>Or use a short-term release branch created from the latest release tag instead
|
||||||
|
of the master branch. Apply the hotfix to the release branch, create a release
|
||||||
|
tag on the release branch, and then merge it back into master.</li>
|
||||||
|
</ul>
|
||||||
|
<p>In this situation, it is recommended you try to revert the offending changes
|
||||||
|
that's preventing a new release from master. But if that proves to be a
|
||||||
|
complicated task and you're short on time, a short-term release branch gives you
|
||||||
|
a instant fix to the situation at hand, and let's you resolve the issues with
|
||||||
|
the master branch when you have more time on your hands.</p>
|
||||||
|
<h2 id="about">About</h2>
|
||||||
|
<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>
|
||||||
|
<h2 id="license">License</h2>
|
||||||
|
<p><a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons - CC BY 3.0</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript" src="/assets/main-870855580c69dec57be4c965d0cf8afe78afa6b7b6f6bdb5aff91ac0256c0a1a.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
1
docs/robots.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Sitemap: https://commonflow.org/sitemap.xml
|
||||||
18
docs/sitemap.xml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||||
|
<url>
|
||||||
|
<loc>https://commonflow.org/spec/1.0.0-rc.1.html</loc>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://commonflow.org/spec/1.0.0-rc.2.html</loc>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://commonflow.org/spec/1.0.0-rc.3.html</loc>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://commonflow.org/spec/1.0.0-rc.4.html</loc>
|
||||||
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://commonflow.org/</loc>
|
||||||
|
</url>
|
||||||
|
</urlset>
|
||||||
248
docs/spec/1.0.0-rc.1.html
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:700,300|Open+Sans:400italic,700italic,400,700' rel='stylesheet' type='text/css'>
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous">
|
||||||
|
<link rel="stylesheet" href="https:////maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
<link type="text/css" rel="stylesheet" href="/assets/main-16db41e8ef2362fe9967bb0bee92e459cf76f2a846e85c96322243077a88c301.css">
|
||||||
|
<!-- Begin Jekyll SEO tag v2.2.3 -->
|
||||||
|
<title>Git Common-Flow 1.0.0-rc.1 | Git Common Flow</title>
|
||||||
|
<meta property="og:title" content="Git Common-Flow 1.0.0-rc.1" />
|
||||||
|
<meta name="author" content="Jim Myhrberg" />
|
||||||
|
<meta property="og:locale" content="en_US" />
|
||||||
|
<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 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." />
|
||||||
|
<link rel="canonical" href="https://commonflow.org/spec/1.0.0-rc.1.html" />
|
||||||
|
<meta property="og:url" content="https://commonflow.org/spec/1.0.0-rc.1.html" />
|
||||||
|
<meta property="og:site_name" content="Git Common Flow" />
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{"@context":"http://schema.org","@type":"WebPage","headline":"Git Common-Flow 1.0.0-rc.1","author":{"@type":"Person","name":"Jim Myhrberg"},"description":"An attempt to gather a sensible selection of the most common usage patterns of git into a single and concise specification.","url":"https://commonflow.org/spec/1.0.0-rc.1.html"}
|
||||||
|
</script>
|
||||||
|
<!-- End Jekyll SEO tag -->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="layout">
|
||||||
|
<a href="#menu" id="menuLink" class="menu-link">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
|
<div id="menu">
|
||||||
|
<div class="pure-menu">
|
||||||
|
<ul class="pure-menu-list">
|
||||||
|
<li class="pure-menu-item">
|
||||||
|
<div class="pure-menu-label">Versions:</div>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.4">
|
||||||
|
<a href="/spec/1.0.0-rc.4.html" class="pure-menu-link">1.0.0-rc.4</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.3">
|
||||||
|
<a href="/spec/1.0.0-rc.3.html" class="pure-menu-link">1.0.0-rc.3</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.2">
|
||||||
|
<a href="/spec/1.0.0-rc.2.html" class="pure-menu-link">1.0.0-rc.2</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.1 pure-menu-selected">
|
||||||
|
<a href="/spec/1.0.0-rc.1.html" class="pure-menu-link">1.0.0-rc.1</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="links">
|
||||||
|
<a href="https://github.com/jimeh/common-flow">
|
||||||
|
<i class="fa fa-github" aria-hidden="true"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main">
|
||||||
|
<div class="content">
|
||||||
|
<h1 id="git-common-flow-100-rc1">Git Common-Flow 1.0.0-rc.1</h1>
|
||||||
|
<p><img src="/spec/1.0.0-rc.1.svg" width="100%" /></p>
|
||||||
|
<h2 id="summary">Summary</h2>
|
||||||
|
<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>
|
||||||
|
<h2 id="terminology">Terminology</h2>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Master Branch</strong> - Must always have passing tests, is considered bleeding
|
||||||
|
edge, and must be named <code class="highlighter-rouge">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 class="highlighter-rouge">stable-X.Y</code> naming pattern, where <code class="highlighter-rouge">X</code> is MAJOR version and <code class="highlighter-rouge">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>
|
||||||
|
<h2 id="git-common-flow-specification-common-flow">Git Common-Flow Specification (Common-Flow)</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>
|
||||||
|
<h2 id="about">About</h2>
|
||||||
|
<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>
|
||||||
|
<h2 id="license">License</h2>
|
||||||
|
<p><a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons - CC BY 3.0</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript" src="/assets/main-870855580c69dec57be4c965d0cf8afe78afa6b7b6f6bdb5aff91ac0256c0a1a.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
2
docs/spec/1.0.0-rc.1.svg
Normal file
|
After Width: | Height: | Size: 18 KiB |
282
docs/spec/1.0.0-rc.2.html
Normal file
@@ -0,0 +1,282 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:700,300|Open+Sans:400italic,700italic,400,700' rel='stylesheet' type='text/css'>
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous">
|
||||||
|
<link rel="stylesheet" href="https:////maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
<link type="text/css" rel="stylesheet" href="/assets/main-16db41e8ef2362fe9967bb0bee92e459cf76f2a846e85c96322243077a88c301.css">
|
||||||
|
<!-- Begin Jekyll SEO tag v2.2.3 -->
|
||||||
|
<title>Git Common-Flow 1.0.0-rc.2 | Git Common Flow</title>
|
||||||
|
<meta property="og:title" content="Git Common-Flow 1.0.0-rc.2" />
|
||||||
|
<meta name="author" content="Jim Myhrberg" />
|
||||||
|
<meta property="og:locale" content="en_US" />
|
||||||
|
<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 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." />
|
||||||
|
<link rel="canonical" href="https://commonflow.org/spec/1.0.0-rc.2.html" />
|
||||||
|
<meta property="og:url" content="https://commonflow.org/spec/1.0.0-rc.2.html" />
|
||||||
|
<meta property="og:site_name" content="Git Common Flow" />
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{"@context":"http://schema.org","@type":"WebPage","headline":"Git Common-Flow 1.0.0-rc.2","author":{"@type":"Person","name":"Jim Myhrberg"},"description":"An attempt to gather a sensible selection of the most common usage patterns of git into a single and concise specification.","url":"https://commonflow.org/spec/1.0.0-rc.2.html"}
|
||||||
|
</script>
|
||||||
|
<!-- End Jekyll SEO tag -->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="layout">
|
||||||
|
<a href="#menu" id="menuLink" class="menu-link">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
|
<div id="menu">
|
||||||
|
<div class="pure-menu">
|
||||||
|
<ul class="pure-menu-list">
|
||||||
|
<li class="pure-menu-item">
|
||||||
|
<div class="pure-menu-label">Versions:</div>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.4">
|
||||||
|
<a href="/spec/1.0.0-rc.4.html" class="pure-menu-link">1.0.0-rc.4</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.3">
|
||||||
|
<a href="/spec/1.0.0-rc.3.html" class="pure-menu-link">1.0.0-rc.3</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.2 pure-menu-selected">
|
||||||
|
<a href="/spec/1.0.0-rc.2.html" class="pure-menu-link">1.0.0-rc.2</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.1">
|
||||||
|
<a href="/spec/1.0.0-rc.1.html" class="pure-menu-link">1.0.0-rc.1</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="links">
|
||||||
|
<a href="https://github.com/jimeh/common-flow">
|
||||||
|
<i class="fa fa-github" aria-hidden="true"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main">
|
||||||
|
<div class="content">
|
||||||
|
<h1 id="git-common-flow-100-rc2">Git Common-Flow 1.0.0-rc.2</h1>
|
||||||
|
<p><img src="/spec/1.0.0-rc.2.svg" width="100%" /></p>
|
||||||
|
<h2 id="summary">Summary</h2>
|
||||||
|
<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>
|
||||||
|
<h2 id="terminology">Terminology</h2>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Master Branch</strong> - Must always have passing tests, is considered bleeding
|
||||||
|
edge, and must be named <code class="highlighter-rouge">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>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, and a git tag named according
|
||||||
|
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>
|
||||||
|
<h2 id="git-common-flow-specification-common-flow">Git Common-Flow Specification (Common-Flow)</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 possibly ready for
|
||||||
|
release/production" state to reduce any friction with creating a new
|
||||||
|
release.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Change Branches
|
||||||
|
<ol>
|
||||||
|
<li>Each change (feature, bugfix, etc.) MUST be performed on separate
|
||||||
|
branches that SHOULD be referred to as "change branches". 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>You MUST create separate change branches for each distinctly different
|
||||||
|
change. You MUST NOT include multiple unrelated changes into a single
|
||||||
|
change branch.</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.</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 to do a
|
||||||
|
force push, and you SHOULD use the "--force-with-lease" git push option.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Pull Requests
|
||||||
|
<ol>
|
||||||
|
<li>To merge a change branch into its merge target, 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, the RECOMMENDED way to do so is by creating a pull request and
|
||||||
|
discuss the changes with others there.</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 which
|
||||||
|
changes the hard-coded version string of the project. The version bump
|
||||||
|
commit MUST have a git tag created on it and named as the exact version
|
||||||
|
string.</li>
|
||||||
|
<li>If you are not using a release branch, then the version bump commit MUST
|
||||||
|
be created directly on the master branch.</li>
|
||||||
|
<li>The 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". You
|
||||||
|
MUST not use a mix of "v" prefixed and non-prefixed tags. Pick one form
|
||||||
|
and stick to it.</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>Release Branches
|
||||||
|
<ol>
|
||||||
|
<li>Any branch that has a name starting with "release-" SHOULD be referred to
|
||||||
|
as a "release branch".</li>
|
||||||
|
<li>Use of release branches is OPTIONAL.</li>
|
||||||
|
<li>Changes in a release 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. One exception to this is version bump commits.</li>
|
||||||
|
<li>There are two types of release branches; short-term, and long-term.</li>
|
||||||
|
<li>Short-Term Release Branches
|
||||||
|
<ol>
|
||||||
|
<li>Used for creating a specific versioned release.</li>
|
||||||
|
<li>A short-term release branch is RECOMMENDED if there is a lengthy
|
||||||
|
pre-release verification process to avoid a code freeze on the master
|
||||||
|
branch.</li>
|
||||||
|
<li>MUST have a name of "release-VERSION". For example for version
|
||||||
|
"2.11.4" the release branch name MUST be "release-2.11.4".</li>
|
||||||
|
<li>When using a short-term release branch, the version bump commit and
|
||||||
|
release tag MUST be made directly on the release branch itself.</li>
|
||||||
|
<li>Only very minor changes should be performed on a short-term release
|
||||||
|
branch directly. Any larger changes SHOULD be done in the master
|
||||||
|
branch, and SHOULD be pulled into the release branch by rebasing it
|
||||||
|
on top of the master branch the same way a change branch pulls in
|
||||||
|
updates from its source branch.</li>
|
||||||
|
<li>After the version bump commit and release tag have been created, the
|
||||||
|
release branch MUST be merged back into its source branch and then
|
||||||
|
deleted. Typically the source branch will be the master branch.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Long-Term Release Branches
|
||||||
|
<ol>
|
||||||
|
<li>Used for work on versions which are not currently part of the master
|
||||||
|
branch. Typically this is useful when you need to create a new
|
||||||
|
maintenance release for a older version.</li>
|
||||||
|
<li>The branch name MUST have a non-specific version number. For example
|
||||||
|
a long-term release branch for creating new 2.9.x releases would be
|
||||||
|
named "release-2.9".</li>
|
||||||
|
<li>To create a new release from a long-term release branch, you MUST
|
||||||
|
create a version bump commit and release tag directly on the release
|
||||||
|
branch.</li>
|
||||||
|
<li>A long-term release branch MUST be created from the relevant release
|
||||||
|
tag. For example if the master branch is on version 2.11.4 and there
|
||||||
|
is a security fix for all 2.9.x releases, the latest of which is
|
||||||
|
"2.9.7". Create a new branch called "release-2.9" off of the "2.9.7"
|
||||||
|
release tag. The security fix release will then end up being version
|
||||||
|
"2.9.8".</li>
|
||||||
|
</ol>
|
||||||
|
</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 into 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 into 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>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 never blindly commit all changes with "git commit -a". It is
|
||||||
|
RECOMMENDED you use "git add -i" to add individual changes to the staging
|
||||||
|
area so you are fully aware of what you are committing.</li>
|
||||||
|
<li>You SHOULD always use "--force-with-lease" when doing a force push. The
|
||||||
|
regular "--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>
|
||||||
|
</ol>
|
||||||
|
<h2 id="about">About</h2>
|
||||||
|
<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>
|
||||||
|
<h2 id="license">License</h2>
|
||||||
|
<p><a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons - CC BY 3.0</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript" src="/assets/main-870855580c69dec57be4c965d0cf8afe78afa6b7b6f6bdb5aff91ac0256c0a1a.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
2
docs/spec/1.0.0-rc.2.svg
Normal file
|
After Width: | Height: | Size: 18 KiB |
291
docs/spec/1.0.0-rc.3.html
Normal file
@@ -0,0 +1,291 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:700,300|Open+Sans:400italic,700italic,400,700' rel='stylesheet' type='text/css'>
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous">
|
||||||
|
<link rel="stylesheet" href="https:////maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
<link type="text/css" rel="stylesheet" href="/assets/main-16db41e8ef2362fe9967bb0bee92e459cf76f2a846e85c96322243077a88c301.css">
|
||||||
|
<!-- Begin Jekyll SEO tag v2.2.3 -->
|
||||||
|
<title>Git Common-Flow 1.0.0-rc.3 | Git Common Flow</title>
|
||||||
|
<meta property="og:title" content="Git Common-Flow 1.0.0-rc.3" />
|
||||||
|
<meta name="author" content="Jim Myhrberg" />
|
||||||
|
<meta property="og:locale" content="en_US" />
|
||||||
|
<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 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." />
|
||||||
|
<link rel="canonical" href="https://commonflow.org/spec/1.0.0-rc.3.html" />
|
||||||
|
<meta property="og:url" content="https://commonflow.org/spec/1.0.0-rc.3.html" />
|
||||||
|
<meta property="og:site_name" content="Git Common Flow" />
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{"@context":"http://schema.org","@type":"WebPage","headline":"Git Common-Flow 1.0.0-rc.3","author":{"@type":"Person","name":"Jim Myhrberg"},"description":"An attempt to gather a sensible selection of the most common usage patterns of git into a single and concise specification.","url":"https://commonflow.org/spec/1.0.0-rc.3.html"}
|
||||||
|
</script>
|
||||||
|
<!-- End Jekyll SEO tag -->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="layout">
|
||||||
|
<a href="#menu" id="menuLink" class="menu-link">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
|
<div id="menu">
|
||||||
|
<div class="pure-menu">
|
||||||
|
<ul class="pure-menu-list">
|
||||||
|
<li class="pure-menu-item">
|
||||||
|
<div class="pure-menu-label">Versions:</div>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.4">
|
||||||
|
<a href="/spec/1.0.0-rc.4.html" class="pure-menu-link">1.0.0-rc.4</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.3 pure-menu-selected">
|
||||||
|
<a href="/spec/1.0.0-rc.3.html" class="pure-menu-link">1.0.0-rc.3</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.2">
|
||||||
|
<a href="/spec/1.0.0-rc.2.html" class="pure-menu-link">1.0.0-rc.2</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.1">
|
||||||
|
<a href="/spec/1.0.0-rc.1.html" class="pure-menu-link">1.0.0-rc.1</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="links">
|
||||||
|
<a href="https://github.com/jimeh/common-flow">
|
||||||
|
<i class="fa fa-github" aria-hidden="true"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main">
|
||||||
|
<div class="content">
|
||||||
|
<h1 id="git-common-flow-100-rc3">Git Common-Flow 1.0.0-rc.3</h1>
|
||||||
|
<p><img src="/spec/1.0.0-rc.3.svg" width="100%" /></p>
|
||||||
|
<h2 id="summary">Summary</h2>
|
||||||
|
<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>In short, Common-Flow is essentially GitHub Flow with the addition of versioned
|
||||||
|
releases, optional release branches, and without the requirement to deploy to
|
||||||
|
production all the time.</p>
|
||||||
|
<h2 id="terminology">Terminology</h2>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Master Branch</strong> - Must be named "master", must always have passing tests,
|
||||||
|
and is not guaranteed to always work in production environments.</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>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> - May be considered safe to use in production
|
||||||
|
environments. Consists of a version bump commit, and a git tag named according
|
||||||
|
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>
|
||||||
|
<h2 id="git-common-flow-specification-common-flow">Git Common-Flow Specification (Common-Flow)</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>TL;DR
|
||||||
|
<ol>
|
||||||
|
<li>Don't break the master branch.</li>
|
||||||
|
<li>A release is a git tag.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<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 always be in a non-broken state with its test
|
||||||
|
suite passing.</li>
|
||||||
|
<li>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.</li>
|
||||||
|
<li>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.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Change Branches
|
||||||
|
<ol>
|
||||||
|
<li>Each change (feature, bugfix, etc.) MUST be performed on separate
|
||||||
|
branches that SHOULD be referred to as "change branches". 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>You MUST create separate change branches for each distinctly different
|
||||||
|
change. You MUST NOT include multiple unrelated changes into a single
|
||||||
|
change branch.</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.</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 to do a
|
||||||
|
force push, and you SHOULD use the "--force-with-lease" git push option.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Pull Requests
|
||||||
|
<ol>
|
||||||
|
<li>To merge a change branch into its merge target, 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, the RECOMMENDED way to do so is by creating a pull request and
|
||||||
|
discuss the changes with others there.</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 which
|
||||||
|
changes the hard-coded version string of the project. The version bump
|
||||||
|
commit MUST have a git tag created on it and named as the exact version
|
||||||
|
string.</li>
|
||||||
|
<li>If you are not using a release branch, then the version bump commit MUST
|
||||||
|
be created directly on the master branch.</li>
|
||||||
|
<li>The 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". You
|
||||||
|
MUST not use a mix of "v" prefixed and non-prefixed tags. Pick one form
|
||||||
|
and stick to it.</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>Release Branches
|
||||||
|
<ol>
|
||||||
|
<li>Any branch that has a name starting with "release-" SHOULD be referred to
|
||||||
|
as a "release branch".</li>
|
||||||
|
<li>Use of release branches is OPTIONAL.</li>
|
||||||
|
<li>Changes in a release 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. One exception to this is version bump commits.</li>
|
||||||
|
<li>There are two types of release branches; short-term, and long-term.</li>
|
||||||
|
<li>Short-Term Release Branches
|
||||||
|
<ol>
|
||||||
|
<li>Used for creating a specific versioned release.</li>
|
||||||
|
<li>A short-term release branch is RECOMMENDED if there is a lengthy
|
||||||
|
pre-release verification process to avoid a code freeze on the master
|
||||||
|
branch.</li>
|
||||||
|
<li>MUST have a name of "release-VERSION". For example for version
|
||||||
|
"2.11.4" the release branch name MUST be "release-2.11.4".</li>
|
||||||
|
<li>When using a short-term release branch, the version bump commit and
|
||||||
|
release tag MUST be made directly on the release branch itself.</li>
|
||||||
|
<li>Only very minor changes should be performed on a short-term release
|
||||||
|
branch directly. Any larger changes SHOULD be done in the master
|
||||||
|
branch, and SHOULD be pulled into the release branch by rebasing it
|
||||||
|
on top of the master branch the same way a change branch pulls in
|
||||||
|
updates from its source branch.</li>
|
||||||
|
<li>After the version bump commit and release tag have been created, the
|
||||||
|
release branch MUST be merged back into its source branch and then
|
||||||
|
deleted. Typically the source branch will be the master branch.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Long-Term Release Branches
|
||||||
|
<ol>
|
||||||
|
<li>Used for work on versions which are not currently part of the master
|
||||||
|
branch. Typically this is useful when you need to create a new
|
||||||
|
maintenance release for a older version.</li>
|
||||||
|
<li>The branch name MUST have a non-specific version number. For example
|
||||||
|
a long-term release branch for creating new 2.9.x releases would be
|
||||||
|
named "release-2.9".</li>
|
||||||
|
<li>To create a new release from a long-term release branch, you MUST
|
||||||
|
create a version bump commit and release tag directly on the release
|
||||||
|
branch.</li>
|
||||||
|
<li>A long-term release branch MUST be created from the relevant release
|
||||||
|
tag. For example if the master branch is on version 2.11.4 and there
|
||||||
|
is a security fix for all 2.9.x releases, the latest of which is
|
||||||
|
"2.9.7". Create a new branch called "release-2.9" off of the "2.9.7"
|
||||||
|
release tag. The security fix release will then end up being version
|
||||||
|
"2.9.8".</li>
|
||||||
|
</ol>
|
||||||
|
</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 into 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 into 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>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#_commit_guidelines">https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project#_commit_guidelines</a></li>
|
||||||
|
<li>You SHOULD never blindly commit all changes with "git commit -a". It is
|
||||||
|
RECOMMENDED you use "git add -i" to add individual changes to the staging
|
||||||
|
area so you are fully aware of what you are committing.</li>
|
||||||
|
<li>You SHOULD always use "--force-with-lease" when doing a force push. The
|
||||||
|
regular "--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>
|
||||||
|
</ol>
|
||||||
|
<h2 id="about">About</h2>
|
||||||
|
<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>
|
||||||
|
<h2 id="license">License</h2>
|
||||||
|
<p><a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons - CC BY 3.0</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript" src="/assets/main-870855580c69dec57be4c965d0cf8afe78afa6b7b6f6bdb5aff91ac0256c0a1a.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
2
docs/spec/1.0.0-rc.3.svg
Normal file
|
After Width: | Height: | Size: 18 KiB |
403
docs/spec/1.0.0-rc.4.html
Normal file
@@ -0,0 +1,403 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<link href='https://fonts.googleapis.com/css?family=Open+Sans+Condensed:700,300|Open+Sans:400italic,700italic,400,700' rel='stylesheet' type='text/css'>
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous">
|
||||||
|
<link rel="stylesheet" href="https:////maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||||
|
<link type="text/css" rel="stylesheet" href="/assets/main-16db41e8ef2362fe9967bb0bee92e459cf76f2a846e85c96322243077a88c301.css">
|
||||||
|
<!-- Begin Jekyll SEO tag v2.2.3 -->
|
||||||
|
<title>Git Common-Flow 1.0.0-rc.4 | Git Common Flow</title>
|
||||||
|
<meta property="og:title" content="Git Common-Flow 1.0.0-rc.4" />
|
||||||
|
<meta name="author" content="Jim Myhrberg" />
|
||||||
|
<meta property="og:locale" content="en_US" />
|
||||||
|
<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 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." />
|
||||||
|
<link rel="canonical" href="https://commonflow.org/spec/1.0.0-rc.4.html" />
|
||||||
|
<meta property="og:url" content="https://commonflow.org/spec/1.0.0-rc.4.html" />
|
||||||
|
<meta property="og:site_name" content="Git Common Flow" />
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{"@context":"http://schema.org","@type":"WebPage","headline":"Git Common-Flow 1.0.0-rc.4","author":{"@type":"Person","name":"Jim Myhrberg"},"description":"An attempt to gather a sensible selection of the most common usage patterns of git into a single and concise specification.","url":"https://commonflow.org/spec/1.0.0-rc.4.html"}
|
||||||
|
</script>
|
||||||
|
<!-- End Jekyll SEO tag -->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="layout">
|
||||||
|
<a href="#menu" id="menuLink" class="menu-link">
|
||||||
|
<span></span>
|
||||||
|
</a>
|
||||||
|
<div id="menu">
|
||||||
|
<div class="pure-menu">
|
||||||
|
<ul class="pure-menu-list">
|
||||||
|
<li class="pure-menu-item">
|
||||||
|
<div class="pure-menu-label">Versions:</div>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.4 pure-menu-selected">
|
||||||
|
<a href="/spec/1.0.0-rc.4.html" class="pure-menu-link">1.0.0-rc.4</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.3">
|
||||||
|
<a href="/spec/1.0.0-rc.3.html" class="pure-menu-link">1.0.0-rc.3</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.2">
|
||||||
|
<a href="/spec/1.0.0-rc.2.html" class="pure-menu-link">1.0.0-rc.2</a>
|
||||||
|
</li>
|
||||||
|
<li class="pure-menu-item version-1.0.0-rc.1">
|
||||||
|
<a href="/spec/1.0.0-rc.1.html" class="pure-menu-link">1.0.0-rc.1</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="links">
|
||||||
|
<a href="https://github.com/jimeh/common-flow">
|
||||||
|
<i class="fa fa-github" aria-hidden="true"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="main">
|
||||||
|
<div class="content">
|
||||||
|
<h1 id="git-common-flow-100-rc4">Git Common-Flow 1.0.0-rc.4</h1>
|
||||||
|
<p><img src="/spec/1.0.0-rc.4.svg" width="100%" /></p>
|
||||||
|
<h2 id="summary">Summary</h2>
|
||||||
|
<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>In short, Common-Flow is essentially GitHub Flow with the addition of versioned
|
||||||
|
releases, optional release branches, and without the requirement to deploy to
|
||||||
|
production all the time.</p>
|
||||||
|
<h2 id="terminology">Terminology</h2>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Master Branch</strong> - Must be named "master", must always have passing tests,
|
||||||
|
and is not guaranteed to always work in production environments.</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>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> - May be considered safe to use in production environments. Is
|
||||||
|
effectively just a git tag named after the version of the release.</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>
|
||||||
|
<h2 id="git-common-flow-specification-common-flow">Git Common-Flow Specification (Common-Flow)</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>TL;DR
|
||||||
|
<ol>
|
||||||
|
<li>Don't break the master branch.</li>
|
||||||
|
<li>A release is a git tag.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<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 always be in a non-broken state with its test
|
||||||
|
suite passing.</li>
|
||||||
|
<li>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.</li>
|
||||||
|
<li>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.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Change Branches
|
||||||
|
<ol>
|
||||||
|
<li>Each change (feature, bugfix, etc.) MUST be performed on separate
|
||||||
|
branches that SHOULD be referred to as "change branches".</li>
|
||||||
|
<li>All change branches MUST have descriptive names.</li>
|
||||||
|
<li>It is RECOMMENDED that you commit often locally, and that you try and
|
||||||
|
keep the commits reasonably structured to avoid a messy and confusing git
|
||||||
|
history.</li>
|
||||||
|
<li>You SHOULD regularly push your work to the same named branch on the
|
||||||
|
remote server.</li>
|
||||||
|
<li>You SHOULD create separate change branches for each distinctly different
|
||||||
|
change. You SHOULD NOT include multiple unrelated changes into a single
|
||||||
|
change branch.</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.</li>
|
||||||
|
<li>After updating a change branch from its source branch you MUST push the
|
||||||
|
change branch to the remote server. Due to the nature of rebasing, you
|
||||||
|
will be required to do a force push, and you MUST use the
|
||||||
|
"--force-with-lease" git push option when doing so instead of the regular
|
||||||
|
"--force".</li>
|
||||||
|
<li>If there is a truly valid technical reason to not use rebase when
|
||||||
|
updating change branches, then you can update change branches via merge
|
||||||
|
instead of rebase. The decision to use merge MUST only be taken after all
|
||||||
|
possible options to use rebase have been tried and failed. People not
|
||||||
|
understanding how to use rebase is NOT a valid reason to use merge. If
|
||||||
|
you do decide to use merge instead of rebase, you MUST NOT use a mixture
|
||||||
|
of both methods, pick one and stick to it.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Pull Requests
|
||||||
|
<ol>
|
||||||
|
<li>To merge a change branch into its merge target, you MUST open a "pull
|
||||||
|
request" (or equivalent).</li>
|
||||||
|
<li>The purpose of a pull request is to allow others to review your changes
|
||||||
|
and give feedback. You can then fix any issues, complaints, and more that
|
||||||
|
might arise, and then let people review again.</li>
|
||||||
|
<li>Before creating a pull request, it is RECOMMENDED that you consider the
|
||||||
|
state of your change branch's commit history. If it is messy and
|
||||||
|
confusing, it might be a good idea to rebase your branch with "git rebase
|
||||||
|
-i" to present a cleaner and easier to follow commit history for your
|
||||||
|
reviewers.</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, the RECOMMENDED way to do so is by creating a pull request and
|
||||||
|
discuss the changes with others there.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Versioning
|
||||||
|
<ol>
|
||||||
|
<li>A "version string" is a typically mostly numeric string that identifies a
|
||||||
|
specific version of a project. The version string itself MUST NOT have a
|
||||||
|
"v" prefix, but the version string can be displayed with a "v" prefix to
|
||||||
|
indicate it is a version that is being referred to.</li>
|
||||||
|
<li>The source of truth for a project's version MUST be a git tag with a name
|
||||||
|
based on the version string. This kind of tag MUST be referred to as a
|
||||||
|
"release tag".</li>
|
||||||
|
<li>It is OPTIONAL, but RECOMMENDED to also keep the version string
|
||||||
|
hard-coded somewhere in the project code-base.</li>
|
||||||
|
<li>If you hard-code the version string into the code-base, it is RECOMMENDED
|
||||||
|
that you do so in a file called "VERSION" located in the root of the
|
||||||
|
project. But be mindful of the conventions of your programming language
|
||||||
|
and community when choosing if, where and how to hard-code the version
|
||||||
|
string.</li>
|
||||||
|
<li>If you are using a "VERSION" file in the root of the project, this file
|
||||||
|
MUST only contain the exact version string, meaning it MUST NOT have a
|
||||||
|
"v" prefix. For example "v2.11.4" is bad, and "2.11.4" is good.</li>
|
||||||
|
<li>It is OPTIONAL, but RECOMMENDED that that the version string follows
|
||||||
|
Semantic Versioning (<a href="http://semver.org/">http://semver.org/</a>).</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Releases
|
||||||
|
<ol>
|
||||||
|
<li>To create a new release, you MUST create a git tag named as the exact
|
||||||
|
version string of the release. This kind of tag MUST be referred to as a
|
||||||
|
"release tag".</li>
|
||||||
|
<li>The release tag name can OPTIONALLY be prefixed with "v". For example the
|
||||||
|
tag name can be either "2.11.4" or "v2.11.4". It is however RECOMMENDED
|
||||||
|
that you do not use a "v" prefix. You MUST NOT use a mixture of "v"
|
||||||
|
prefixed and non-prefixed tags. Pick one form and stick to it.</li>
|
||||||
|
<li>If the version string is hard-coded into the code-base, you MUST create a
|
||||||
|
"version bump" commit which changes the hard-coded version string of the
|
||||||
|
project.</li>
|
||||||
|
<li>When using version bump commits, the release tag MUST be placed on the
|
||||||
|
version bump commit.</li>
|
||||||
|
<li>If you are not using a release branch, then the release tag, and if
|
||||||
|
relevant the version bump commit, MUST be created directly on the master
|
||||||
|
branch.</li>
|
||||||
|
<li>The version bump commit SHOULD 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 SHOULD read: "Bump version to
|
||||||
|
2.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
|
||||||
|
SHOULD read "Release VERSION". For example for version "2.11.4" the first
|
||||||
|
line of the tag annotation SHOULD read "Release 2.11.4". The second line
|
||||||
|
MUST be blank, and the changelog MUST start on the third line.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Short-Term Release Branches
|
||||||
|
<ol>
|
||||||
|
<li>Any branch that has a name starting with "release-" SHOULD be referred to
|
||||||
|
as a "release branch".</li>
|
||||||
|
<li>Any release branch which has a name ending with a specific version
|
||||||
|
string, MUST be referred to as a "short-term release branch".</li>
|
||||||
|
<li>Use of short-term release branches are OPTIONAL, and intended to be used
|
||||||
|
to create a specific versioned release.</li>
|
||||||
|
<li>A short-term release branch is RECOMMENDED if there is a lengthy
|
||||||
|
pre-release verification process to avoid a code freeze on the master
|
||||||
|
branch.</li>
|
||||||
|
<li>Short-term release branches MUST have a name of "release-VERSION". For
|
||||||
|
example for version "2.11.4" the release branch name MUST be
|
||||||
|
"release-2.11.4".</li>
|
||||||
|
<li>When using a short-term release branch to create a release, the release
|
||||||
|
tag and if used, version bump commit, MUST be placed directly on the
|
||||||
|
short-term release branch itself.</li>
|
||||||
|
<li>Only very minor changes should be performed on a short-term release
|
||||||
|
branch directly. Any larger changes SHOULD be done in the master branch,
|
||||||
|
and SHOULD be pulled into the release branch by rebasing it on top of the
|
||||||
|
master branch the same way a change branch pulls in updates from its
|
||||||
|
source branch.</li>
|
||||||
|
<li>After a release tag has been created, the release branch MUST be merged
|
||||||
|
back into its source branch and then deleted. Typically the source branch
|
||||||
|
will be the master branch.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Long-term Release Branches
|
||||||
|
<ol>
|
||||||
|
<li>Any release branch which has a name ending with a non-specific version
|
||||||
|
string, MUST be referred to as a "long-term release branch". For example
|
||||||
|
"release-2.11" is a long-term release branch, while "release-2.11.4" is a
|
||||||
|
short-term release branch.</li>
|
||||||
|
<li>Use of long-term release branches are OPTIONAL, and intended for work on
|
||||||
|
versions which are not currently part of the master branch. Typically
|
||||||
|
this is useful when you need to create a new maintenance release for a
|
||||||
|
older version.</li>
|
||||||
|
<li>A long-term release branch MUST have a name with a non-specific version
|
||||||
|
number. For example a long-term release branch for creating new 2.9.x
|
||||||
|
releases MUST be named "release-2.9".</li>
|
||||||
|
<li>Long-term release branches for maintenance releases of older versions
|
||||||
|
MUST be created from the relevant release tag. For example if the master
|
||||||
|
branch is on version 2.11.4 and there is a security fix for all 2.9.x
|
||||||
|
releases, the latest of which is "2.9.7". Create a new branch called
|
||||||
|
"release-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>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.</li>
|
||||||
|
<li>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.</li>
|
||||||
|
</ol>
|
||||||
|
</li>
|
||||||
|
<li>Bug Fixes & Rollback
|
||||||
|
<ol>
|
||||||
|
<li>You MUST NOT under any circumstances force push to the master branch or
|
||||||
|
to long-term release branches.</li>
|
||||||
|
<li>If a change branch which has been merged into 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 into 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>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#_commit_guidelines">https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project#_commit_guidelines</a></li>
|
||||||
|
<li>You SHOULD never blindly commit all changes with "git commit -a". It is
|
||||||
|
RECOMMENDED you use "git add -i" or "git add -p" to add individual
|
||||||
|
changes to the staging area so you are fully aware of what you are
|
||||||
|
committing.</li>
|
||||||
|
<li>You SHOULD always use "--force-with-lease" when doing a force push. The
|
||||||
|
regular "--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>
|
||||||
|
</ol>
|
||||||
|
<h2 id="faq">FAQ</h2>
|
||||||
|
<h3 id="why-use-common-flow-instead-of-git-flow-and-how-does-it-differ">Why use Common-Flow instead of Git Flow, and how does it differ?</h3>
|
||||||
|
<p>Common-Flow tries to be a lot less complicated than Git Flow by having fewer
|
||||||
|
types of branches, and simpler rules. Normal day to day development doesn't
|
||||||
|
really change much:</p>
|
||||||
|
<ul>
|
||||||
|
<li>You create change branches instead of feature branches, without the need of a
|
||||||
|
"feature/" or "change/" prefix in the branch name.</li>
|
||||||
|
<li>Change branches are typically created off of and merged back into "master"
|
||||||
|
instead of "develop".</li>
|
||||||
|
<li>Creating a release is done by simply creating a git tag, typically on the
|
||||||
|
master branch.</li>
|
||||||
|
</ul>
|
||||||
|
<p>In detail, the main differences between Git Flow and Common-Flow are:</p>
|
||||||
|
<ul>
|
||||||
|
<li>There is no "develop" branch, there is only a "master" branch which contains
|
||||||
|
the latest work. In Git Flow the master branch effectively ends up just being
|
||||||
|
a pointer to the latest release, despite the fact that Git Flow includes
|
||||||
|
release tags too. In Common-Flow you just look at the tags to find the latest
|
||||||
|
release.</li>
|
||||||
|
<li>There are no "feature" or "hotfix" branches, there's only "change"
|
||||||
|
branches. Any branch that is not master and introduces changes is a change
|
||||||
|
branch. Change branches also don't have a enforced naming convention, they
|
||||||
|
just have to have a "descriptive name". This makes things simpler and allows
|
||||||
|
more flexibility.</li>
|
||||||
|
<li>Release branches are available, but optional. Instead of enforcing the use of
|
||||||
|
release branches like Git Flow, Common-Flow only recommends the use of release
|
||||||
|
branches when it makes things easier. If creating a new release by tagging
|
||||||
|
"master" works for you, great, do that.</li>
|
||||||
|
</ul>
|
||||||
|
<h3 id="why-use-common-flow-instead-of-github-flow-and-how-does-it-differ">Why use Common-Flow instead of GitHub Flow, and how does it differ?</h3>
|
||||||
|
<p>Common-Flow is essentially GitHub Flow with the addition of a "Release" concept
|
||||||
|
that uses tags. It also attempts to define how certain common tasks are done,
|
||||||
|
like updating change/feature branches from their source branches for
|
||||||
|
example. This is to help end arguments about how such things are done.</p>
|
||||||
|
<p>If a deployment/release for you is just getting the latest code in the master
|
||||||
|
branch out, without caring about bumping version numbers or anything, then
|
||||||
|
GitHub Flow is a good fit for you, and you probably don't need the extras of
|
||||||
|
Common-Flow.</p>
|
||||||
|
<p>However if your deployments/releases have specific version numbers, then
|
||||||
|
Common-Flow gives you a simple set of rules of how to create and manage
|
||||||
|
releases, on top of what GitHub Flow already does.</p>
|
||||||
|
<h3 id="what-does-descriptive-name-mean-for-change-branches">What does "descriptive name" mean for change branches?</h3>
|
||||||
|
<p>It means what it sounds like. The name should be descriptive, as in by just
|
||||||
|
reading the name of the branch you should understand what the branch's purpose
|
||||||
|
is and what it does. Here's a few examples:</p>
|
||||||
|
<ul>
|
||||||
|
<li>add-2fa-support</li>
|
||||||
|
<li>fix-login-issue</li>
|
||||||
|
<li>remove-sort-by-middle-name-functionality</li>
|
||||||
|
<li>update-font-awesome</li>
|
||||||
|
<li>change-search-behavior</li>
|
||||||
|
<li>tweak-footer-style</li>
|
||||||
|
</ul>
|
||||||
|
<p>Notice how none of these have any prefixes like "feature/" or "hotfix/", they're
|
||||||
|
not needed when branch names are properly descriptive. However there's nothing
|
||||||
|
to say you can't use such prefixes if you want. That also means that you can add
|
||||||
|
ticket number prefixes if your team/org has that as part of it's process.</p>
|
||||||
|
<h3 id="how-do-we-release-an-emergency-hotfix-when-the-master-branch-is-broken">How do we release an emergency hotfix when the master branch is broken?</h3>
|
||||||
|
<p>This should ideally never happen, however if it does you can do one of the
|
||||||
|
following:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Review why the master branch is broken and revert the changes that caused the
|
||||||
|
issues. Then apply the hotfix and release.</li>
|
||||||
|
<li>Or use a short-term release branch created from the latest release tag instead
|
||||||
|
of the master branch. Apply the hotfix to the release branch, create a release
|
||||||
|
tag on the release branch, and then merge it back into master.</li>
|
||||||
|
</ul>
|
||||||
|
<p>In this situation, it is recommended you try to revert the offending changes
|
||||||
|
that's preventing a new release from master. But if that proves to be a
|
||||||
|
complicated task and you're short on time, a short-term release branch gives you
|
||||||
|
a instant fix to the situation at hand, and let's you resolve the issues with
|
||||||
|
the master branch when you have more time on your hands.</p>
|
||||||
|
<h2 id="about">About</h2>
|
||||||
|
<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>
|
||||||
|
<h2 id="license">License</h2>
|
||||||
|
<p><a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons - CC BY 3.0</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript" src="/assets/main-870855580c69dec57be4c965d0cf8afe78afa6b7b6f6bdb5aff91ac0256c0a1a.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
2
docs/spec/1.0.0-rc.4.svg
Normal file
|
After Width: | Height: | Size: 18 KiB |
391
index.md
@@ -1,11 +1,11 @@
|
|||||||
---
|
---
|
||||||
title: Git Common-Flow 1.0.0-rc.1
|
title: Git Common-Flow 1.0.0-rc.4
|
||||||
version: 1.0.0-rc.1
|
version: 1.0.0-rc.4
|
||||||
---
|
---
|
||||||
Git Common-Flow 1.0.0-rc.1
|
Git Common-Flow 1.0.0-rc.4
|
||||||
==============================
|
===========================
|
||||||
|
|
||||||
<img src="/spec/1.0.0-rc.1.svg" width="100%" />
|
<img src="/spec/1.0.0-rc.4.svg" width="100%" />
|
||||||
|
|
||||||
Summary
|
Summary
|
||||||
-------
|
-------
|
||||||
@@ -16,15 +16,15 @@ the [original variant](http://scottchacon.com/2011/08/31/github-flow.html)
|
|||||||
of [GitHub Flow](https://guides.github.com/introduction/flow/), while taking
|
of [GitHub Flow](https://guides.github.com/introduction/flow/), while taking
|
||||||
into account how a lot of open source projects use git.
|
into account how a lot of open source projects use git.
|
||||||
|
|
||||||
TL;DR: Common-Flow is basically GitHub Flow with the addition of versioned
|
In short, Common-Flow is essentially GitHub Flow with the addition of versioned
|
||||||
releases, maintenance releases for old versions, and without the requirement to
|
releases, optional release branches, and without the requirement to deploy to
|
||||||
deploy to production all the time.
|
production all the time.
|
||||||
|
|
||||||
Terminology
|
Terminology
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
- **Master Branch** - Must always have passing tests, is considered bleeding
|
- **Master Branch** - Must be named "master", must always have passing tests,
|
||||||
edge, and must be named `master`.
|
and is not guaranteed to always work in production environments.
|
||||||
- **Change Branches** - Any branch that introduces changes like a new feature, a
|
- **Change Branches** - Any branch that introduces changes like a new feature, a
|
||||||
bug fix, etc.
|
bug fix, etc.
|
||||||
- **Source Branch** - The branch that a change branch was created from. New
|
- **Source Branch** - The branch that a change branch was created from. New
|
||||||
@@ -33,17 +33,12 @@ Terminology
|
|||||||
- **Merge Target** - A branch that is the intended merge target for a change
|
- **Merge Target** - 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. Typically the merge target branch will be the same as the source
|
||||||
branch.
|
branch.
|
||||||
- **Maintenance Branches** - Used for maintaining old versions and releasing
|
|
||||||
PATCH updates when the master branch has moved on. Should follow a
|
|
||||||
`stable-X.Y` naming pattern, where `X` is MAJOR version and `Y` is MINOR
|
|
||||||
version.
|
|
||||||
- **Pull Request** - A means of requesting that a change branch is merged in to
|
- **Pull Request** - A means of requesting that a change branch is merged in to
|
||||||
its merge target, allowing others to review, discuss and approve the changes.
|
its merge target, allowing others to review, discuss and approve the changes.
|
||||||
- **Release** - Consists of a version bump commit directly on the master branch,
|
- **Release** - May be considered safe to use in production environments. Is
|
||||||
and a git tag named according to the new version string placed on said commit.
|
effectively just a git tag named after the version of the release.
|
||||||
- **Maintenance Release** - Just like a regular release, except the version bump
|
- **Release Branches** - Used both for short-term preparations of a release, and
|
||||||
commit and release tag are on a maintenance branch instead of the master
|
also for long-term maintenance of older version.
|
||||||
branch.
|
|
||||||
|
|
||||||
Git Common-Flow Specification (Common-Flow)
|
Git Common-Flow Specification (Common-Flow)
|
||||||
-------------------------------------------
|
-------------------------------------------
|
||||||
@@ -52,121 +47,283 @@ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
|
|||||||
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
|
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
|
||||||
interpreted as described in [RFC 2119](https://tools.ietf.org/html/rfc2119).
|
interpreted as described in [RFC 2119](https://tools.ietf.org/html/rfc2119).
|
||||||
|
|
||||||
1. The Master Branch
|
1. TL;DR
|
||||||
|
1. Don't break the master branch.
|
||||||
|
2. A release is a git tag.
|
||||||
|
2. The Master Branch
|
||||||
1. A branch named "master" MUST exist and it MUST be referred to as the
|
1. A branch named "master" MUST exist and it MUST be referred to as the
|
||||||
"master branch".
|
"master branch".
|
||||||
2. The master branch MUST be considered bleeding edge.
|
2. The master branch MUST always be in a non-broken state with its test
|
||||||
3. The master branch MUST always be in a non-broken state with its test
|
|
||||||
suite passing.
|
suite passing.
|
||||||
4. The master branch SHOULD always be in a "as near as possible ready for
|
4. The master branch IS NOT guaranteed to always work in production
|
||||||
release/production" state to reduce the friction of creating a new
|
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
|
||||||
|
release/production" state to reduce any friction with creating a new
|
||||||
release.
|
release.
|
||||||
2. Changes
|
3. Change Branches
|
||||||
1. Changes MUST be performed on a separate branch that SHOULD be referred to
|
1. Each change (feature, bugfix, etc.) MUST be performed on separate
|
||||||
as a "change branch". All change branches MUST have descriptive names. It
|
branches that SHOULD be referred to as "change branches".
|
||||||
is RECOMMENDED that you commit often locally, and you SHOULD regularly
|
2. All change branches MUST have descriptive names.
|
||||||
push your work to the same named branch on the remote server.
|
3. It is RECOMMENDED that you commit often locally, and that you try and
|
||||||
2. When a change branch is created, the branch that it is created from
|
keep the commits reasonably structured to avoid a messy and confusing git
|
||||||
SHOULD be referred to as the "source branch". Each change branch also
|
history.
|
||||||
needs a designated "merge target branch", typically this will be the same
|
4. You SHOULD regularly push your work to the same named branch on the
|
||||||
as the source branch.
|
remote server.
|
||||||
3. Change branches MUST be regularly updated with any changes from their
|
5. You SHOULD create separate change branches for each distinctly different
|
||||||
source branch. This MUST be done by rebasing the change branch on top of
|
change. You SHOULD NOT include multiple unrelated changes into a single
|
||||||
the source branch. To be clear you MUST NOT merge a source branch into a
|
|
||||||
change branch.
|
change branch.
|
||||||
4. After rebasing a change branch on top of its source branch you MUST push
|
6. When a change branch is created, the branch that it is created from
|
||||||
the change branch to the remote server. This will require you do a force
|
SHOULD be referred to as the "source branch". Each change branch also
|
||||||
push, and you SHOULD use the "--force-with-lease" git push option.
|
needs a designated "merge target" branch, typically this will be the same
|
||||||
5. To merge a change branch into its merge target branch, you MUST open a
|
as the source branch.
|
||||||
"pull request" (or equivalent) so others can review and approve your
|
7. Change branches MUST be regularly updated with any changes from their
|
||||||
changes.
|
source branch. This MUST be done by rebasing the change branch on top of
|
||||||
6. A pull request MUST only be merged when the change branch is up-to-date
|
the source branch.
|
||||||
|
8. After updating a change branch from its source branch you MUST push the
|
||||||
|
change branch to the remote server. Due to the nature of rebasing, you
|
||||||
|
will be required to do a force push, and you MUST use the
|
||||||
|
"--force-with-lease" git push option when doing so instead of the regular
|
||||||
|
"--force".
|
||||||
|
9. If there is a truly valid technical reason to not use rebase when
|
||||||
|
updating change branches, then you can update change branches via merge
|
||||||
|
instead of rebase. The decision to use merge MUST only be taken after all
|
||||||
|
possible options to use rebase have been tried and failed. People not
|
||||||
|
understanding how to use rebase is NOT a valid reason to use merge. If
|
||||||
|
you do decide to use merge instead of rebase, you MUST NOT use a mixture
|
||||||
|
of both methods, pick one and stick to it.
|
||||||
|
4. Pull Requests
|
||||||
|
1. To merge a change branch into its merge target, you MUST open a "pull
|
||||||
|
request" (or equivalent).
|
||||||
|
2. The purpose of a pull request is to allow others to review your changes
|
||||||
|
and give feedback. You can then fix any issues, complaints, and more that
|
||||||
|
might arise, and then let people review again.
|
||||||
|
3. Before creating a pull request, it is RECOMMENDED that you consider the
|
||||||
|
state of your change branch's commit history. If it is messy and
|
||||||
|
confusing, it might be a good idea to rebase your branch with "git rebase
|
||||||
|
-i" to present a cleaner and easier to follow commit history for your
|
||||||
|
reviewers.
|
||||||
|
4. 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
|
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
|
happy with the change. This is especially important if the merge target
|
||||||
is the master branch.
|
is the master branch.
|
||||||
7. To get feedback, help, or generally just discuss a change branch with
|
5. 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
|
others, the RECOMMENDED way to do so is by creating a pull request and
|
||||||
discuss the changes with others there.
|
discuss the changes with others there.
|
||||||
3. Git Best Practices
|
5. Versioning
|
||||||
1. All commit messages SHOULD follow the Commit Guidelines and format from
|
1. A "version string" is a typically mostly numeric string that identifies a
|
||||||
the official git
|
specific version of a project. The version string itself MUST NOT have a
|
||||||
documentation:
|
"v" prefix, but the version string can be displayed with a "v" prefix to
|
||||||
<https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project>
|
indicate it is a version that is being referred to.
|
||||||
2. You SHOULD always use "--force-with-lease" when doing a force push. The
|
2. The source of truth for a project's version MUST be a git tag with a name
|
||||||
plain "--force" option is dangerous and destructive. More
|
based on the version string. This kind of tag MUST be referred to as a
|
||||||
information:
|
"release tag".
|
||||||
<https://developer.atlassian.com/blog/2015/04/force-with-lease/>
|
3. It is OPTIONAL, but RECOMMENDED to also keep the version string
|
||||||
3. You SHOULD understand and be comfortable with
|
hard-coded somewhere in the project code-base.
|
||||||
rebasing: <https://git-scm.com/book/en/v2/Git-Branching-Rebasing>
|
4. If you hard-code the version string into the code-base, it is RECOMMENDED
|
||||||
4. It is RECOMMENDED that you always do "git pull --rebase" instead of "git
|
that you do so in a file called "VERSION" located in the root of the
|
||||||
pull" to avoid unnecessary merge commits. You can make this the default
|
project. But be mindful of the conventions of your programming language
|
||||||
behavior of "git pull" with "git config --global pull.rebase true".
|
and community when choosing if, where and how to hard-code the version
|
||||||
5. It is RECOMMENDED that all branches be merged using "git merge --no-ff".
|
string.
|
||||||
This makes sure the reference to the original branch is kept in the commits,
|
5. If you are using a "VERSION" file in the root of the project, this file
|
||||||
allows one to revert a merge by reverting a single merge commit, and creates
|
MUST only contain the exact version string, meaning it MUST NOT have a
|
||||||
a merge commit to mark the integration of the branch with master.
|
"v" prefix. For example "v2.11.4" is bad, and "2.11.4" is good.
|
||||||
4. Versioning
|
6. It is OPTIONAL, but RECOMMENDED that that the version string follows
|
||||||
1. The project MUST have its version hard-coded somewhere in the
|
Semantic Versioning (<http://semver.org/>).
|
||||||
code-base. It is RECOMMENDED that this is done in a file called "VERSION"
|
6. Releases
|
||||||
located in the root of the project.
|
1. To create a new release, you MUST create a git tag named as the exact
|
||||||
2. If you are using a "VERSION" file in the root of the project, this MUST
|
version string of the release. This kind of tag MUST be referred to as a
|
||||||
only contain the exact version string.
|
"release tag".
|
||||||
3. The version string SHOULD follow the Semantic Versioning
|
2. The release tag name can OPTIONALLY be prefixed with "v". For example the
|
||||||
(<http://semver.org/>) format. Use of Semantic Versioning is OPTIONAL,
|
tag name can be either "2.11.4" or "v2.11.4". It is however RECOMMENDED
|
||||||
but the version string MUST NOT have a "v" prefix. For example "v2.11.4"
|
that you do not use a "v" prefix. You MUST NOT use a mixture of "v"
|
||||||
is bad, and "2.11.4" is good.
|
prefixed and non-prefixed tags. Pick one form and stick to it.
|
||||||
5. Releases
|
3. If the version string is hard-coded into the code-base, you MUST create a
|
||||||
1. To create a new release, you MUST create a "version bump" commit directly
|
"version bump" commit which changes the hard-coded version string of the
|
||||||
on the master branch which changes the hard-coded version value of the
|
project.
|
||||||
project. The version bump commit MUST have a git tag created on it and
|
4. When using version bump commits, the release tag MUST be placed on the
|
||||||
named as the exact version string.
|
version bump commit.
|
||||||
2. A version bump commit MUST have a commit message title of "Bump version
|
5. If you are not using a release branch, then the release tag, and if
|
||||||
to VERSION". For example, if the new version string is "2.11.4", the
|
relevant the version bump commit, MUST be created directly on the master
|
||||||
first line of the commit message MUST read: "Bump version to 2.11.4"
|
branch.
|
||||||
3. The release tag on the version bump commit MUST be named exactly the same
|
6. The version bump commit SHOULD have a commit message title of "Bump
|
||||||
as the version string. The tag name can OPTIONALLY be prefixed with
|
version to VERSION". For example, if the new version string is "2.11.4",
|
||||||
"v". For example the tag name can be either "2.11.4" or "v2.11.4".
|
the first line of the commit message SHOULD read: "Bump version to
|
||||||
4. It is RECOMMENDED that release tags are lightweight tags, but you can
|
2.11.4"
|
||||||
|
7. It is RECOMMENDED that release tags are lightweight tags, but you can
|
||||||
OPTIONALLY use annotated tags if you want to include changelog
|
OPTIONALLY use annotated tags if you want to include changelog
|
||||||
information in the release tag itself.
|
information in the release tag itself.
|
||||||
5. If you use annotated release tags, the first line of the annotation MUST
|
8. If you use annotated release tags, the first line of the annotation
|
||||||
read "Release VERSION". For example for version "2.11.4" the first line
|
SHOULD read "Release VERSION". For example for version "2.11.4" the first
|
||||||
of the tag annotation would read "Release 2.11.4". The second line must
|
line of the tag annotation SHOULD read "Release 2.11.4". The second line
|
||||||
be blank, and the changelog MUST start on the third line.
|
MUST be blank, and the changelog MUST start on the third line.
|
||||||
6. Bug Fixes & Rollback
|
7. Short-Term Release Branches
|
||||||
1. You MUST NOT under any circumstances force push to the master branch.
|
1. Any branch that has a name starting with "release-" SHOULD be referred to
|
||||||
2. If a change branch which has been merged in to the master branch is found
|
as a "release branch".
|
||||||
|
2. Any release branch which has a name ending with a specific version
|
||||||
|
string, MUST be referred to as a "short-term release branch".
|
||||||
|
3. Use of short-term release branches are OPTIONAL, and intended to be used
|
||||||
|
to create a specific versioned release.
|
||||||
|
4. A short-term release branch is RECOMMENDED if there is a lengthy
|
||||||
|
pre-release verification process to avoid a code freeze on the master
|
||||||
|
branch.
|
||||||
|
5. Short-term release branches MUST have a name of "release-VERSION". For
|
||||||
|
example for version "2.11.4" the release branch name MUST be
|
||||||
|
"release-2.11.4".
|
||||||
|
6. When using a short-term release branch to create a release, the release
|
||||||
|
tag and if used, version bump commit, MUST be placed directly on the
|
||||||
|
short-term release branch itself.
|
||||||
|
7. Only very minor changes should be performed on a short-term release
|
||||||
|
branch directly. Any larger changes SHOULD be done in the master branch,
|
||||||
|
and SHOULD be pulled into the release branch by rebasing it on top of the
|
||||||
|
master branch the same way a change branch pulls in updates from its
|
||||||
|
source branch.
|
||||||
|
8. After a release tag has been created, the release branch MUST be merged
|
||||||
|
back into its source branch and then deleted. Typically the source branch
|
||||||
|
will be the master branch.
|
||||||
|
8. Long-term Release Branches
|
||||||
|
1. Any release branch which has a name ending with a non-specific version
|
||||||
|
string, MUST be referred to as a "long-term release branch". For example
|
||||||
|
"release-2.11" is a long-term release branch, while "release-2.11.4" is a
|
||||||
|
short-term release branch.
|
||||||
|
2. Use of long-term release branches are OPTIONAL, and intended for work on
|
||||||
|
versions which are not currently part of the master branch. Typically
|
||||||
|
this is useful when you need to create a new maintenance release for a
|
||||||
|
older version.
|
||||||
|
3. A long-term release branch MUST have a name with a non-specific version
|
||||||
|
number. For example a long-term release branch for creating new 2.9.x
|
||||||
|
releases MUST be named "release-2.9".
|
||||||
|
4. Long-term release branches for maintenance releases of older versions
|
||||||
|
MUST be created from the relevant release tag. For example if the master
|
||||||
|
branch is on version 2.11.4 and there is a security fix for all 2.9.x
|
||||||
|
releases, the latest of which is "2.9.7". Create a new branch called
|
||||||
|
"release-2.9" off of the "2.9.7" release tag. The security fix release
|
||||||
|
will then end up being version "2.9.8".
|
||||||
|
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
|
||||||
|
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.
|
||||||
|
9. Bug Fixes & Rollback
|
||||||
|
1. You MUST NOT under any circumstances force push to the master branch or
|
||||||
|
to long-term release branches.
|
||||||
|
2. If a change branch which has been merged into the master branch is found
|
||||||
to have a bug in it, the bug fix work MUST be done as a new separate
|
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
|
change branch and MUST follow the same workflow as any other change
|
||||||
branch.
|
branch.
|
||||||
3. If a change branch is wrongfully merged in to master, or for any other
|
3. If a change branch is wrongfully merged into master, or for any other
|
||||||
reason the merge must be undone, you MUST undo the merge by reverting the
|
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
|
merge commit itself. Effectively creating a new commit that reverses all
|
||||||
the relevant changes.
|
the relevant changes.
|
||||||
7. Maintenance Releases
|
10. Git Best Practices
|
||||||
1. Any branch that has a name starting with "stable-" SHOULD be referred to
|
1. All commit messages SHOULD follow the Commit Guidelines and format from
|
||||||
as a "maintenance branch".
|
the official git
|
||||||
2. Maintenance branches are used for managing new releases of older
|
documentation:
|
||||||
versions. Typically this is used to provide security updates for older
|
<https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project#_commit_guidelines>
|
||||||
versions when the master branch has moved on to a point that a new
|
2. You SHOULD never blindly commit all changes with "git commit -a". It is
|
||||||
release for the old version cannot be made from the master branch.
|
RECOMMENDED you use "git add -i" or "git add -p" to add individual
|
||||||
3. A "maintenance release" is identical to a regular release, except the
|
changes to the staging area so you are fully aware of what you are
|
||||||
version bump commit and the release tag are placed on the maintenance
|
committing.
|
||||||
branch instead of on the master branch.
|
3. You SHOULD always use "--force-with-lease" when doing a force push. The
|
||||||
3. A maintenance branch SHOULD follow a "stable-X.Y" naming pattern, where
|
regular "--force" option is dangerous and destructive. More
|
||||||
"X" is the MAJOR version and "Y" is the minor version.
|
information:
|
||||||
4. A maintenance branch MUST be created from the relevant release tag. For
|
<https://developer.atlassian.com/blog/2015/04/force-with-lease/>
|
||||||
example if there is a security fix for all 2.9.x releases, the latest of
|
4. You SHOULD understand and be comfortable with
|
||||||
which is "2.9.7", we create a new branch called "stable-2.9" off of the
|
rebasing: <https://git-scm.com/book/en/v2/Git-Branching-Rebasing>
|
||||||
"2.9.7" release tag. The security fix release will then end up being
|
5. It is RECOMMENDED that you always do "git pull --rebase" instead of "git
|
||||||
version "2.9.8".
|
pull" to avoid unnecessary merge commits. You can make this the default
|
||||||
5. When working on a maintenance release, the relevant maintenance branch
|
behavior of "git pull" with "git config --global pull.rebase true".
|
||||||
MUST be thought of as the master branch for that maintenance work.
|
6. It is RECOMMENDED that all branches be merged using "git merge --no-ff".
|
||||||
6. Changes in a maintenance branch SHOULD typically come from work being
|
This makes sure the reference to the original branch is kept in the
|
||||||
done against the master branch. Meaning changes SHOULD only trickle
|
commits, allows one to revert a merge by reverting a single merge commit,
|
||||||
downwards from the master branch. If a change needs to trickle back up
|
and creates a merge commit to mark the integration of the branch with
|
||||||
into the master branch, that work should have happened against the master
|
master.
|
||||||
branch in the first place.
|
|
||||||
|
FAQ
|
||||||
|
---
|
||||||
|
|
||||||
|
### Why use Common-Flow instead of Git Flow, and how does it differ?
|
||||||
|
|
||||||
|
Common-Flow tries to be a lot less complicated than Git Flow by having fewer
|
||||||
|
types of branches, and simpler rules. Normal day to day development doesn't
|
||||||
|
really change much:
|
||||||
|
|
||||||
|
- You create change branches instead of feature branches, without the need of a
|
||||||
|
"feature/" or "change/" prefix in the branch name.
|
||||||
|
- Change branches are typically created off of and merged back into "master"
|
||||||
|
instead of "develop".
|
||||||
|
- Creating a release is done by simply creating a git tag, typically on the
|
||||||
|
master branch.
|
||||||
|
|
||||||
|
In detail, the main differences between Git Flow and Common-Flow are:
|
||||||
|
|
||||||
|
- There is no "develop" branch, there is only a "master" branch which contains
|
||||||
|
the latest work. In Git Flow the master branch effectively ends up just being
|
||||||
|
a pointer to the latest release, despite the fact that Git Flow includes
|
||||||
|
release tags too. In Common-Flow you just look at the tags to find the latest
|
||||||
|
release.
|
||||||
|
- There are no "feature" or "hotfix" branches, there's only "change"
|
||||||
|
branches. Any branch that is not master and introduces changes is a change
|
||||||
|
branch. Change branches also don't have a enforced naming convention, they
|
||||||
|
just have to have a "descriptive name". This makes things simpler and allows
|
||||||
|
more flexibility.
|
||||||
|
- Release branches are available, but optional. Instead of enforcing the use of
|
||||||
|
release branches like Git Flow, Common-Flow only recommends the use of release
|
||||||
|
branches when it makes things easier. If creating a new release by tagging
|
||||||
|
"master" works for you, great, do that.
|
||||||
|
|
||||||
|
### Why use Common-Flow instead of GitHub Flow, and how does it differ?
|
||||||
|
|
||||||
|
Common-Flow is essentially GitHub Flow with the addition of a "Release" concept
|
||||||
|
that uses tags. It also attempts to define how certain common tasks are done,
|
||||||
|
like updating change/feature branches from their source branches for
|
||||||
|
example. This is to help end arguments about how such things are done.
|
||||||
|
|
||||||
|
If a deployment/release for you is just getting the latest code in the master
|
||||||
|
branch out, without caring about bumping version numbers or anything, then
|
||||||
|
GitHub Flow is a good fit for you, and you probably don't need the extras of
|
||||||
|
Common-Flow.
|
||||||
|
|
||||||
|
However if your deployments/releases have specific version numbers, then
|
||||||
|
Common-Flow gives you a simple set of rules of how to create and manage
|
||||||
|
releases, on top of what GitHub Flow already does.
|
||||||
|
|
||||||
|
### What does "descriptive name" mean for change branches?
|
||||||
|
|
||||||
|
It means what it sounds like. The name should be descriptive, as in by just
|
||||||
|
reading the name of the branch you should understand what the branch's purpose
|
||||||
|
is and what it does. Here's a few examples:
|
||||||
|
|
||||||
|
- add-2fa-support
|
||||||
|
- fix-login-issue
|
||||||
|
- remove-sort-by-middle-name-functionality
|
||||||
|
- update-font-awesome
|
||||||
|
- change-search-behavior
|
||||||
|
- tweak-footer-style
|
||||||
|
|
||||||
|
Notice how none of these have any prefixes like "feature/" or "hotfix/", they're
|
||||||
|
not needed when branch names are properly descriptive. However there's nothing
|
||||||
|
to say you can't use such prefixes if you want. That also means that you can add
|
||||||
|
ticket number prefixes if your team/org has that as part of it's process.
|
||||||
|
|
||||||
|
### How do we release an emergency hotfix when the master branch is broken?
|
||||||
|
|
||||||
|
This should ideally never happen, however if it does you can do one of the
|
||||||
|
following:
|
||||||
|
|
||||||
|
- Review why the master branch is broken and revert the changes that caused the
|
||||||
|
issues. Then apply the hotfix and release.
|
||||||
|
- Or use a short-term release branch created from the latest release tag instead
|
||||||
|
of the master branch. Apply the hotfix to the release branch, create a release
|
||||||
|
tag on the release branch, and then merge it back into master.
|
||||||
|
|
||||||
|
In this situation, it is recommended you try to revert the offending changes
|
||||||
|
that's preventing a new release from master. But if that proves to be a
|
||||||
|
complicated task and you're short on time, a short-term release branch gives you
|
||||||
|
a instant fix to the situation at hand, and let's you resolve the issues with
|
||||||
|
the master branch when you have more time on your hands.
|
||||||
|
|
||||||
About
|
About
|
||||||
-----
|
-----
|
||||||
|
|||||||
46
js/ui.js
@@ -1,46 +0,0 @@
|
|||||||
(function (window, document) {
|
|
||||||
|
|
||||||
var layout = document.getElementById('layout'),
|
|
||||||
menu = document.getElementById('menu'),
|
|
||||||
menuLink = document.getElementById('menuLink'),
|
|
||||||
content = document.getElementById('main');
|
|
||||||
|
|
||||||
function toggleClass(element, className) {
|
|
||||||
var classes = element.className.split(/\s+/),
|
|
||||||
length = classes.length,
|
|
||||||
i = 0;
|
|
||||||
|
|
||||||
for(; i < length; i++) {
|
|
||||||
if (classes[i] === className) {
|
|
||||||
classes.splice(i, 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// The className is not found
|
|
||||||
if (length === classes.length) {
|
|
||||||
classes.push(className);
|
|
||||||
}
|
|
||||||
|
|
||||||
element.className = classes.join(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
function toggleAll(e) {
|
|
||||||
var active = 'active';
|
|
||||||
|
|
||||||
e.preventDefault();
|
|
||||||
toggleClass(layout, active);
|
|
||||||
toggleClass(menu, active);
|
|
||||||
toggleClass(menuLink, active);
|
|
||||||
}
|
|
||||||
|
|
||||||
menuLink.onclick = function (e) {
|
|
||||||
toggleAll(e);
|
|
||||||
};
|
|
||||||
|
|
||||||
content.onclick = function(e) {
|
|
||||||
if (menu.className.indexOf('active') !== -1) {
|
|
||||||
toggleAll(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}(this, this.document));
|
|
||||||
209
spec/1.0.0-rc.2.md
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
---
|
||||||
|
title: Git Common-Flow 1.0.0-rc.2
|
||||||
|
version: 1.0.0-rc.2
|
||||||
|
---
|
||||||
|
Git Common-Flow 1.0.0-rc.2
|
||||||
|
==============================
|
||||||
|
|
||||||
|
<img src="/spec/1.0.0-rc.2.svg" width="100%" />
|
||||||
|
|
||||||
|
Summary
|
||||||
|
-------
|
||||||
|
|
||||||
|
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 [original variant](http://scottchacon.com/2011/08/31/github-flow.html)
|
||||||
|
of [GitHub Flow](https://guides.github.com/introduction/flow/), while taking
|
||||||
|
into account how a lot of open source projects use git.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
Terminology
|
||||||
|
-----------
|
||||||
|
|
||||||
|
- **Master Branch** - Must always have passing tests, is considered bleeding
|
||||||
|
edge, and must be named `master`.
|
||||||
|
- **Change Branches** - Any branch that introduces changes like a new feature, a
|
||||||
|
bug fix, etc.
|
||||||
|
- **Source Branch** - The branch that a change branch was created from. New
|
||||||
|
changes in the source branch should be incorporated into the change branch via
|
||||||
|
rebasing.
|
||||||
|
- **Merge Target** - 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.
|
||||||
|
- **Pull Request** - A means of requesting that a change branch is merged in to
|
||||||
|
its merge target, allowing others to review, discuss and approve the changes.
|
||||||
|
- **Release** - Consists of a version bump commit, and a git tag named according
|
||||||
|
to the new version string placed on said commit.
|
||||||
|
- **Release Branches** - Used both for short-term preparations of a release, and
|
||||||
|
also for long-term maintenance of older version.
|
||||||
|
|
||||||
|
Git Common-Flow Specification (Common-Flow)
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
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 [RFC 2119](https://tools.ietf.org/html/rfc2119).
|
||||||
|
|
||||||
|
1. The Master Branch
|
||||||
|
1. A branch named "master" MUST exist and it MUST be referred to as the
|
||||||
|
"master branch".
|
||||||
|
2. The master branch MUST be considered bleeding edge.
|
||||||
|
3. The master branch MUST always be in a non-broken state with its test
|
||||||
|
suite passing.
|
||||||
|
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.
|
||||||
|
2. Change Branches
|
||||||
|
1. Each change (feature, bugfix, etc.) MUST be performed on separate
|
||||||
|
branches that SHOULD be referred to as "change branches". 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.
|
||||||
|
2. You MUST create separate change branches for each distinctly different
|
||||||
|
change. You MUST NOT include multiple unrelated changes into a single
|
||||||
|
change branch.
|
||||||
|
3. 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.
|
||||||
|
4. 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.
|
||||||
|
5. 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 to do a
|
||||||
|
force push, and you SHOULD use the "--force-with-lease" git push option.
|
||||||
|
3. Pull Requests
|
||||||
|
1. To merge a change branch into its merge target, you MUST open a "pull
|
||||||
|
request" (or equivalent) so others can review and approve your changes.
|
||||||
|
2. 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.
|
||||||
|
3. To get feedback, help, or generally just discuss a change branch with
|
||||||
|
others, the RECOMMENDED way to do so is by creating a pull request and
|
||||||
|
discuss the changes with others there.
|
||||||
|
4. Versioning
|
||||||
|
1. 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.
|
||||||
|
2. If you are using a "VERSION" file in the root of the project, this MUST
|
||||||
|
only contain the exact version string.
|
||||||
|
3. The version string SHOULD follow the Semantic Versioning
|
||||||
|
(<http://semver.org/>) 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.
|
||||||
|
5. Releases
|
||||||
|
1. To create a new release, you MUST create a "version bump" commit which
|
||||||
|
changes the hard-coded version string of the project. The version bump
|
||||||
|
commit MUST have a git tag created on it and named as the exact version
|
||||||
|
string.
|
||||||
|
2. If you are not using a release branch, then the version bump commit MUST
|
||||||
|
be created directly on the master branch.
|
||||||
|
3. The 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"
|
||||||
|
4. 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". You
|
||||||
|
MUST not use a mix of "v" prefixed and non-prefixed tags. Pick one form
|
||||||
|
and stick to it.
|
||||||
|
5. 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.
|
||||||
|
6. 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.
|
||||||
|
6. Release Branches
|
||||||
|
1. Any branch that has a name starting with "release-" SHOULD be referred to
|
||||||
|
as a "release branch".
|
||||||
|
2. Use of release branches is OPTIONAL.
|
||||||
|
3. Changes in a release 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. One exception to this is version bump commits.
|
||||||
|
4. There are two types of release branches; short-term, and long-term.
|
||||||
|
5. Short-Term Release Branches
|
||||||
|
1. Used for creating a specific versioned release.
|
||||||
|
2. A short-term release branch is RECOMMENDED if there is a lengthy
|
||||||
|
pre-release verification process to avoid a code freeze on the master
|
||||||
|
branch.
|
||||||
|
3. MUST have a name of "release-VERSION". For example for version
|
||||||
|
"2.11.4" the release branch name MUST be "release-2.11.4".
|
||||||
|
4. When using a short-term release branch, the version bump commit and
|
||||||
|
release tag MUST be made directly on the release branch itself.
|
||||||
|
5. Only very minor changes should be performed on a short-term release
|
||||||
|
branch directly. Any larger changes SHOULD be done in the master
|
||||||
|
branch, and SHOULD be pulled into the release branch by rebasing it
|
||||||
|
on top of the master branch the same way a change branch pulls in
|
||||||
|
updates from its source branch.
|
||||||
|
6. After the version bump commit and release tag have been created, the
|
||||||
|
release branch MUST be merged back into its source branch and then
|
||||||
|
deleted. Typically the source branch will be the master branch.
|
||||||
|
6. Long-Term Release Branches
|
||||||
|
1. Used for work on versions which are not currently part of the master
|
||||||
|
branch. Typically this is useful when you need to create a new
|
||||||
|
maintenance release for a older version.
|
||||||
|
2. The branch name MUST have a non-specific version number. For example
|
||||||
|
a long-term release branch for creating new 2.9.x releases would be
|
||||||
|
named "release-2.9".
|
||||||
|
3. To create a new release from a long-term release branch, you MUST
|
||||||
|
create a version bump commit and release tag directly on the release
|
||||||
|
branch.
|
||||||
|
4. A long-term release branch MUST be created from the relevant release
|
||||||
|
tag. For example if the master branch is on version 2.11.4 and there
|
||||||
|
is a security fix for all 2.9.x releases, the latest of which is
|
||||||
|
"2.9.7". Create a new branch called "release-2.9" off of the "2.9.7"
|
||||||
|
release tag. The security fix release will then end up being version
|
||||||
|
"2.9.8".
|
||||||
|
7. Bug Fixes & Rollback
|
||||||
|
1. You MUST NOT under any circumstances force push to the master branch.
|
||||||
|
2. If a change branch which has been merged into 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.
|
||||||
|
3. If a change branch is wrongfully merged into 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.
|
||||||
|
8. Git Best Practices
|
||||||
|
1. All commit messages SHOULD follow the Commit Guidelines and format from
|
||||||
|
the official git
|
||||||
|
documentation:
|
||||||
|
<https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project>
|
||||||
|
2. You SHOULD never blindly commit all changes with "git commit -a". It is
|
||||||
|
RECOMMENDED you use "git add -i" to add individual changes to the staging
|
||||||
|
area so you are fully aware of what you are committing.
|
||||||
|
3. You SHOULD always use "--force-with-lease" when doing a force push. The
|
||||||
|
regular "--force" option is dangerous and destructive. More
|
||||||
|
information:
|
||||||
|
<https://developer.atlassian.com/blog/2015/04/force-with-lease/>
|
||||||
|
4. You SHOULD understand and be comfortable with
|
||||||
|
rebasing: <https://git-scm.com/book/en/v2/Git-Branching-Rebasing>
|
||||||
|
5. 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".
|
||||||
|
6. 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.
|
||||||
|
|
||||||
|
About
|
||||||
|
-----
|
||||||
|
|
||||||
|
The Git Common-Flow specification is authored
|
||||||
|
by [Jim Myhrberg](http://jimeh.me).
|
||||||
|
|
||||||
|
If you'd like to leave feedback,
|
||||||
|
please [open an issue on GitHub](https://github.com/jimeh/common-flow/issues).
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
[Creative Commons - CC BY 3.0](http://creativecommons.org/licenses/by/3.0/)
|
||||||
|
|
||||||
2
spec/1.0.0-rc.2.svg
Normal file
|
After Width: | Height: | Size: 18 KiB |
215
spec/1.0.0-rc.3.md
Normal file
@@ -0,0 +1,215 @@
|
|||||||
|
---
|
||||||
|
title: Git Common-Flow 1.0.0-rc.3
|
||||||
|
version: 1.0.0-rc.3
|
||||||
|
---
|
||||||
|
Git Common-Flow 1.0.0-rc.3
|
||||||
|
===========================
|
||||||
|
|
||||||
|
<img src="/spec/1.0.0-rc.3.svg" width="100%" />
|
||||||
|
|
||||||
|
Summary
|
||||||
|
-------
|
||||||
|
|
||||||
|
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 [original variant](http://scottchacon.com/2011/08/31/github-flow.html)
|
||||||
|
of [GitHub Flow](https://guides.github.com/introduction/flow/), while taking
|
||||||
|
into account how a lot of open source projects use git.
|
||||||
|
|
||||||
|
In short, Common-Flow is essentially GitHub Flow with the addition of versioned
|
||||||
|
releases, optional release branches, and without the requirement to deploy to
|
||||||
|
production all the time.
|
||||||
|
|
||||||
|
Terminology
|
||||||
|
-----------
|
||||||
|
|
||||||
|
- **Master Branch** - Must be named "master", must always have passing tests,
|
||||||
|
and is not guaranteed to always work in production environments.
|
||||||
|
- **Change Branches** - Any branch that introduces changes like a new feature, a
|
||||||
|
bug fix, etc.
|
||||||
|
- **Source Branch** - The branch that a change branch was created from. New
|
||||||
|
changes in the source branch should be incorporated into the change branch via
|
||||||
|
rebasing.
|
||||||
|
- **Merge Target** - 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.
|
||||||
|
- **Pull Request** - A means of requesting that a change branch is merged in to
|
||||||
|
its merge target, allowing others to review, discuss and approve the changes.
|
||||||
|
- **Release** - May be considered safe to use in production
|
||||||
|
environments. Consists of a version bump commit, and a git tag named according
|
||||||
|
to the new version string placed on said commit.
|
||||||
|
- **Release Branches** - Used both for short-term preparations of a release, and
|
||||||
|
also for long-term maintenance of older version.
|
||||||
|
|
||||||
|
Git Common-Flow Specification (Common-Flow)
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
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 [RFC 2119](https://tools.ietf.org/html/rfc2119).
|
||||||
|
|
||||||
|
1. TL;DR
|
||||||
|
1. Don't break the master branch.
|
||||||
|
2. A release is a git tag.
|
||||||
|
2. The Master Branch
|
||||||
|
1. A branch named "master" MUST exist and it MUST be referred to as the
|
||||||
|
"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
|
||||||
|
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
|
||||||
|
release/production" state to reduce any friction with creating a new
|
||||||
|
release.
|
||||||
|
3. Change Branches
|
||||||
|
1. Each change (feature, bugfix, etc.) MUST be performed on separate
|
||||||
|
branches that SHOULD be referred to as "change branches". 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.
|
||||||
|
2. You MUST create separate change branches for each distinctly different
|
||||||
|
change. You MUST NOT include multiple unrelated changes into a single
|
||||||
|
change branch.
|
||||||
|
3. 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.
|
||||||
|
4. 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.
|
||||||
|
5. 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 to do a
|
||||||
|
force push, and you SHOULD use the "--force-with-lease" git push option.
|
||||||
|
4. Pull Requests
|
||||||
|
1. To merge a change branch into its merge target, you MUST open a "pull
|
||||||
|
request" (or equivalent) so others can review and approve your changes.
|
||||||
|
2. 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.
|
||||||
|
3. To get feedback, help, or generally just discuss a change branch with
|
||||||
|
others, the RECOMMENDED way to do so is by creating a pull request and
|
||||||
|
discuss the changes with others there.
|
||||||
|
5. Versioning
|
||||||
|
1. 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.
|
||||||
|
2. If you are using a "VERSION" file in the root of the project, this MUST
|
||||||
|
only contain the exact version string.
|
||||||
|
3. The version string SHOULD follow the Semantic Versioning
|
||||||
|
(<http://semver.org/>) 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.
|
||||||
|
6. Releases
|
||||||
|
1. To create a new release, you MUST create a "version bump" commit which
|
||||||
|
changes the hard-coded version string of the project. The version bump
|
||||||
|
commit MUST have a git tag created on it and named as the exact version
|
||||||
|
string.
|
||||||
|
2. If you are not using a release branch, then the version bump commit MUST
|
||||||
|
be created directly on the master branch.
|
||||||
|
3. The 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"
|
||||||
|
4. 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". You
|
||||||
|
MUST not use a mix of "v" prefixed and non-prefixed tags. Pick one form
|
||||||
|
and stick to it.
|
||||||
|
5. 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.
|
||||||
|
6. 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.
|
||||||
|
7. Release Branches
|
||||||
|
1. Any branch that has a name starting with "release-" SHOULD be referred to
|
||||||
|
as a "release branch".
|
||||||
|
2. Use of release branches is OPTIONAL.
|
||||||
|
3. Changes in a release 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. One exception to this is version bump commits.
|
||||||
|
4. There are two types of release branches; short-term, and long-term.
|
||||||
|
5. Short-Term Release Branches
|
||||||
|
1. Used for creating a specific versioned release.
|
||||||
|
2. A short-term release branch is RECOMMENDED if there is a lengthy
|
||||||
|
pre-release verification process to avoid a code freeze on the master
|
||||||
|
branch.
|
||||||
|
3. MUST have a name of "release-VERSION". For example for version
|
||||||
|
"2.11.4" the release branch name MUST be "release-2.11.4".
|
||||||
|
4. When using a short-term release branch, the version bump commit and
|
||||||
|
release tag MUST be made directly on the release branch itself.
|
||||||
|
5. Only very minor changes should be performed on a short-term release
|
||||||
|
branch directly. Any larger changes SHOULD be done in the master
|
||||||
|
branch, and SHOULD be pulled into the release branch by rebasing it
|
||||||
|
on top of the master branch the same way a change branch pulls in
|
||||||
|
updates from its source branch.
|
||||||
|
6. After the version bump commit and release tag have been created, the
|
||||||
|
release branch MUST be merged back into its source branch and then
|
||||||
|
deleted. Typically the source branch will be the master branch.
|
||||||
|
6. Long-Term Release Branches
|
||||||
|
1. Used for work on versions which are not currently part of the master
|
||||||
|
branch. Typically this is useful when you need to create a new
|
||||||
|
maintenance release for a older version.
|
||||||
|
2. The branch name MUST have a non-specific version number. For example
|
||||||
|
a long-term release branch for creating new 2.9.x releases would be
|
||||||
|
named "release-2.9".
|
||||||
|
3. To create a new release from a long-term release branch, you MUST
|
||||||
|
create a version bump commit and release tag directly on the release
|
||||||
|
branch.
|
||||||
|
4. A long-term release branch MUST be created from the relevant release
|
||||||
|
tag. For example if the master branch is on version 2.11.4 and there
|
||||||
|
is a security fix for all 2.9.x releases, the latest of which is
|
||||||
|
"2.9.7". Create a new branch called "release-2.9" off of the "2.9.7"
|
||||||
|
release tag. The security fix release will then end up being version
|
||||||
|
"2.9.8".
|
||||||
|
8. Bug Fixes & Rollback
|
||||||
|
1. You MUST NOT under any circumstances force push to the master branch.
|
||||||
|
2. If a change branch which has been merged into 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.
|
||||||
|
3. If a change branch is wrongfully merged into 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.
|
||||||
|
9. Git Best Practices
|
||||||
|
1. All commit messages SHOULD follow the Commit Guidelines and format from
|
||||||
|
the official git
|
||||||
|
documentation:
|
||||||
|
<https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project#_commit_guidelines>
|
||||||
|
2. You SHOULD never blindly commit all changes with "git commit -a". It is
|
||||||
|
RECOMMENDED you use "git add -i" to add individual changes to the staging
|
||||||
|
area so you are fully aware of what you are committing.
|
||||||
|
3. You SHOULD always use "--force-with-lease" when doing a force push. The
|
||||||
|
regular "--force" option is dangerous and destructive. More
|
||||||
|
information:
|
||||||
|
<https://developer.atlassian.com/blog/2015/04/force-with-lease/>
|
||||||
|
4. You SHOULD understand and be comfortable with
|
||||||
|
rebasing: <https://git-scm.com/book/en/v2/Git-Branching-Rebasing>
|
||||||
|
5. 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".
|
||||||
|
6. 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.
|
||||||
|
|
||||||
|
About
|
||||||
|
-----
|
||||||
|
|
||||||
|
The Git Common-Flow specification is authored
|
||||||
|
by [Jim Myhrberg](http://jimeh.me).
|
||||||
|
|
||||||
|
If you'd like to leave feedback,
|
||||||
|
please [open an issue on GitHub](https://github.com/jimeh/common-flow/issues).
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
[Creative Commons - CC BY 3.0](http://creativecommons.org/licenses/by/3.0/)
|
||||||
|
|
||||||
2
spec/1.0.0-rc.3.svg
Normal file
|
After Width: | Height: | Size: 18 KiB |
341
spec/1.0.0-rc.4.md
Normal file
@@ -0,0 +1,341 @@
|
|||||||
|
---
|
||||||
|
title: Git Common-Flow 1.0.0-rc.4
|
||||||
|
version: 1.0.0-rc.4
|
||||||
|
---
|
||||||
|
Git Common-Flow 1.0.0-rc.4
|
||||||
|
===========================
|
||||||
|
|
||||||
|
<img src="/spec/1.0.0-rc.4.svg" width="100%" />
|
||||||
|
|
||||||
|
Summary
|
||||||
|
-------
|
||||||
|
|
||||||
|
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 [original variant](http://scottchacon.com/2011/08/31/github-flow.html)
|
||||||
|
of [GitHub Flow](https://guides.github.com/introduction/flow/), while taking
|
||||||
|
into account how a lot of open source projects use git.
|
||||||
|
|
||||||
|
In short, Common-Flow is essentially GitHub Flow with the addition of versioned
|
||||||
|
releases, optional release branches, and without the requirement to deploy to
|
||||||
|
production all the time.
|
||||||
|
|
||||||
|
Terminology
|
||||||
|
-----------
|
||||||
|
|
||||||
|
- **Master Branch** - Must be named "master", must always have passing tests,
|
||||||
|
and is not guaranteed to always work in production environments.
|
||||||
|
- **Change Branches** - Any branch that introduces changes like a new feature, a
|
||||||
|
bug fix, etc.
|
||||||
|
- **Source Branch** - The branch that a change branch was created from. New
|
||||||
|
changes in the source branch should be incorporated into the change branch via
|
||||||
|
rebasing.
|
||||||
|
- **Merge Target** - 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.
|
||||||
|
- **Pull Request** - A means of requesting that a change branch is merged in to
|
||||||
|
its merge target, allowing others to review, discuss and approve the changes.
|
||||||
|
- **Release** - May be considered safe to use in production environments. Is
|
||||||
|
effectively just a git tag named after the version of the release.
|
||||||
|
- **Release Branches** - Used both for short-term preparations of a release, and
|
||||||
|
also for long-term maintenance of older version.
|
||||||
|
|
||||||
|
Git Common-Flow Specification (Common-Flow)
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
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 [RFC 2119](https://tools.ietf.org/html/rfc2119).
|
||||||
|
|
||||||
|
1. TL;DR
|
||||||
|
1. Don't break the master branch.
|
||||||
|
2. A release is a git tag.
|
||||||
|
2. The Master Branch
|
||||||
|
1. A branch named "master" MUST exist and it MUST be referred to as the
|
||||||
|
"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
|
||||||
|
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
|
||||||
|
release/production" state to reduce any friction with creating a new
|
||||||
|
release.
|
||||||
|
3. Change Branches
|
||||||
|
1. Each change (feature, bugfix, etc.) MUST be performed on separate
|
||||||
|
branches that SHOULD be referred to as "change branches".
|
||||||
|
2. All change branches MUST have descriptive names.
|
||||||
|
3. It is RECOMMENDED that you commit often locally, and that you try and
|
||||||
|
keep the commits reasonably structured to avoid a messy and confusing git
|
||||||
|
history.
|
||||||
|
4. You SHOULD regularly push your work to the same named branch on the
|
||||||
|
remote server.
|
||||||
|
5. You SHOULD create separate change branches for each distinctly different
|
||||||
|
change. You SHOULD NOT include multiple unrelated changes into a single
|
||||||
|
change branch.
|
||||||
|
6. 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.
|
||||||
|
7. 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.
|
||||||
|
8. After updating a change branch from its source branch you MUST push the
|
||||||
|
change branch to the remote server. Due to the nature of rebasing, you
|
||||||
|
will be required to do a force push, and you MUST use the
|
||||||
|
"--force-with-lease" git push option when doing so instead of the regular
|
||||||
|
"--force".
|
||||||
|
9. If there is a truly valid technical reason to not use rebase when
|
||||||
|
updating change branches, then you can update change branches via merge
|
||||||
|
instead of rebase. The decision to use merge MUST only be taken after all
|
||||||
|
possible options to use rebase have been tried and failed. People not
|
||||||
|
understanding how to use rebase is NOT a valid reason to use merge. If
|
||||||
|
you do decide to use merge instead of rebase, you MUST NOT use a mixture
|
||||||
|
of both methods, pick one and stick to it.
|
||||||
|
4. Pull Requests
|
||||||
|
1. To merge a change branch into its merge target, you MUST open a "pull
|
||||||
|
request" (or equivalent).
|
||||||
|
2. The purpose of a pull request is to allow others to review your changes
|
||||||
|
and give feedback. You can then fix any issues, complaints, and more that
|
||||||
|
might arise, and then let people review again.
|
||||||
|
3. Before creating a pull request, it is RECOMMENDED that you consider the
|
||||||
|
state of your change branch's commit history. If it is messy and
|
||||||
|
confusing, it might be a good idea to rebase your branch with "git rebase
|
||||||
|
-i" to present a cleaner and easier to follow commit history for your
|
||||||
|
reviewers.
|
||||||
|
4. 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.
|
||||||
|
5. To get feedback, help, or generally just discuss a change branch with
|
||||||
|
others, the RECOMMENDED way to do so is by creating a pull request and
|
||||||
|
discuss the changes with others there.
|
||||||
|
5. Versioning
|
||||||
|
1. A "version string" is a typically mostly numeric string that identifies a
|
||||||
|
specific version of a project. The version string itself MUST NOT have a
|
||||||
|
"v" prefix, but the version string can be displayed with a "v" prefix to
|
||||||
|
indicate it is a version that is being referred to.
|
||||||
|
2. The source of truth for a project's version MUST be a git tag with a name
|
||||||
|
based on the version string. This kind of tag MUST be referred to as a
|
||||||
|
"release tag".
|
||||||
|
3. It is OPTIONAL, but RECOMMENDED to also keep the version string
|
||||||
|
hard-coded somewhere in the project code-base.
|
||||||
|
4. If you hard-code the version string into the code-base, it is RECOMMENDED
|
||||||
|
that you do so in a file called "VERSION" located in the root of the
|
||||||
|
project. But be mindful of the conventions of your programming language
|
||||||
|
and community when choosing if, where and how to hard-code the version
|
||||||
|
string.
|
||||||
|
5. If you are using a "VERSION" file in the root of the project, this file
|
||||||
|
MUST only contain the exact version string, meaning it MUST NOT have a
|
||||||
|
"v" prefix. For example "v2.11.4" is bad, and "2.11.4" is good.
|
||||||
|
6. It is OPTIONAL, but RECOMMENDED that that the version string follows
|
||||||
|
Semantic Versioning (<http://semver.org/>).
|
||||||
|
6. Releases
|
||||||
|
1. To create a new release, you MUST create a git tag named as the exact
|
||||||
|
version string of the release. This kind of tag MUST be referred to as a
|
||||||
|
"release tag".
|
||||||
|
2. The release tag name can OPTIONALLY be prefixed with "v". For example the
|
||||||
|
tag name can be either "2.11.4" or "v2.11.4". It is however RECOMMENDED
|
||||||
|
that you do not use a "v" prefix. You MUST NOT use a mixture of "v"
|
||||||
|
prefixed and non-prefixed tags. Pick one form and stick to it.
|
||||||
|
3. If the version string is hard-coded into the code-base, you MUST create a
|
||||||
|
"version bump" commit which changes the hard-coded version string of the
|
||||||
|
project.
|
||||||
|
4. When using version bump commits, the release tag MUST be placed on the
|
||||||
|
version bump commit.
|
||||||
|
5. If you are not using a release branch, then the release tag, and if
|
||||||
|
relevant the version bump commit, MUST be created directly on the master
|
||||||
|
branch.
|
||||||
|
6. The version bump commit SHOULD 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 SHOULD read: "Bump version to
|
||||||
|
2.11.4"
|
||||||
|
7. 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.
|
||||||
|
8. If you use annotated release tags, the first line of the annotation
|
||||||
|
SHOULD read "Release VERSION". For example for version "2.11.4" the first
|
||||||
|
line of the tag annotation SHOULD read "Release 2.11.4". The second line
|
||||||
|
MUST be blank, and the changelog MUST start on the third line.
|
||||||
|
7. Short-Term Release Branches
|
||||||
|
1. Any branch that has a name starting with "release-" SHOULD be referred to
|
||||||
|
as a "release branch".
|
||||||
|
2. Any release branch which has a name ending with a specific version
|
||||||
|
string, MUST be referred to as a "short-term release branch".
|
||||||
|
3. Use of short-term release branches are OPTIONAL, and intended to be used
|
||||||
|
to create a specific versioned release.
|
||||||
|
4. A short-term release branch is RECOMMENDED if there is a lengthy
|
||||||
|
pre-release verification process to avoid a code freeze on the master
|
||||||
|
branch.
|
||||||
|
5. Short-term release branches MUST have a name of "release-VERSION". For
|
||||||
|
example for version "2.11.4" the release branch name MUST be
|
||||||
|
"release-2.11.4".
|
||||||
|
6. When using a short-term release branch to create a release, the release
|
||||||
|
tag and if used, version bump commit, MUST be placed directly on the
|
||||||
|
short-term release branch itself.
|
||||||
|
7. Only very minor changes should be performed on a short-term release
|
||||||
|
branch directly. Any larger changes SHOULD be done in the master branch,
|
||||||
|
and SHOULD be pulled into the release branch by rebasing it on top of the
|
||||||
|
master branch the same way a change branch pulls in updates from its
|
||||||
|
source branch.
|
||||||
|
8. After a release tag has been created, the release branch MUST be merged
|
||||||
|
back into its source branch and then deleted. Typically the source branch
|
||||||
|
will be the master branch.
|
||||||
|
8. Long-term Release Branches
|
||||||
|
1. Any release branch which has a name ending with a non-specific version
|
||||||
|
string, MUST be referred to as a "long-term release branch". For example
|
||||||
|
"release-2.11" is a long-term release branch, while "release-2.11.4" is a
|
||||||
|
short-term release branch.
|
||||||
|
2. Use of long-term release branches are OPTIONAL, and intended for work on
|
||||||
|
versions which are not currently part of the master branch. Typically
|
||||||
|
this is useful when you need to create a new maintenance release for a
|
||||||
|
older version.
|
||||||
|
3. A long-term release branch MUST have a name with a non-specific version
|
||||||
|
number. For example a long-term release branch for creating new 2.9.x
|
||||||
|
releases MUST be named "release-2.9".
|
||||||
|
4. Long-term release branches for maintenance releases of older versions
|
||||||
|
MUST be created from the relevant release tag. For example if the master
|
||||||
|
branch is on version 2.11.4 and there is a security fix for all 2.9.x
|
||||||
|
releases, the latest of which is "2.9.7". Create a new branch called
|
||||||
|
"release-2.9" off of the "2.9.7" release tag. The security fix release
|
||||||
|
will then end up being version "2.9.8".
|
||||||
|
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
|
||||||
|
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.
|
||||||
|
9. Bug Fixes & Rollback
|
||||||
|
1. You MUST NOT under any circumstances force push to the master branch or
|
||||||
|
to long-term release branches.
|
||||||
|
2. If a change branch which has been merged into 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.
|
||||||
|
3. If a change branch is wrongfully merged into 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.
|
||||||
|
10. Git Best Practices
|
||||||
|
1. All commit messages SHOULD follow the Commit Guidelines and format from
|
||||||
|
the official git
|
||||||
|
documentation:
|
||||||
|
<https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project#_commit_guidelines>
|
||||||
|
2. You SHOULD never blindly commit all changes with "git commit -a". It is
|
||||||
|
RECOMMENDED you use "git add -i" or "git add -p" to add individual
|
||||||
|
changes to the staging area so you are fully aware of what you are
|
||||||
|
committing.
|
||||||
|
3. You SHOULD always use "--force-with-lease" when doing a force push. The
|
||||||
|
regular "--force" option is dangerous and destructive. More
|
||||||
|
information:
|
||||||
|
<https://developer.atlassian.com/blog/2015/04/force-with-lease/>
|
||||||
|
4. You SHOULD understand and be comfortable with
|
||||||
|
rebasing: <https://git-scm.com/book/en/v2/Git-Branching-Rebasing>
|
||||||
|
5. 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".
|
||||||
|
6. 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.
|
||||||
|
|
||||||
|
FAQ
|
||||||
|
---
|
||||||
|
|
||||||
|
### Why use Common-Flow instead of Git Flow, and how does it differ?
|
||||||
|
|
||||||
|
Common-Flow tries to be a lot less complicated than Git Flow by having fewer
|
||||||
|
types of branches, and simpler rules. Normal day to day development doesn't
|
||||||
|
really change much:
|
||||||
|
|
||||||
|
- You create change branches instead of feature branches, without the need of a
|
||||||
|
"feature/" or "change/" prefix in the branch name.
|
||||||
|
- Change branches are typically created off of and merged back into "master"
|
||||||
|
instead of "develop".
|
||||||
|
- Creating a release is done by simply creating a git tag, typically on the
|
||||||
|
master branch.
|
||||||
|
|
||||||
|
In detail, the main differences between Git Flow and Common-Flow are:
|
||||||
|
|
||||||
|
- There is no "develop" branch, there is only a "master" branch which contains
|
||||||
|
the latest work. In Git Flow the master branch effectively ends up just being
|
||||||
|
a pointer to the latest release, despite the fact that Git Flow includes
|
||||||
|
release tags too. In Common-Flow you just look at the tags to find the latest
|
||||||
|
release.
|
||||||
|
- There are no "feature" or "hotfix" branches, there's only "change"
|
||||||
|
branches. Any branch that is not master and introduces changes is a change
|
||||||
|
branch. Change branches also don't have a enforced naming convention, they
|
||||||
|
just have to have a "descriptive name". This makes things simpler and allows
|
||||||
|
more flexibility.
|
||||||
|
- Release branches are available, but optional. Instead of enforcing the use of
|
||||||
|
release branches like Git Flow, Common-Flow only recommends the use of release
|
||||||
|
branches when it makes things easier. If creating a new release by tagging
|
||||||
|
"master" works for you, great, do that.
|
||||||
|
|
||||||
|
### Why use Common-Flow instead of GitHub Flow, and how does it differ?
|
||||||
|
|
||||||
|
Common-Flow is essentially GitHub Flow with the addition of a "Release" concept
|
||||||
|
that uses tags. It also attempts to define how certain common tasks are done,
|
||||||
|
like updating change/feature branches from their source branches for
|
||||||
|
example. This is to help end arguments about how such things are done.
|
||||||
|
|
||||||
|
If a deployment/release for you is just getting the latest code in the master
|
||||||
|
branch out, without caring about bumping version numbers or anything, then
|
||||||
|
GitHub Flow is a good fit for you, and you probably don't need the extras of
|
||||||
|
Common-Flow.
|
||||||
|
|
||||||
|
However if your deployments/releases have specific version numbers, then
|
||||||
|
Common-Flow gives you a simple set of rules of how to create and manage
|
||||||
|
releases, on top of what GitHub Flow already does.
|
||||||
|
|
||||||
|
### What does "descriptive name" mean for change branches?
|
||||||
|
|
||||||
|
It means what it sounds like. The name should be descriptive, as in by just
|
||||||
|
reading the name of the branch you should understand what the branch's purpose
|
||||||
|
is and what it does. Here's a few examples:
|
||||||
|
|
||||||
|
- add-2fa-support
|
||||||
|
- fix-login-issue
|
||||||
|
- remove-sort-by-middle-name-functionality
|
||||||
|
- update-font-awesome
|
||||||
|
- change-search-behavior
|
||||||
|
- tweak-footer-style
|
||||||
|
|
||||||
|
Notice how none of these have any prefixes like "feature/" or "hotfix/", they're
|
||||||
|
not needed when branch names are properly descriptive. However there's nothing
|
||||||
|
to say you can't use such prefixes if you want. That also means that you can add
|
||||||
|
ticket number prefixes if your team/org has that as part of it's process.
|
||||||
|
|
||||||
|
### How do we release an emergency hotfix when the master branch is broken?
|
||||||
|
|
||||||
|
This should ideally never happen, however if it does you can do one of the
|
||||||
|
following:
|
||||||
|
|
||||||
|
- Review why the master branch is broken and revert the changes that caused the
|
||||||
|
issues. Then apply the hotfix and release.
|
||||||
|
- Or use a short-term release branch created from the latest release tag instead
|
||||||
|
of the master branch. Apply the hotfix to the release branch, create a release
|
||||||
|
tag on the release branch, and then merge it back into master.
|
||||||
|
|
||||||
|
In this situation, it is recommended you try to revert the offending changes
|
||||||
|
that's preventing a new release from master. But if that proves to be a
|
||||||
|
complicated task and you're short on time, a short-term release branch gives you
|
||||||
|
a instant fix to the situation at hand, and let's you resolve the issues with
|
||||||
|
the master branch when you have more time on your hands.
|
||||||
|
|
||||||
|
About
|
||||||
|
-----
|
||||||
|
|
||||||
|
The Git Common-Flow specification is authored
|
||||||
|
by [Jim Myhrberg](http://jimeh.me).
|
||||||
|
|
||||||
|
If you'd like to leave feedback,
|
||||||
|
please [open an issue on GitHub](https://github.com/jimeh/common-flow/issues).
|
||||||
|
|
||||||
|
License
|
||||||
|
-------
|
||||||
|
|
||||||
|
[Creative Commons - CC BY 3.0](http://creativecommons.org/licenses/by/3.0/)
|
||||||
|
|
||||||
2
spec/1.0.0-rc.4.svg
Normal file
|
After Width: | Height: | Size: 18 KiB |