Git AdventCalendar 1日目で@yaottiがQiitaでよく使うgitコマンドを紹介してくれたので、僕も、僕の勤めているWantedlyで、新しいバージョンのプロダクトをデプロイするときに使っているgitコマンドを紹介しようと思います。
ちなみにWantedlyは最近Qiitaチームアカウントを作ってもらいました!皆さん見てみてくださいね。
Wantedlyの開発運用体制の概略 (なぜ、この差分表示が必要か)
WantedlyはRuby on Rails
で開発を行い、プロダクションサーバーはHeroku
でホスティングしています。
開発者は全員(5-10人程度)が、ひとつのGithub
レポジトリを共有した上で、
-
新しい変更は、
<開発者のgithub-id>/<機能名>
(例:awakia/add-awesome-feature
) のブランチを作って、master
に対してPull Requestを送る。 -
送られたPull Requestのコードレビューをして、よさそうであればマージ
-
ある程度変更が溜まったら、適当なタイミングで最新のmasterをherokuにデプロイ
というフローで開発・運用しています。もう少し規模が大きくなってきたら、次にデプロイするstableなブランチと、最新のブランチの2つを用意する必要があるかもしれませんが、現状では最新のmasterをそのままデプロイしたいことが多いので、こうしています。
Wantedlyは、「全員が責任をもって開発・保守しよう!」という思いもあって、エンジニア全員が、マージ、デプロイを行っています。
そのため、前の人がどこまでデプロイしていて、今回どのような変更が入るのか確認する必要が出てきます。
今回はそんな時のためのgitコマンドを紹介します。
ブランチ名の仮定
以下では
- Github上のリモートリポジトリ名が
origin
- Heroku(プロダクションサーバー)上のリモートリポジトリ名が
heroku
であることを仮定します。別の名前を使っている人は適宜置き換えてください。
コマンドライン上で見る
どのファイルに変更を加えたか知る
git fetch heroku master && git fetch origin master && git diff --name-only heroku/master..origin/master
ここでは特にDBのスキーマをいじる変更が無いかチェックします。DBをいじる変更があると、一度サーバーを止めてデプロイしないといけない可能性があります。
どんなコミットがあったか知る
git fetch heroku master && git fetch origin master && git log heroku/master..origin/master
ちなみに自分はgit log
を使うときは
git log --stat --pretty=format:'%C(yellow)%h %Cgreen%cr %Cblue%cn %Cred%d %Creset%s'
のオプション付きで使います。(エイリアスを作ってます。)
Github上で見る
git fetch heroku master && open https://github.com/<ユーザー名>/<リポジトリ名>/compare/`git rev-parse --short heroku/master`...master
コミットが多くなるとGithubの方が見やすいので、こっちを使ったりします。
解説 (Git/Githubで2点間の変更を見る)
実運用では、間違えて過去の情報を参照しないようにgit fetch
して最新の情報に更新することを保証しています。
しかし、ポイントは、gitで2点間のdiff
を取る部分だけで、それは以下のように実現できます。
git diff <ブランチ1>..<ブランチ2>
このdiff
の部分を目的に応じてdiff --name-only
だったりlog
だったりに変えると良いです。
そして、これと同じ部分をGithubで見るには
https://github.com/<ユーザー名>/<リポジトリ名>/compare/<ブランチ1>...<ブランチ2>
をブラウザで開けばいいだけです。