Emacsの最強GitクライアントMagitの使い方

2023年4月17日
thumbnail
magitはEmacsのgitクライアントのデファクトスタンダードです。CUIインターフェースにもかかわらず、GUIのgitクライアントに負けないすごい機能を持ち合わせています。
magitの使い方はそれこそ膨大すぎて、全て説明しようとすると1冊本が書けてしまいます。
英語ですが、emacsdocsにmagit専用のドキュメントページがあるので、ここで紹介する以上の情報が欲しい方はそちらを参考にしてください。
こちらが完成したmagitの設定コードです。
(use-package magit
  :ensure t
  :bind (("C-x g" . magit-status)
         ("C-x M-g" . magit-dispatch-popup))
  :config
  (defun mu-magit-kill-buffers ()
    "Restore window configuration and kill all Magit buffers."
    (interactive)
    (let ((buffers (magit-mode-get-buffers)))
      (magit-restore-window-configuration)
      (mapc #'kill-buffer buffers)))
  (bind-key "q" #'mu-magit-kill-buffers magit-status-mode-map))

リポジトリの初期化

説明ように適当なリポジトリを作成して、githubにも登録してみます。
mkdir html
cd html
touch index.html
git init
index.htmlにhtml 5の側だけ用意します。
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8"/>
    <title>Document</title>
  </head>
  <body></body>
</html>

githubリポジトリの作成

githubにテスト用のプライベートリポジトリを作ります。 リポジトリ名はなんでも良いのでgit-test-repoとかにします。
Githubに表示されている、こんな感じのリモートの名前は後で使うので、コピっておいてください。
[email protected]:yourname/git-test-repo.git

magitの使い方

magitはデフォルトでキーバインドされているコマンドは2つしかありません。 "C-x g" magit-status)("C-x M-g" magit-dispatch-popup)です。 magitは他のemacsパッケージとは違って、どちらかというとEmacsというOSを使ってgitのクライアントを動かしているイメージです。magitを使ったgitの操作もEmacsで対話的にやるよりかはMagitクライアントの中で操作します。
magitを起動するコマンドは"C-x g" magit-status)です。最初はそれを実行してみましょう。 とてもシンプルなウィンドウが表示されます。
article image
このバッファでは、magitのあらゆるショートカットキーが機能します。 どのコマンドがどれに紐づいているかを暗記するのは大変なので、1つだけ覚えておきましょう。 hをタイプするとmagitのヘルプが開きます。
article image
青く強調表示されたキーをタイプすると、gitの目的の操作へ移動していきます。

ステージへ上げる、下ろす

最初に作成した、index.htmlをステージに上げます。 magitのバッファで、カーソルをindex.htmlに合わせて、sとタイプするとステージされます。
article image
逆に、ステージから下ろす場合は、同じくindex.htmlにカーソルを当てて、uとタイプします。
article image

コミットする

ステージに上げた差分をコミットします。 cとタイプするとこのようなコミット操作へのウィンドウが表示されます。
article image
上の画像を見ると、cがコミットへ進むキーになることがわかります。そのままcをタイプすると、コミットログのバッファと差分が表示されます。
article image
コミットログバッファにfirst commitと入力し、これがコミットメッセージになります。
コミットを確定するにはC-c C-cを入力します。 magitを利用したコミットができました。

リモートを追加

Githubのリモートを追加します。 "C-x g" magit-status)でmagitバッファを開いて、とりあえずhでヘルプを見ます。
article image
リモート関連はMとあるので、それをタイプします。 リモートを加えるはAddなのでaをタイプします。
article image
エコーエリアにRemote name:が表示されるので、originとタイプしてエンターを押します。 Remote url:と出るので、上の方でコピーした[email protected]:yourname/git-test-repo.gitみたいなものを貼り付けてエンターを押します。詳しくは自分で作成したGithubのリポジトリページをみてください。 Set remote.pushDefault' to "origin"? (y or n)はデフォルトのプッシュ先として設定して良いかを聞かれるので、yをタイプする。
これでリモート設定が完了しました。

Gitプッシュする

"C-x g" magit-status)でmagitバッファを開いて、hでヘルプを見ます。
article image
Push関連はPなのでそれをタイプします。今の設定ではorigin/mainがリモート先です。そこに向けてプッシュしたいのでpをタイプします。
article image
エコーエリアにGit finishedが表示されればプッシュが成功しています。

Gitログを表示

"C-x g" magit-status)でmagitバッファを開いて、hでヘルプを見ます。
article image
ログ表示はlでそれをタイプします。次のウィンドウではいくつかのログの表示オプションが提示されます。一番無難なのはローカルのブランチも、リモートのブランチも表示するbです。リモートの表示が不必要な場合はlがおすすめです。ここではリモートもチェックしたいのでbをタイプします。
article image
このようにログが表示されます。
article image

magitの終了

Gitの操作が終わったら、magitアプリケーションを終了します。 magitはコミット操作が終わってもデフォルトでは3つのバッファを放置したままにします。
magit-process: html. %*-  171      Magit Process
magit-diff: html     %%-  169      Magit Diff
magit: html          %%-  233      Magit
そのままだと邪魔なので、mu-magit-kill-buffersでmagitを終了時に削除しています。 このコードはこちらの方を参考にさせてもらいました。
(defun mu-magit-kill-buffers ()
    "Restore window configuration and kill all Magit buffers."
    (interactive)
    (let ((buffers (magit-mode-get-buffers)))
      (magit-restore-window-configuration)
      (mapc #'kill-buffer buffers)))
  (bind-key "q" #'mu-magit-kill-buffers magit-status-mode-map)
magitのバッファでqをタイプし終了します。

その他の操作とまとめ

magitはここで紹介したもの以外でも、amend、rebase、pull、force pushなどにももちろん対応しています。 どうやって操作し良いかわからなくもてヘルプを開いて、そこから目的の操作までキーをタイプして挑戦してみてください。
profile image
Ted
大学でコンセンサスアルゴリズムを研究。卒業後ベンチャー企業に入社してフルスタックでWebサービスを開発。現在は大手IT企業に転職し、プログラミングを行っている。AIにプログラマーの仕事を奪って欲しいと願っている。