コンテンツにスキップ

ForkでGitflowする

Gitを使った開発フローには「GitFlow」や「トランクベース開発」、「GitHubフロー」などがあるそうです。

Gitflow ワークフロー

Gitflow とは、元来は Git ブランチを管理するための破壊的で斬新な戦略のレガシー Git ワークフローです。Gitflow の需要は落ち込み、トランク ベースのワークフローが利用されるようになっています。現在ではこれが最新の継続的なソフトウェア開発のベスト プラクティスおよび DevOps プラクティスと見なされています。Gitflow はまた、CI/CD と使用することも困難な場合があります。この投稿では、歴史的な目的で Gitflow の詳細をご説明します。

トランク ベース開発

最初に普及した Gitflow は、特定の個人だけがメイン コードへの変更を承認できる、非常に厳格な開発モデルです。そのため、コードの品質が維持されてバグの数が最小限に抑えられます。トランク ベース開発は、すべての開発者がメイン コードにアクセスできる、よりオープンなモデルです。そのため、チームはすばやく反復処理を実行して CI/CD を実現できます。

GitHub フロー

GitHub フローは、軽量のブランチ ベースのワークフローです。 GitHub フローは、開発者だけでなくすべてのユーザーに役立ちます。

各々の特徴を一覧にすると以下です。

特徴 GitFlow GitHub Flow トランクベース
複雑さ 高い 低い 非常に低い
リリースの頻度 数週間〜数ヶ月に一度 毎日〜週に数回 1日に何度も
主な用途 堅牢なパッケージソフト Webサービス、SaaS 高速な継続的デプロイ

これらの違いは赤帽エンジニアブログさんのトランクベース開発についてで分かりやすく違いが説明されています。今回はGitクライアントであるForkを使ってGitflowを試してみました。尚、「ひとり開発」を前提にしています。

検証環境

対象 バージョン
Fork 2.63.2

GitHubでリポジトリを作成する

今回はGitHub上で「example1」というリポジトリを作成し、このリポジトリに対してGitflowを試します。GitHub上でNewをクリックします。

image

リポジトリ名を入力し、「Create repository」をクリックします。

image

空のリポジトリが作成されました。

image

Cloneする

リポジトリをCloneします。Forkのメニューから「Accounts」をクリックします。

image

先程作成した「example1」というリポジトリを探します。リポジトリが見つかったら右側のアイコンをクリックします。

image

Clone」をクリックします。

image

Cloneされました。ユーザ情報を変更する場合は画面左上、リポジトリ名の右側にあるアイコンをクリックします。

image

必要であれば「Use global git credentials」のチェックを外し、ユーザ情報を入力して「Close」をクリックします。

image

Gitflowで初期化する

リポジトリをGitflowで初期化します。Forkのメニューから「RepositoryGit FlowInitialize Git Flow」をクリックします。

image

「Initialize Git Flow」をクリックします。自動的にmaster(main)/developブランチが作成されます。

image

masterブランチをpushする

Fork上でGitflowに従った開発を行う際、リモート側(GitHub)にもブランチがpushされていないと不整合状態になる可能性がある為、先にブランチをpushしておきます。まず、masterブランチをcheckoutします。masterブランチを右クリックし、「Checkout master」をクリックします。

image

画面上部の「Push」をクリックします。

image

Push」をクリックします。

image

GitHub上で確認するとmasterブランチがpushされたことが分かります。

image

developrブランチをpushする

同様にdeveloprブランチをpushします。developrブランチを右クリックし、「Checkout develop」をクリックします。

image

画面上部の「Push」をクリックします。

image

Push」をクリックします。

image

最初のfeatureブランチ

作成する

最初のfeatureブランチを作成します。developブランチをクリックし「Git FlowStart Feature...」をクリックします。

image

featureブランチ名を入力して「Start Feature」をクリックします。

image

これでfeatureブランチが作成されました。

image

変更する

最初のfeatureブランチにソースコードを登録し、finishします。リポジトリ内に以下の内容でmain.pyというファイルを新規作成します。

main.py
print("Hello, Alice!")

Fork上で該当ファイルを選択して「Stage」をクリックし、変更内容をステージングします。

image

commitメッセージを入力したら「Commit 1 File and Push」をクリックします。

image

これでcommitされました。

image

finishする

このfeatureブランチをfinishします。featureブランチを右クリックし、「Git FlowFinish Feature...」をクリックします。

image

Finish Feature」をクリックします。

image

featureブランチがfinishされ、developブランチにマージされました。

image

2つ目のfeatureブランチ

作成する

同様に2つ目のfeatureブランチを作成します。developブランチをクリックし「Git FlowStart Feature...」をクリックします。

image

featureブランチ名を入力して「Start Feature」をクリックします。

image

これでfeatureブランチが作成されました。

image

変更する

2つ目のfeatureブランチでソースコードを修正(追加)し、finishします。リポジトリ内のmain.pyへ2行目として以下を追記します。

main.py
print("Hello, Alice!")
print("Hello, Bob!")

Fork上で該当ファイルを選択して「Stage」をクリックし、変更内容をステージングします。

image

commitメッセージを入力したら「Commit 1 File and Push」をクリックします。

image

これでcommitされました。

image

finishする

このfeatureブランチをfinishします。featureブランチを右クリックし、「Git FlowFinish Feature...」をクリックします。

image

Finish Feature」をクリックします。

image

featureブランチがfinishされ、developブランチにマージされました。

image

releaseブランチ

作成する

これまでの内容をリリースします。developブランチをクリックし「Git FlowStart Release...」をクリックします。

image

リリース名を入力して「Start Release」をクリックします。

image

リリースブランチが作成されました。

image

変更する

リリースブランチでmain.pyの1行目にバージョン情報の出力を追記してみました。

main.py
print("Version 1.0.0")
print("Hello, Alice!")
print("Hello, Bob!")

Fork上で該当ファイルを選択して「Stage」をクリックし、変更内容をステージングします。

image

commitメッセージを入力したら「Commit 1 File and Push」をクリックします。

image

これでcommitされました。

image

finishする

このreleaseブランチをfinishします。リリースブランチを右クリックし、「Git FlowFinish Release...」をクリックします。

image

Finish Release」をクリックします。

image

releaseブランチがfinishされ、developブランチにマージされました。

image

リリースメッセージを入力したら「Finish Release」をクリックします。

image

これでreleaseブランチがfinishされました。

image

developブランチをpushする

releaseブランチを取り込んだdevelopブランチをリモートへpushします。developブランチをcheckoutした状態で画面上部の「Push」をクリックします。

image

Push」をクリックします。

image

これでdevelopブランチがリモートへpushされました。

image

masterブランチをpushする

同様にmasterブランチもリモートへpushします。masterブランチをcheckoutします。 asterブランチをcheckoutした状態で画面上部の「Push」をクリックします。

image

画面上部の「Push」をクリックします。

image

Push」をクリックします。

image

これでmasterブランチがリモートへpushされました。

image

GitHub上でTagsを確認するとreleaseした内容が登録されています。

image