175
175

More than 5 years have passed since last update.

怠惰にgitを使うためのシェル活用術、またはgst一族

Last updated at Posted at 2012-06-12

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/gsta
#!/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/gstd
#!/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/gstv
#!/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/gcm
#!/bin/sh
git commit -m "$*"

そのまんまで、stageしたものをcommitするaliasです。

gcm

gch: git cherry -v

cherry-pickはよく使われているのですが、cherryも結構便利です。
git cherryは、かつて分岐したブランチ間の差分commit一覧を表示します。

例として、ng_solrブランチに含まれているcommitとok_solrブランチに含まれているcommitの差分を出力してみます。-vオプション付きがおすすめです。

cherry
% 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/gchs
#!/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を使ってる!という人は是非教えて下さい。もっとラクしたいです。

175
175
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
175
175