git dtコマンド - razokulover publog を見て自分もgitのコマンドをカスタマイズしてるのを思い出したので普段よく使っているのを紹介します。
対象者
作業途中はtmpコミットをたくさん作って、最後に git rebase -i
でコミットを整えている人
前置き
gitのタイプ数を減らす
gitコマンドを使う時に毎回 git
と3文字タイプするのは時間の無駄なのでエイリアスつけるのをおすすめします
~/.bash_profile
とか ~/.bashrc
辺りに下記を書きます。
alias g='git'
これで g
だけでgitコマンドが使えます
git-now
最速でtmpコミットするためのコマンド。Macなら brew install git-now
でok
~/.gitconfig
に下記を書きます。
[alias] n = now --all --stat
- --all :
git add .
して新規ファイルも全部コミットする - --stat : デフォルトだとコミットメッセージにdiffが全部入るため、変更行数だけにする
g n
だけでこのようなtmpコミットが出来ます
[from now] 2014/08/06 23:28:50 spec/helpers/application_helper_spec.rb | 4 ++++ 1 file changed, 4 insertions(+)
tig
ターミナル上でgitのコミットツリーをいい感じに表示してくれます。
SourceTree も便利なんですが、ターミナルから動きたくない時や画面がないような環境では重宝します。
gitを逆から書いたらtigなので覚えやすいです。
tigもgit同様使用回数が多いのでエイリアスにします。
alias t='tig' alias ta='tig --all'
デフォルトだと現在のbranchしかツリーを見れないですが、--all
をつけることで全てのbranchを見ることができます。
【本題】tigから git rebase -i する
コミット整形する時は
git rebase -i <コミットID>
のようにすると思いますが、わざわざ開始コミットを探すのは大変なのでtigで選択したコミット行を git rebase -i
に渡せるようにします
~/.tigrc
に下記を書きます。
bind main R !git rebase -i %(commit) bind diff R !git rebase -i %(commit)
.gitconfig
のalias同様 ! をつけると任意のコマンドを実行できるのを利用して git rebase -i
を実行してます。
%(commit)
にtigで選択している行のコミットIDが渡されます。
上の設定だとショートカットキーをRにしていますが好みに応じて変えてください。*1
こうなった
Rで選択した行よりも上を全部 git rebase -i
で編集対象にし、全部1つのコミットにsquashしてます。
ブコメとか追記
git now --rebase とは何が違うのだろうと思った / git-nowに限らずまとめたい時に便利ってことか
その通りです。今回はtigで rebase -i
するのが本題なので、大量のcommitを整形するのを説明しやすくするためにgit-nowも一緒に紹介しました
ターミナルのgif画像作るのに何のツール使ってるのか知りたい。キー入力の表示があるのが面白い。/これは多分キーストローク表示アプリのKeyCastrとかをオーバーレイさせながらスクリーンキャプチャしてる感じかな?
別のエントリ で詳しく書く予定ですがLICEcapとKeyCastrを使ってます
tigから git rebase -i したらいろいろ捗った - くりにっき http://t.co/Jvbs8QaxTu 俺だったら、まずはgit-nowのfixupしてからcommit --amendでメッセージ修正するかなー
— ふ''れいす (@bleis) 2014, 8月 7
git-now --fixupは「公式」と呼ばれているgit-nowには含まれてないからな http://t.co/SRxeeh2XQd
— 白い高野さん (@masaru_b_cl) 2014, 8月 7
以前fixupオプションを適当に作ってgit-nowにPRしたことあるんだけど、よく分かってなくてゴミがたくさん残った状態だったのでリジェクトされた
— 白い高野さん (@masaru_b_cl) 2014, 8月 7
というわけで、@mzp 版git-nowが良い
— 白い高野さん (@masaru_b_cl) 2014, 8月 7
( ゚д゚)ハッ!!
*1:Rはrebase, revert, reset など使用頻度の高いコマンドが多いので何を割り当てるか悩みどころ