Emacs

magit v2.7 の操作メモ

 magit をバージョン2.7に更新したが、あまり日本語情報がなかった。そして、バージョン1と操作が違っているコマンドがあった。? で表示されるヒントだけではわかりにくかった部分、後で調べて発見した機能などを備忘録的にまとめる。バージョン2系といっても操作が微妙に違うので、あくまで 2.7 が対象。

branches

 旧バージョンでは b v で表示できたブランチ一覧は y になっていた。コマンド名が magit-references なので、見つけにくかった。適当なブランチにカーソルを合わせて RET を押すと、そのブランチをチェックアウトすることができる。

 ブランチ作成はビューの状態に関係なく b c RET で実行できる。b c で引数を指定すると、枝分かれする元のブランチを与えることができる。

log

 l l で現在のブランチのログを見ることができる。ブランチ一覧を表示している時 l o RET でカーソル上のブランチのログを見ることができる。 l o で引数を指定すると、任意のブランチのログを見ることができる。

diff

 magit-log を表示している時、RET または d d を押すと、カーソル上のコミットの変更点を見ることができる。ログを数行範囲指定し同じ操作をすると、マークされた範囲の変更点をまとめてみることができる。

 ブランチを比較するには y でブランチ一覧を表示した後、比較したいブランチにカーソルを合わせて d r RET でまとめて差分を見ることができる。

 特定のコミットの時点と現在の状態を比べるには、 d r で引数を選択する。たとえば5個前のコミットとの比較は d r HEAD~5.. で実行できる。もっと良い方法があるかもしれない。

 + を押すと diff の表示領域(hunk)を広くする。 - で逆に狭くする。 0 で初期状態に戻す。

rebase

 magit-log を表示している時、旧バージョンでは E で実行できた rebase -i は、 r i に変わっている。stage に変更があって rebase コマンドに失敗した時にはログが出ない。期待した反応が帰ってこないときは $ を押して git-process バッファを見たほうが良い。

push

 ローカルブランチと同じ名前のリモートブランチに push する場合は P p で実行できる。一度も push したことのないブランチを push するときは対象のリポジトリを選択する。普通は origin なので特に悩むこともなくすすめることができるはず。二回目以降は、origin を選択する必要はない。

 ローカルブランチと異なる名前のリモートブランチに push する場合は P u で実行できる。一度も push したことのないブランチを push するときは対象のブランチを選択する。二回目以降は選択する必要はない。

 P u で push する先のブランチを変更したい場合は b u で変更できる。変更後も magit-branch-popup が出たままなので C-g で消す。

cherry-pick

 cherry-pick は他のブランチのログを見ているとき、取り出したいコミットにカーソルを合わせて A A で実行する。コンフリクトが起きてしまった時は、修正後に A A で continue する。放棄したい場合は A a で abort する。

prune

 不要な tracking branch を全部削除するには f -p u を実行する。内部的には git fetch orgin --prune を実行する。

reset

 既にコミットした変更を取り下げたいときには X h のあと戻りたいコミットを引数で与える。1個戻りたい場合は HEAD^ を与えればよい。ブランチのマージを実行した後、マージ前に戻したい場合は HEAD^ORIG_HEAD にする。

 ファイルの変更箇所はそのままにしたい場合は X s ... で以下同じように実行する。

git sub command

 magit でどう実行したらよいかわからないコマンドは ! ! で直接実行できる。たとえば git version のようなコマンドを実行できる。

magit-status がウィンドウ分割するのをやめる

magit status がデフォルトではウィンドウを分割するのが使いにくい。これをやめる方法として、古いバージョンでは (setq magit-status-buffer-switch-function 'switch-to-buffer) で対処できたが v2 からは効かない。 新しいバージョンでは下記の方法でやる。下記のコードは magit Github Issues から引用。

(setq magit-display-buffer-function
      (lambda (buffer)
        (display-buffer
         buffer (if (and (derived-mode-p 'magit-mode)
                         (memq (with-current-buffer buffer major-mode)
                               '(magit-process-mode
                                 magit-revision-mode
                                 magit-diff-mode
                                 magit-stash-mode
                                 magit-status-mode)))
                    nil
                  '(display-buffer-same-window)))))


追記 (2017-11-22) @tkhsh-yt さんから、より簡潔な方法を教わりました。下記の一行で済ませることができます。

(setq magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1)

ただし、この方法の場合はすでに分割しているウィンドウがある場合他を消してしまう(C-x 1 と同じ)効果があるようです。

magit-fullscreen is gone · Issue #1953 · magit/magit

magit-commit 時に diff が開くのをやめる

commit するときにデフォルトで diff が開く。これが旧バージョンと動作が違ってありがためいわくなので、それを無効化する。下記のコードは magit Github Issues から引用

(remove-hook 'server-switch-hook 'magit-commit-diff)

magit のドキュメント にも下記のように書いてあるので間違いないはず。

To show no diff while committing remove magit-commit-diff from server-switch-hook.