Github時代の
gitのはなし
株式会社エクストーン 豊田陽一
今日のおはなし
● 今日のおはなしの対象者
● Github(的なサービス)
● 今日、覚えてもらいたい機能
○ rebase
○ cherry-pick
今日のおはなしの対象者
➢ Gitは使ってる
➢ Githubも使ったことはある
➢ ブランチとかも一応は使ってる
➢ でも、Pull Requestとかあんまりよくわかってない
➢ チーム開発のやり方が、正直svn時代とあんまり変わってな
い
Github(的なサービス)
Gitのホスティング
+ GUIによる可視化
+ 課題管理
+ 開発者間のコラボレーション
+ 開発ワークフロー
Github, Bitbucket, Gitlab, etc...
Pull Request
ブランチのマージを要求
‐ 一昔前だとパッチを送る処理に該当
‐ 要求を受け入れたタイミングでコードがマージされる
‐ Pull Request毎に議論ができる
Github flow
githubを利用したワークフロー
考え方
デプロイは頻繁に行われるべき
デプロイは誰でも簡単に行えるべき
Github flow (1)
masterブランチは常にデプロイ可能
Github flow (2)
新機能の実装はmasterブランチから分岐
→ 機能に即したブランチ名を付ける
→ 頻繁にサーバーにpushする
利点
● バックアップ
● ブランチ一覧=進行中の作業
Github flow (3)
いつでもPull Request
→ for merge
→ for discussion
○ むしろこっちがメイン
Github flow (4)
他の人にレビューをしてもらい、OKをもらえたら
masterへのmergeができる
→ 必ず他人に見てもらう
○ 見たら+1とか書く
Github flow (6)
masterにマージしたらデプロイ
とはいえ
普通のお仕事では四六時中デプロイできない
➢ デプロイできるタイミングは決まってる
○ 開発が終わってもデプロイできない
○ デプロイしてなくても次の開発はやってくる
○ もちろんデプロイ時にそれが含まれてはダメ
対策の一例
developブランチを追加
develop: レビュー済みのコード
→ 新機能開発はdevelopブランチから分岐
→ リリース時にmasterにマージ
master: 最新リリースのコード
→ 緊急修正のみmasterブランチから分岐
素直にgit flow使えというお話し(^^
Github時代のGit
Pull Requestを頻繁に利用するようになってから、
利用頻度の増えたGitコマンド
● cherry-pick
● rebase
コミットをきれいにする機能
cherry-pick
別ブランチのコミットを取り込む
branch_1で git cherry-pick D
A B C D
F
E
G D’
master
branch_1
Dのコミットのコピー
が作られる
cherry-pick (2)
merge時にはよろしくしてくれる
A B C D
F
E
G D’
master
branch_1
H F G= +
H
branch_1のD’は既にmasterにDがあるため、適
用済みなので、Hに含まない
cherry-pick (3)
cherry-pick使わなかったら…
masterとbranch_1で同じ変更をしちゃう
A B C D
F
E
G H
master
branch_1
DとHはコード上では同じ変更
だが、別コミット
cherry-pick (4)
DとHが同一コミットではないので、衝突する
A B C D
F
E
G H
master
branch_1
I F G= +
I
異なるコミットD, H間でコンフリクトが発生+ H
why cherry-pick?
複数ブランチを並行して開発することが増えた
ブランチ間で共通の処理が必要なケースがある
例) ライブラリの依存関係追加など
why cherry-pick? (2)
どうする?
● 同じコードをそれぞれのブランチで書く?
○ コンフリクト祭りが目に見えてる
● 共通部分を先に書いてPull Request書く?
○ そのコード単体では意味ないから、マージしないよ?
そうだ、cherry-pick使おう!
rebase
分岐元のbranchを変更
branch_1で git rebase master
A B C D
F
E
G
master
branch_1
F’ G’
branch_1
branch_1の分岐時点からのコミッ
トのコピーをmasterから追加し、
branch_1のHEADをそこに移動
rebase (2)
分岐元の変更分を取り込むことができる
ツリー構造が変わる点に注意
ブランチの分岐元からHEADのすべてのコミットに対する
cherry-pickを行っているようなもの
rebase (3)
git rebase -i でインタラクティブモード
指定した範囲のコミットに対してまとめてインタラクティブに
いくつかの操作が可能
rebase (3)
git rebase -i <commit>でテキストエディタが起動
<commit>以降の個々のコミットに対する操作を指定する
pick e42c821 変更その1
pick f63e511 変更その2
# Rebase 12698f3..f63e511 onto 12698f3 (2 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
rebase (4)
コミットに対する操作
pick: コミットを採用
reward: コミットを採用。コミットコメントを書き換える
edit: コミットを採用。コミットの内容を編集する
squash: 前のコミットに統合する
fixup: 前のコミットに統合し、このコミットコメントを破棄する
exec: shellを実行
rebase (5)
よくやること
コミットを整理し、意味のあるまとまりにする
コミットコメントを後からまとめて編集する
コミット順を変更する (squashと合わせて)
コミットをきれいにする
why rebase?
コードが他人に読まれることを前提としているから
変更内容の概要が伝わりやすい
変更が多岐にわたる場合、コミット単位でのレビューが可能
Pull Request全体のレビューだと、範囲が広すぎるケースもある
まとめ
Githubによる、Pull Requestベースの開発
➢ ソースコードのみならず、コードができる過程もきれいにする
必要が出てきた
➢ gitのコミットを操作する機能をちゃんと使おう!
○ cherry-pick
○ rebase

Github時代のgitのはなし