Emacsからgitのブランチを扱うgit-dwim.elをリリース

Emacs本を書きました

gitはブランチが強力です。 ブランチは単なるポインタなので、gitではブランチの積極的な利用が推奨されています。

トピックブランチ

特に「トピックブランチ」は便利なブランチ利用法です。 作業前に特定の作業用のブランチを切り、無事に実装できたらmasterにマージ(リベース)し、ブランチを削除する方法です。 トピックブランチを切ることで、現在の目標を明確にすることができます。 また、緊急の修正をする場合はあわてずに一旦masterに戻って修正し、再びトピックブランチで作業することができます。 トピックブランチについては http://progit.org/book/ja/ch3-4.html が詳しいです。

トピックブランチを作成する

newtopicとういう名前のトピックブランチを作成するには、以下のコマンドを使います。


$ git checkout -b newtopic
トピックブランチをmasterにマージする

トピックブランチでの作業が終わると、以下のコマンドでmasterへマージします。


$ git rebase master
$ git checkout master
$ git merge newtopic

衝突は、「git rebase master」の時点で発覚します。 衝突を解決したら、以下のコマンドを実行します。


$ git add 衝突したファイル
$ git rebase --continue

http://d.hatena.ne.jp/bleis-tift/20100307/1267941654 を参考にしました。

Emacsでトピックブランチを扱う

gitのブランチは軽量な故、トピックブランチという便利な手法が登場しました。 しかし、トピックブランチを扱うにはこのように何個もコマンドが必要で、記憶に負担がかかります。 少なくとも僕には上のコマンドをミスなく実行できる自信はありません。

状況に応じて使うコマンドが異なるので、状況に応じて挙動を変化させるEmacsのコマンドを作成してしまえば、トピックブランチを習慣化できます。 ちょうどC-x v vでバージョン管理システムへの登録が習慣化したように。

  • masterのときは新しくブランチを作成し、切り換える
  • master以外のブランチのときはmasterへリベースする
  • 衝突したときはリベースの続きをする

ブランチの扱い方はトピックブランチに限らないので、上記の機能に加え、衝突時以外いつでも他のブランチへ切り換えられるようになっています。

インストールと設定

インストールはauto-install.elで一発です。


M-x install-elisp-from-emacswiki git-dwim.el

.emacsには次のように書いておきましょう。 元々C-x v bは別のバージョン管理システムに切り換えるコマンドですが、滅多に使わないので潰しています。


(require 'git-dwim)
(global-set-key "\C-xvb" 'git-branch-next-action)

内部でgrepとcutコマンドも使っています。 Unix系OSならば入っているので問題ありません。*1

使い方

C-x v bだけで基本的なブランチのワークフローはまかなえるようになっています。 ミニバッファに以下のような選択肢が出てくるので、頭文字をタイプすれば該当アクションを実行します。


[s]witch-to-other-branch [m]erge-to-master
  • 現在のブランチがmasterのとき
    • s :: 他のブランチへ切り換える
    • c :: 新しいブランチを切り、切り換える
  • 現在のブランチがmaster以外のとき
    • s :: 他のブランチへ切り換える
    • m :: masterへマージする
  • マージ時に衝突が生じたときはマージを続行する

master以外のブランチでC-x v b mを押すとmasterへマージします。 衝突が生じたとき、その旨を示すバッファを表示して教えてくれます。 衝突を解決し、再びC-x v bを押すとマージを続行します。

http://www.rubyist.net/~rubikitch/archive/git-dwim-conflict.png

将来の展望

git-dwim.elは拡張予定です。 ブランチに限定しているならば、git-branch.elという名前にしたことでしょう。 他にもEmacsに教えたいワークフローがあれば、随時追加していきます。

*1:コードの簡潔性を保つために、依存を取り除く予定はありません。あしからず。