まだまだ試行錯誤中です。 Gitを使ってちゃんとした(?)開発の手順を整理中です。 イメージとしては master は本番稼働として管理して、そこから派生する開発用のdevelopブランチがあって、そこからさらにチケットごとにブランチ(下記の例でfeature/dev_50 とか)が作成され、チケットの対応が完了したらdevelopブランチにマージされていく、、、ってイメージ。 よくよく調べたら、この開発フローはGit-Flowという開発フローとして形式化されてるようで、なるべくそれに沿ったものにしてみようと思います。 master/develop/featureブランチのイメージ †全体像を示すと以下の感じ。本来のGit-Flowは masterへのマージにreleaseブランチが登場しますが、今回の記事はdevelopブランチへマージまでしか記載していないためreleaseブランチの記述はいったん割愛してあります 事前準備 †GitHub上では masterとdevelopというブランチが作成済みという前提で進めます。ちなみにそれらの作成方法は GitHub/クローンからプッシュまでの流れ へ整理済みです。 開発者がローカルの環境で初回やること †開発者が開発を始めようと思ったとき*1、開発者はまずリモートのdevelop ブランチのCloneをローカルに作成します。 手順は GitHub/リモートのブランチをcloneする をご確認ください。 ここまでで developというローカルのブランチが作成・チェックアウトされました。一応確認するとこんな感じ。。 $ git branch -vv develop aa3dca8 [origin/develop] master aa3dca8 [origin/master] 各開発環境で初回やるのはここまでで、チケットを対応する際はつぎからの手順を実施します。 チケットごとのブランチで開発 †チケットごとのブランチの作成 †$ git checkout -b feature/dev_50 develop ←50は、チケット番号のイメージ。developからのブランチの作成と移動 Switched to a new branch 'feature/dev_50' $ git branch -vv develop aa3dca8 [origin/develop] * feature/dev_50 aa3dca8 master aa3dca8 [origin/master] developから派生したチケット番号#50用のブランチが作成できました。 ちなみに、-vvをつけることで、いま作成したブランチ feature/dev_50 がどのリモートブランチも追跡していない(紐付いていないというか) 事を確認しています*2。 細かなコミットとかを進めていく使い捨てブランチを作成 †$ git checkout -b feature/dev_50_spike develop $ git branch develop feature/dev_50 * feature/dev_50_spike master ここまでを図で示すとこんな感じ。 開発はここで進めていきます。全体に反映されたくないようなコミットはココにやっていきます(とりあえずコミット!とかね)。。 なので、コミットを進めていくと下記の図のような感じになります。 チケットごとのブランチ feature/dev_50 へコミットをまとめる †最終的に対応が完了したら、feature/dev_50 にコミットをマージします。コミットを他のブランチにまとめる手順は GitHubでコミットをまとめる に整理してありますが、要するに下記のコマンドを実行します。 $ git checkout feature/dev_50 ←dev_50へ移動して $ git merge --squash feature/dev_50_spike spikeの内容をsquashマージ。 feature/dev_50_spikeで作業していた内容が、まるっと feature/dev_50にマージされました(下図の左の状態)。 チケットごとのブランチ feature/dev_50 のコミット †あとはこれらをコミットするときにちゃんとコメントを書いてコミットすれば、プッシュしても恥ずかしくない履歴が残せます。 $ git commit -a これで上記の図の右の状態になりました。 developの更新分のリベース †さて、チケットの対応が完了したのですが、feature/dev_50をプッシュする前に、developの直近の更新分*3を git rebase で反映させて対応完了としたいです。仕組みの詳細は、GitHub/マージとリベース に整理しましたが、ようするに下記の通りです。 git checkout develop developへ移動 git pull origin develop ローカルのdevelopを更新 git checkout feature/dev_50 dev_50へ移動 git rebase develop 派生元のdevelopの内容でリベース ... コンフリクトした場合はココでゴニョゴニョするのですが、詳細は上記リンク。 こうやって、feature/dev_50 のしらないところで更新されたdevelopの内容を、feature/dev_50へ反映させます。 サーバへ feature/dev_50 の内容をプッシュ †そしてリモートの feature/dev_50 へpushします。 $ git push origin feature/dev_50 Total 0 (delta 0), reused 0 (delta 0) To https://github.com/xxxxxx/helloworld.git * [new branch] feature/dev_50 -> feature/dev_50 サーバの feature/dev_50 から、developに対してのプルリクエスト †最後に、GitHubサーバの feature/dev_50 から developに対してプルリクエストを送信し、レビュワーにdevelopへマージしてもらいます。 以上で、 ローカルの feature/dev_50 で開発していた内容が、めでたく developへマージされました。 チケット担当者の作業は以上で完了です。 参考 †
この記事は
現在のアクセス:4419 |