- 追加された行はこの色です。
- 削除された行はこの色です。
#topicpath
----
#contents
まだまだ試行錯誤中です。
Gitを使ってちゃんとした(?)開発の手順を整理中です。
イメージとしては master は本番稼働として管理して、そこから派生する開発用のdevelopブランチがあって、そこからさらにチケットごとにブランチ(下記の例でfeature/dev_50 とか)が作成され、チケットの対応が完了したらdevelopブランチにマージされていく、、、ってイメージ。
よくよく調べたら、この開発フローはGit-Flowという開発フローとして形式化されてるようで、なるべくそれに沿ったものにしてみようと思います。
** 事前準備 [#p44aa929]
GitHub上では masterとdevelopというブランチが作成済みという前提で進めます。ちなみにそれらの作成方法は [[GitHub/クローンからプッシュまでの流れ]] へ整理済みです。
** 開発者がローカルの環境で初回やること [#f3ad2b35]
開発者が開発を始めようと思ったとき((ようするに個別のチケットを対応しようと思ったとき))、開発者はまずリモートのdevelop ブランチのCloneをローカルに作成します。
手順は [[GitHub/リモートのブランチをcloneする]] をご確認ください。
ここまでで developというローカルのブランチが作成・チェックアウトされました。一応確認するとこんな感じ。。
$ git branch -vv
develop 1d61f85 [origin/develop] Merge branch 'release/0.0.1' into develop
master aa3dca8 [origin/master] Merge branch 'release/0.0.1'
develop aa3dca8 [origin/develop]
master aa3dca8 [origin/master]
各開発環境で初回やるのはここまでで、チケットを対応する際はつぎからの手順を実施します。
**チケットごとのブランチの作成 [#de37d929]
$ git checkout -b feature/dev_50 develop <- チケット番号のイメージ。developからのブランチの作成と移動
** 開発ブランチで開発 [#r556248c]
***チケットごとのブランチの作成 [#de37d929]
$ git checkout -b feature/dev_50 develop ←50は、チケット番号のイメージ。developからのブランチの作成と移動
Switched to a new branch 'feature/dev_50'
$ git branch
develop
* feature/dev_50
master
developから派生したチケット番号#50用のブランチが作成できました。
ちなみに、下記のコマンドで
$ git branch -vv
develop bbf5c22 [origin/develop] committed on 2017.1.27
* feature/dev_50 bbf5c22 committed on 2017.1.27
master 818f281 [origin/master] Merge
develop aa3dca8 [origin/develop]
* feature/dev_50 aa3dca8
master aa3dca8 [origin/master]
developから派生したチケット番号#50用のブランチが作成できました。
ちなみに、-vvをつけることで、いま作成したブランチ feature/dev_50 がどのリモートブランチも追跡していない(紐付いていないというか) 事を確認しています((どうも最近のgitは問題ないぽい?んですが、別のリモートブランチが紐付いててプッシュしたら別のブランチが更新された、なんて事を防止するための確認))。
いま作成したブランチfeature/dev_50 がどのリモートブランチも追跡していない(紐付いていないというか) 事を確認します。
**細かなコミットとかを進めていく使い捨てブランチを作成 [#qff1d031]
***細かなコミットとかを進めていく使い捨てブランチを作成 [#qff1d031]
$ git checkout -b feature/dev_50_spike develop
$ git branch
develop
feature/dev_50
* feature/dev_50_spike
master
ここまでを図で示すとこんな感じ。
#ref(01.png)
開発はここで進めていきます。全体に反映されたくないようなコミットはココにやっていきます(とりあえずコミット!とかね)。。
なので、コミットを進めていくと下記の図のような感じになります。
#ref(02.png)
***チケット毎のブランチ feature/dev_50 へコミットをまとめる [#a8c8ef70]
** チケット毎のブランチへのマージコミット [#a8c8ef70]
最終的に対応が完了したら、feature/dev_50にコミットをマージします。コミットを他のブランチにまとめる手順は
最終的に対応が完了したら、feature/dev_50 にコミットをマージします。コミットを他のブランチにまとめる手順は
[[GitHubでコミットをまとめる>GitHub/コミットをまとめる]] に整理してありますが、要するに下記のコマンドを実行します。
$ git checkout feature/dev_50 ←dev_50へ移動して
$ git merge --squash feature/dev_50_spike spikeの内容をスカッシュマージ。
$ git merge --squash feature/dev_50_spike spikeの内容をsquashマージ。
feature/dev_50_spikeで作業していた内容が、まるっと feature/dev_50にマージされました(下図の左の状態)。
あとはこれらをコミットするときにちゃんとコメントを書いてコミットすれば、プッシュしても恥ずかしくない履歴が残せます。
***チケット毎のブランチ feature/dev_50 のコミット [#gc3c9a74]
$ git commit -a
#ref(03.png)
** developの更新分をリベースしてコミット [#jb31c024]
*** developの更新分のリベース [#jb31c024]
さて、チケットの対応が完了したのですが、feature/dev_50をプッシュする前に、developの直近の更新分((他人がチケットを対応してマージされたりしているかもしれない))を 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 の内容をプッシュ [#z7ea2e6f]
そしてリモートのfeature/dev_50へpushして、そこからdevelopに対してプルリクエストを行い、developへマージしてもらいます。
そしてリモートの 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
#ref(04.png)
** サーバの feature/dev_50 から、developに対してのプルリクエスト [#w8c7d19a]
最後に、GitHubサーバの feature/dev_50 から developに対してプルリクエストを送信し、レビュワーにdevelopへマージしてもらいます。
以上で、 ローカルの feature/dev_50 で開発していた内容が、めでたく developへマージされました。
チケット担当者の作業は以上で完了です。
**参考 [#i150b780]
-[[7. merge --squash【チュートリアル3 コミットを書き換えよう!】 | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ>http://www.backlog.jp/git-guide/stepup/stepup7_7.html]]
-[[GitHubへpull requestする際のベストプラクティス - hnwの日記>http://d.hatena.ne.jp/hnw/20110528]]
----
この記事は
#vote(おもしろかった,そうでもない)
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}