私は主業務がインフラなので、共同作業をする相手も同じくインフラなエンジニアが多いです。インフラエンジニアの中には開発経験が浅い、もしくは全く無い人間も少なくないので、scmの扱いはチームの最大公約数、故に原始的で汚くなります。
なので、gitの履歴をきれいに保つために、かんたんに出来るプラクティスについてまとめます。
作業の流れ
1. とりあえずブランチ
諸悪の根源の一つは、master(ないしは更新すべきブランチ)での直接作業です。なので、とにかくブランチを作ります。
お勧めは「今やろうと思っている作業」を単位にすることなので、名前もそれっぽい(make_backup_script_for_wap
みたいな)感じで作ります。
$ git branch
# 初期状態
* maser
# ブランチを作って移動
$ git branch kinou_tsuika
$ git checkout kinou_tsuika
# 確認
$ git branch
* kinou_tsuika
master
2. コミットは自由に
ブランチを切っている場合は、いくらコミットしてもとりあえずその中の話になります。なので、コメントを付けつつ気にせずコミットします。
# 編集して
$ vim hogehoge.txt
# commit
$ git add hogehoge.txt
$ git commit -m 'change parameters'
3. 長くなりそうなときはリモートブランチにさくさくpush
作成時間がちょっと長くなりそうだったり、違う端末でも作業をしたい場合は、2の作業結果をちょくちょくpushすると捗ります。
# リモートブランチを確認
$ git branch -a
* kinou_tsuika
master
remotes/origin/master
# 大丈夫そうなので、リモートブランチの作成
$ git push origin kinou_tsuika
# 無事できた
$ git branch -a
* kinou_tsuika
master
remotes/origin/master
remotes/origin/kinou_tsuika
4. 履歴をきれいにまとめる
ここまでではリモートブランチを使う場合もメインでないブランチです。つまり、閉じた世界なのでどこにも反映されません。というわけで、反映してみます。
# メインのブランチに切り替えて
$ git checkout master
# ひとまず最新に更新して
$ git pull origin master
# 自分の変更分をsquashで取り込んで、再コミット
$ git merge --squash kinou_tsuika
$ git commit -m 'kinou_tsuika done'
# きれいになったコミットをpush
$ git push origin master
# 後始末のブランチ削除
$ git branch -D kinou_tsuika
$ git push origin :kinou_tsuika
まとめ
要点はこれだけです。これならできませんか・・・?
- こまめにbranchをつくる
- remote branchも気軽につくる
- remoteへのpushは--squashなmerge後に
【番外編】失敗からの回復方法
ブランチ作るの忘れちゃった
気付いたらmasterとか、直接更新しないはずのブランチを更新しちゃってた場合
# コミット未遂
$ git status
変更内容がずらずら…
# 現在の変更内容を一時保存(コミットではない)
$ git stash
# 急いでブランチを作り直して
$ git branch hoge
$ git checkout hoge
# 一時保存したやつを戻す
$ git stash pop
ブランチ壊しちゃった
masterブランチがえらいことになった。自力でなおせない。。。
# mergeに失敗してmasterが壊れた。。。
$ git branch -a
master
* kinou_tsuika
remotes/origin/master
# 壊れたローカルのmasterを消す!
$ git branch -D master
# そして再生
$ git checkout -b master origin/master
$ git branch
* master
kinou_tsuika
remotes/origin/master