こちらのポストがとても参考になったので、意訳しつつ自分なりに解釈しやすい言葉でまとめ直しました。
https://gist.github.com/digitaljhelms/4287848
メインブランチに寿命はなく、レポジトリには常に stable
と master
の2つのブランチが存在します。
Instance | Branch | Description, Instructions, Notes |
---|---|---|
Stable | stable | Accepts merges from Working and Hotfixes |
Working | master | Accepts merges from Features/Issues and Hotfixes |
次のリリースに向けての開発最新版ブランチ。開発時は master
からのブランチ作成や master
へのマージが主なワークフローとなります。
master
は直接編集することはせず、masterから派生したブランチのマージにより更新されます。
本番にデプロイされた最新のコード用ブランチ。日々の開発では、stable
ブランチとのやりとりは発生しない。
master
ブランチのソースコードが安定版でデプロイされた場合、すべての変更は stable
にマージされ、リリース番号をタグ付けします。
サポートブランチは、チームメンバー間の並行開発を支援し、機能の追跡を容易にし、本番での問題を迅速に解決するために使用されます。
メインブランチとは異なり、これらのブランチの寿命は常に限られています。
これらのブランチにはそれぞれ特定の目的があり、ソースブランチとターゲットブランチが明確に定められています。
Instance | Branch | Format | Source | Target | Description, Instructions, Notes |
---|---|---|---|---|---|
Features/Issues | feature bug |
feature-{issue number} bug-{issue number} |
master | master | Always branch off HEAD of Working |
Hotfix | hotfix | hotfix-{issue number} | stable | stable and master | Always branch off Stable |
feature
ブランチは、新機能や機能拡張を開発する場合に使用します。開発を開始するときに、この機能がリリースされるデプロイメントがわからない場合があります。機能ブランチがいつ終了するかにかかわらず、機能ブランチは常に master
ブランチにマージされます。
master
ブランチへのマージ時に発生し得る競合を処理するコストを減らすために、feature
ブランチの開発中に行われた master
ブランチへの変更は、随時 feature
ブランチへ取り込む(マージする)ようにします。
ブランチがまだ存在しない場合は、ローカルでブランチを作成してから GitHub にプッシュします。
feature
ブランチは常に「公開」されていなければなりません。つまり、開発者のローカルブランチだけではなく、リモートにもブランチが存在しなくてはならないということです。
定期的に、master
に加えられた変更 (もしあれば) は、feature
ブランチにマージされるべきです。
feature
ブランチの開発が完了したら、変更を master
ブランチにマージし、リモートブランチを削除します。
bug
ブランチは feature
ブランチとは意味的にのみ異なります。
bug
ブランチは、次のデプロイメントにマージすべき不具合の対応を行うために作成されます。そのため、bug
ブランチは通常 1 回のデプロイメントサイクルより長くは続かないでしょう。
bug
ブランチはバグ修正と機能開発の違いを明確に追跡するために使用されます。bug
ブランチはいつ終了するかに関わらず、常にマスターにマージされます。
master
ブランチへのマージ時に発生し得る競合を処理するコストを減らすために、bug
ブランチの開発中に行われた master
ブランチへの変更は、随時 bug
ブランチへ取り込む(マージする)ようにします。
ブランチがまだ存在しない場合は、ローカルでブランチを作成してから GitHub にプッシュします。
bug
ブランチは常に「公開」されていなければなりません。つまり、開発者のローカルブランチだけではなく、リモートにもブランチが存在しなくてはならないということです。
$ git checkout -b bug-id master // creates a local branch for the new bug
$ git push origin bug-id // makes the new bug remotely available
定期的に、master
に加えられた変更 (もしあれば) は bug
ブランチにマージされるべきです。
$ git merge master // merges changes from master into bug branch
bug
ブランチの開発が完了したら、変更を master
ブランチにマージし、リモートブランチを削除します。
$ git switch master // change to the master branch
$ git merge --no-ff bug-id // makes sure to create a commit object during merge
$ git push origin master // push merge changes
$ git push origin :bug-id // deletes the remote branch
本番デプロイされたコードに不具合が見つかり、(予めスケジューリングされた次のデプロイメントを待たずに)すぐに対処する必要がある場合は hotfix
ブランチを作成して対応します。
hotfix
ブランチは常にタグ付けされた安定版ブランチから分岐します。
緊急性が高いため、まず運用中のバージョンである stable
に対し hotfix
をマージした後に、修正を次のデプロイメントにも反映させるために master
にもマージしておきます。
ブランチがまだ存在しない場合は、ローカルでブランチを作成してから GitHub にプッシュします。
hotfix
ブランチは常に「公開」されていなければなりません。つまり、開発者のローカルブランチだけではなく、リモートにもブランチが存在しなくてはならないということです。
$ git checkout -b hotfix-id stable // creates a local branch for the new hotfix
$ git push origin hotfix-id // makes the new hotfix remotely available
hotfix
の開発が完了したら、変更を stable
にマージしてからタグを更新します。
$ git switch stable // change to the stable branch
$ git merge --no-ff hotfix-id // forces creation of commit object during merge
$ git tag -a <tag> // tags the fix
$ git push origin stable --tags // push tag changes
変更を master
にもマージして hotfix
を失わないようにし、リモートの hotfix
ブランチを削除します。
$ git switch master // change to the master branch
$ git merge --no-ff hotfix-id // forces creation of commit object during merge
$ git push origin master // push merge changes
$ git push origin :hotfix-id // deletes the remote branch