Top / GitHub / 開発手順

まだまだ試行錯誤中です。

Gitを使ってちゃんとした(?)開発の手順を整理中です。

イメージとしては master は本番稼働として管理して、そこから派生する開発用のdevelopブランチがあって、そこからさらにチケットごとにブランチ(下記の例でfeature/dev_50 とか)が作成され、チケットの対応が完了したらdevelopブランチにマージされていく、、、ってイメージ。

よくよく調べたら、この開発フローはGit-Flowという開発フローとして形式化されてるようで、なるべくそれに沿ったものにしてみようと思います。

master/develop/featureブランチのイメージ

全体像を示すと以下の感じ。本来のGit-Flowは masterへのマージにreleaseブランチが登場しますが、今回の記事はdevelopブランチへマージまでしか記載していないためreleaseブランチの記述はいったん割愛してあります

model.png

事前準備

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

ここまでを図で示すとこんな感じ。

01.png

開発はここで進めていきます。全体に反映されたくないようなコミットはココにやっていきます(とりあえずコミット!とかね)。。 なので、コミットを進めていくと下記の図のような感じになります。

02.png

チケットごとのブランチ 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にマージされました(下図の左の状態)。

03.png

チケットごとのブランチ 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
04.png

サーバの feature/dev_50 から、developに対してのプルリクエスト

最後に、GitHubサーバの feature/dev_50 から developに対してプルリクエストを送信し、レビュワーにdevelopへマージしてもらいます。

以上で、 ローカルの feature/dev_50 で開発していた内容が、めでたく developへマージされました。

チケット担当者の作業は以上で完了です。

参考


この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  
  • リモートへ送信したフィーチャーブランチは、マージしてもらったら削除でOKぽいですね -- きの? 2017-02-28 (火) 09:30:44
  • spike状態のモノも、他との共有を目的にPushしてもよいかも。ただしそこでのコミット履歴はゴミなので、dev_50にsquashマージされたあとはリモートからも削除しましょう。 -- きの? 2017-05-07 (日) 13:02:10
  • developブランチにマージされたあとのリリース作業について。source tree などでdevelopからreleaseブランチを作成、リリースバージョンを書き込むなどリリース関連のコミットを実施。それを、マージもしくはプルリクで、developとmasterへマージします。masterはリリースモジュールがマージされたので、そこにタグ付け。んでリリースを行って完了です。つぎの開発からはまたdevelopブランチからfeature/xxを作成し、と続きます。 -- きの? 2017-05-07 (日) 13:07:51
  • mavenを使うプロジェクトの場合、gitflow-maven-plugin を入れることで、releaseブランチの作成,verのSNAPSHOTを削除してコミット、masterとdevelopへのマージとtagづけ、でdevelop上でverの数字をインクリメントしてSNAPSHOTのsuffixをつけてコミット、を自動化できます。 -- きの? 2017-06-16 (金) 09:10:40
  • 具体的にはdevelopまでマージしたあと(プルリクベースで)、mvn gitflow:release-start ,mvn clean deploy, mvn gitflow:release-finish 最後に全部プッシュ。 -- きの? 2017-08-03 (木) 13:08:30

Top / GitHub / 開発手順

現在のアクセス:700


*1 ようするに個別のチケットを対応しようと思ったとき
*2 どうも最近のgitは問題ないぽい?んですが、別のリモートブランチが紐付いててプッシュしたら別のブランチが更新された、なんて事を防止するための確認
*3 他人がチケットを対応してマージされたりしているかもしれない

添付ファイル: filemodel.png 36件 [詳細] file04.png 33件 [詳細] file03.png 36件 [詳細] file02.png 31件 [詳細] file01.png 31件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-03 (木) 13:55:15 (107d)