Git-flowをざっと整理してみた

2021.06.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、ジョン・ヒョンジェです!

今回はGit-flowについて話したいと思います。

Git-flowとは

Git-flowは簡単に言うと、Gitのブランチ機能を利用する開発戦略の一つです。Git-flowを採択して、もっと効率的に開発するソースコードを管理することができます。そして、共通のルールがあるので、コラボレーションをしながら発生する問題を最小限にすることができます。最近、多くのプロジェクトでGit-flow戦略が採択されています。(全てのプロジェクトで良いわけではありません)

以下では、Git-flowで使われるブランチの説明と活用する方法について説明します。

Git-flowのブランチ

参照:https://nvie.com/posts/a-successful-git-branching-model

Git-flowを説明する図です。ここで一番中心になるメインブランチはmasterブランチとdevelopブランチです。そして、メインブランチをサポートするブランチとしてfeatureブランチ、releaseブランチ、hotfixブランチがあります。

  • master
    • ユーザにプロダクトとしてリリースするソースコードを管理するブランチ
    • タグでバージョンを管理
    • 開発作業は行わない
  • develop
    • 実際に開発作業を行うブランチ
    • バグ修正
    • 新しい機能はfeatureブランチを作成して開発
  • feature
    • developブランチを基盤に作成されるブランチ
    • 新しい機能を開発
    • 開発が終わったらdevelopブランチにマージ
  • release
    • developブランチを基盤に作成されるブランチ
    • リリース直前にバグ修正などの微調整、つまりQAを行うブランチ
    • QAを完了したら、master, developブランチにマージ
  • hotfix
    • リリースされたバージョンで発生したバグを速やかに修正するブランチ
    • 修正後すぐmaster, developブランチにマージ

このようにGit-flowではブランチを作成、修正、マージする過程で各ブランチの目的を明確にしながら、ソースコードを管理することができます。

では、コマンドを実際に叩いてみましょう

Git-flowを実際に触ってみましょう

ここではGitGit-flowはインストールされているのを想定して進みます。

Git-flow初期化

まず、Git-flowを初期化します。

git flow init -d

-dオプションはディフォルトのブランチ名が自動で付けられるオプションです。

git branchコマンドを使ってブランチの情報を確認します。

git branch
* develop
  master

このようにdevelopブランチとmasterブランチが作成されていて、developブランチにcheckoutされています。

featureブランチで機能開発

では、新しい機能を開発するためのfeatureブランチをstartコマンドを使って作成しましょう。

git flow feature start <feature name>

git branchコマンドを実行して確認すると、

git branch
  develop
* feature/<feature name>
  master

feature/<feature name>のブランチが作成され、自動にcheckoutされています。<feature name>は開発する機能がわかるように設定しましょう。

では、このブランチで新しい機能の開発をします。今回はテキストファイルを一つ作ることで代替します。

touch gf-handson.txt

機能開発が完了したのでfinishコマンドでdevelopブランチにマージします。

git flow feature finish <feature name>

このコマンドを実行することで、以下の作業が自動に行われます。

  • developブランチにcheckout
  • featureブランチをマージ
  • featureブランチの削除

もし、GitHubなどのプラットフォームを使って他の開発者とコラボレーションをしている場合はpublishコマンドを使ってリポジトリにfeatureブランチをpushすることもできます

git flow feature publish <feature name>

逆にリポジトリからfeatureブランチを持ってくる場合はpullコマンドを使います。

git flow feature pull origin <feature name>

releaseブランチでリリースを準備

リリースのための全ての機能をdevelopブランチにマージしたら、releaseブランチでQAを行います。

releaseブランチを作成しましょう。

git flow release start <version>

また、git branchで確認すると

git branch
  develop
  master
* release/<version>

このようにrelease/<version>のブランチが作成され、自動にcheckoutされています。このブランチでQA作業を行います。

QA作業も終わったらリリースする準備は完了です。では、finishコマンドでmaster, developブランチにマージします。

git flow release finish <version>

このコマンドを実行することで、以下の作業が自動に行われます。

  • releaseブランチをmasterブランチにマージ
  • releaseブランチをdevelopブランチにマージ
  • releaseブランチを削除

featureブランチと同じように他の開発者とコラボレーションしている場合はpublishコマンドでリポジトリにpushします。

git flow release publish <version>

リポジトリからreleasaeブランチを持ってくる場合はtrackコマンドを使います。pullではないので、気をつけましょう。

git flow release track <version>

リリース

ここまですると、masterブランチは新しいリリースバージョンのソースコードを持っています。

最後にmasterブランチをタグと一緒にリポジトリにpushしてリリースします。

git push --tags

リリース後のバグ対応

リリースされたバージョンに緊急のバグが発生するとhotfixブランチで対応します。

まず、hotfixブランチを作成します。

git flow hotfix start <version>

作成したhotfixブランチで緊急のバグを修正した後、finishコマンドを使ってmasterブランチにマージします。

git flow hotfix finish <version>

このコマンドを実行することで、以下の作業が自動に行われます。

  • hotfixブランチをmasterブランチにマージ
  • hotfixブランチをdevelopブランチにマージ
  • hotfixブランチを削除

このようにGit-flowモデルを使ってプロジェクトの開発をもっと効率的にすることができます。

最後に

今までGit-flowの概念と開発流れについて説明しました。

Git-flowで開発をしながら一点注意することは各ブランチのソースコードのコンフリクトが発生しないようにすることです。例えば、developブランチから作成されたfeatureブランチでは常にdevelopの内容を持っている必要があります。そして、developブランチではfeatureブランチをマージする前にはfeatureブランチの内容を持っていない状態を維持する必要があります。

そして、GitHubなどのプラットフォームを使ってチーム内や他の開発者とコラボレーションをする場合はpushとpullをしばしばして置いて、コードのコンフリクトを防止しましょう!!

では、ブログは以上です!ありがとうございます。

(以下のリンクはGit-flowを誕生させたVincent Driessen氏の伝説のブログです)