Git Advent Calendar / Jun. 6/12 担当@T_Hashです。
明日も仕事でだるいのですが、怠惰はプログラマの美徳といいます。というわけで僕が日々の仕事で怠惰にgitを使うための設定を共有したいと思います。
zsh
↓を参考にした設定を.zshrcに記述して、右プロンプトにブランチ名とステータスを表示させています。コマンドを叩かずに状態が見えて非常に便利です。
git のブランチ名 と作業状態 を zsh の右プロンプトに表示+ status に応じて色もつけてみた
緑だとクリーンな状態、赤だと未コミットの変更があります。「緑が正常な状態、緑に戻って来たら一段落してコーヒー飲もう」とか考えながら作業をしてます。
あと、zshはgitのコマンドも補完してくれるので地味に重宝します。
gst: git status
git statusは常に叩くクセを付けた方がいいと思います。オプションは-sと-bがおすすめです。
で、これにgstというaliasを付けて使っています。
僕はもう既にgstが手癖になってて、次の作業を考えながら手が無意識にgst, gst, gst…と叩くようになりました。かの@sotarok先生もgst
を使っているらしいです。やったね。
@Mekajiki ぼくは gst ですねw 考え事してるとだいたい指が gst か ls を打ってます。あとは git branch -a が gb とかですかね。
Sotaro KARASAWA© (@sotarok) June 6, 2012
gst[a/d/v]: status出力のN行目を[add/diff/edit]
今回のメイン(たぶん)。↑のようにgstで表示したファイルに対して「2行目に出てる.vimrcを編集したいな」という時はgstvを使います。
これでvimが開き、.vimrcを編集できます。
addしたいときはgsta.
addされてgst結果が変わっていますね。
一方、「gst4行目の.zshrc、何が変更されているか見たい」という時はgstdを使います。
便利ですね。以下、たいしたことやってないですが、コードです。これをPATHに含まれる~/bin/とかに置いてchmod +xで実行権限つけてやれば使えます。
#!/bin/sh
if [ $# -eq 1 ]; then
git add `git status -s -b | grep -v "^#" | awk '{print$1="";print}' | grep -v "^$" | awk "NR==$1"`
else
exit 1
fi
#!/bin/sh
if [ $# -eq 1 ]; then
git diff -- `git status -s -b | grep -v "^#" | awk '{print$1="";print}' | grep -v "^$" | awk "NR==$1"`
else
exit 1
fi
#!/bin/sh
if [ $# -eq 1 ]; then
vim `git status -s -b | grep -v "^#" | awk '{print$1="";print}' | grep -v "^$" | awk "NR==$1"`
else
exit 1
fi
statusついでにstash listも表示する
作業中に急に対応する必要のあるバグが出てきたときなど、stash saveでいったん作業を退避させてからバグ対応、stash popで元に戻すということをやります。
たまにstashしていたことをど忘れすることがあるので、先ほどのgstでstatusを見るとき、ついでにstash中の変更を表示させるようにしてみたところ、とても安心感あって良い感じなのでオススメです。
% which gst
gst: aliased to git st && g stash list
alias gst='git st && g stash list'
- 余談
- 確かどこかでgitメンテナの方が、stashはsave -> popで戻すのではなく、save -> apply -> (確認) -> dropというお行儀がよいフローを推奨していた記憶があります。
gcm: git commit
#!/bin/sh
git commit -m "$*"
そのまんまで、stageしたものをcommitするaliasです。
gch: git cherry -v
cherry-pickはよく使われているのですが、cherryも結構便利です。
git cherryは、かつて分岐したブランチ間の差分commit一覧を表示します。
例として、ng_solr
ブランチに含まれているcommitとok_solr
ブランチに含まれているcommitの差分を出力してみます。-v
オプション付きがおすすめです。
% git checkout ng_solr
% git cherry -v ok_solr
+ 608e08404aa15c7cf1cc3bad4311f4a9edd9e78d install Sunspot (Solr on Rails)
+ a5d09e3ee1c1daf40a29b0f5a6cc94e4a2ff16d8 Mongoid用Sunspotカスタマイズ
+ a7c11ee46578d78650512c06446e31722f0568b5 seachable定義を追加
- c13b510b8e1ac02350058ca50c77a8f72ba3cf80 index再生成用rakeタスクの作成
- 5009ffcb5b16cc77ceff2117c2a435017db96247 ArticleControllerのリファクタリング
+ 67294858d72d4fb8d6ae44e43485e08744bd67de なんかいろいろほげほげ
alias gch='git cherry -v'
これをcutとかawkでいじってgit showに渡してやれば、該当コミットの中身が確認できる。
#!/bin/sh
if [ $# -eq 2 ]; then
git show `git cherry -v $1 | awk '{print $2}' | awk "NR==$2"`
else
exit 1
fi
名前はgit cherry+showでgchs. 使い方は
$ gchs ok_solr 2
とやれば2個目のcommit内容が表示される。
masterから作業ブランチの差分を順々に表示していくと、コードレビューなんかに便利かなと。
git log
log系はいろいろ工夫のしどころがある。一部、最近はTigでよくねと思ってる機能もあるけど一応。
glgg
脳内ではゲルググと呼んでる。
alias glgg='git logg'
[alias]
logg = log --stat --pretty=format:'%Cblue%h %Cgreen%ar %Cred%an %Creset%s %Cred%d'
glg
alias glg='git logg | head'
単なるゲルググのheadだが、ゲルググより利用頻度高。直近commitの内容をさっくり確認。
白で表示されて欲しい文字が赤色で出るのが目下の悩み
その他ログ系tips
- loggr
[alias]
loggr = log --graph --date-order --pretty=format:'%Cblue%h %Cgreen%ci %Cred%an %Cblue%m %Creset%s %Cred%d'
命名: logg + graph。キャプチャは取れないが多人数開発(つまり仕事)でマージ関係を把握する時便利
- tig
しっかり見るときはtigオススメ
% brew install tig
いじょ
俺の方がもっと怠惰にgitを使ってる!という人は是非教えて下さい。もっとラクしたいです。