今さら「Gitflow」の復習
こんにちは!
スマレジ テックファームのMichiです!
今回はGitflowの復習がてら、記事を書きます。
今更Gitflowを学ぶ理由
「エンジニア歴9カ月目で今さらGitflowの復習?」と思われるかもしれませんが、これにはちょっとした事情があります。
エンジニアに転職して最初の半年は、先輩と2人で新規開発案件を担当していました。 メンバーが2人しかいないのでGitの運用も超適当で、特にブランチなども切らずに同じ場所で作業していました。
それでも、
僕「先輩、ここコンフリクトしたんですけどどうしたらいいですか?」
先輩「あー、じゃあそっちの変更に合わせといて」
僕「了解です!」
みたいな感じで、お互いに確認すればよかったんで、その時は特に問題なかったんですね。
で、最近になって、メンバーが何十人もいる大きなプロジェクトにアサインされたんですが、ここで問題発生。
僕「やべえ、Gitflow全部忘れた🙄」
入社前にちゃんとGitflowの勉強もしたんですけどね…。半年も触らなければ人間、見事に忘れるものです(笑)
そういうわけで、ここでしっかりGitflowを復習して、忘れないように身に着けたいと思います!
Gitflowとは?
Gitflowとはチーム開発でGitを運用する際のルールのようなものです。
Gitflowでは目的に応じて複数のブランチを派生させ、最終的にそれらをマージ(合体)させることでプロダクト開発をしていきます。
Gitflowで使用するブランチ
main(master)
すべての原型となるブランチです。
master
というのは古い言い方で、今はmain
と呼称するらしいです。プロダクトをリリースするときはこのブランチからリリースされます。このブランチ上で作業を行うことはありません。
develop
main
から派生した開発用のブランチです。
実際の開発作業はここからfeature
ブランチを切って行うので、このブランチ上で作業を行うことはありません。
feature
develop
から派生する機能の追加・修正用ブランチです。
各機能の担当者はdevelop
から各々のfeatrue
ブランチを切り、作業が終わればその内容をdevelop
へマージします。尚、このブランチを直接main
へマージしてはいけません。
release
同じく、develop
から派生するプロダクトリリース用のブランチです。
リリース予定日が近づくと、develop
からrelease
ブランチを切り、リリース準備(総合試験やバグ修正)を行います。リリース準備が終了すると、その内容はmain
へマージされた後本番環境へデプロイされます。また、develop
へもマージされます。
hotfix
main
から派生する緊急対応用(バグ修正など)のブランチです。
このブランチのみ、main
から分岐します。作業が終われば、main
とともにdevelop
へ修正内容をマージします。
実際の流れ
今回はプロジェクトの一メンバーとして、Gitflowを用いて開発する際の流れを解説します。
尚、プロジェクトにはすでにmaster
とdevelop
ブランチが存在するものとします。
1. developブランチを最新の状態にする
まずは大元となるdevelop
ブランチを最新の状態にします。
git checkout develop git pull origin develop
2. featureブランチを切る
最新状態のdevelop
からfeature
ブランチを作成します。
ブランチ名はチームによりますが、例えばfeature/{#チケット番号}-{作業内容}
のような規則で命名します。
git checkout -b feature/#123456-gitflow-test
3. featureブランチで作業を行う
作成したfeature
ブランチで作業を行います。
作業内容は適宜コミットしましょう。
git add . git commit -m "ADD:Gitflow test"
※次の項で述べますが、develop
ブランチの変更を取り込む際にgit rebase
を使う場合は、ここでリモートリポジトリにプッシュしないように!
4. developブランチの変更を取り込む
最新のdevelop
ブランチを、現在作業中のfeature
ブランチに取り込みます。
これは自分の作業中に、他のメンバーがdevelop
に変更を加えた場合、自分の開発内容とコンフリクトを起こす可能性があるためです。
まず、develop
ブランチに移動して、最新状態のリモートリポジトリを取り込みます。
git checkout develop git pull origin develop
次にfeature
ブランチに戻り、最新にしたdevelop
を取り込みます。
ここでdevelop
を取り込むには、merge
とreabase
を使う2種類の方法があります。
a. mergeを使用する方法
merge
はfeature
の先頭に、develop
ブランチを合体させるコマンドです。
git checkout feature/#123456-gitflow-test git merge develop
■特徴
feature
ブランチの先頭にマージコミットを作成する- 非破壊的な操作であるため、既存のブランチが変更されることはない
feature
で長く開発を続けていると、開発機能とは直接関係ないマージコミットが増え続けてしまう
b. rebaseを使用する方法
一方、rebase
はコミットを新しく作り直すことによって、履歴を1本の線にするコマンドです。
git checkout feature/#123456-gitflow-test git rebase develop
■特徴
- コミットを作り直し、
develop
ブランチの先頭にfeature
の履歴をつなげる - 破壊的な変更であるため、ルールを守らないとチーム全体に影響を及ぼすことがある
- マージコミットは作成されないため、履歴が直線的で見やすい
ここで注意しなければならないのが、先ほども言ったように「rebase
する前にローカルの変更をリモートリポジトリ
へプッシュしてはいけない」ということです。 rebase
はコミットを作り直すので、プッシュした後にrabase
を行うとローカルとリモートの内容に差異が発生し、コンフリクトしてしまいます。こうなるともう強制プッシュするしかないのですが、チームによってはGitHub/Labの設定によって強制プッシュが禁止されている場合もありますので十分気を付けましょう。
尚、merge
を使用するか、rebase
を使用するかはチームの方針によって変わってきます。わからない場合は、コマンドを打つ前に一度、ほかのチームメンバーに聞いてみるのがいいでしょう。
5. リモートリポジトリへプッシする
ここまで出来たら、ローカルのfeature
ブランチの変更内容をリモートリポジトリへpush
します。
git push origin feature/#123456-gitflow-test
6. マージ/プルリクエストを発行する
develop
ブランチに対して、マージリクエスト(GitLab)、もしくはプルリクエスト(GitHub)を発行します。
7. レビューしてもらう
内容をレビューしてもらい、OKならリクエストが承認され、feature
ブランチがdevelop
へマージされます。
指摘事項がある場合はコードを修正し、3. 以降の過程をやり直します。
まとめ
Gitflowの概要と実践について、サクッとではありますが解説しました。
「developブランチの変更を取り込む」 の箇所は、私も実務に入る前はmerge
を使う方法しか知らなかったので、びっくりしました。(基本的にrebae
は使ったらアカンっていう認識のコマンドやった…)
初めて使う時は怖すぎて、先輩に「ほんまにやっていいんですか!?」って何回も聞いた記憶があります(笑)