2023年4月17日
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](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/e6b41a58-1c6b-4102-b0f3-2dc4f8944afd/magit-status.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T031759Z&X-Amz-Expires=3600&X-Amz-Signature=0b351676f2bab6670723342e8ad716d5440fd5c8a1385bdd23a67b99dcc94d50&X-Amz-SignedHeaders=host&x-id=GetObject)
このバッファでは、magitのあらゆるショートカットキーが機能します。
どのコマンドがどれに紐づいているかを暗記するのは大変なので、1つだけ覚えておきましょう。
h
をタイプするとmagitのヘルプが開きます。![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/4843472f-60f1-4e87-bed6-be358f7d7c2a/help.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T031759Z&X-Amz-Expires=3600&X-Amz-Signature=e92ad7205d9720bc4bde64092b26897de6debef2fb03283edaad04b287a0817a&X-Amz-SignedHeaders=host&x-id=GetObject)
青く強調表示されたキーをタイプすると、gitの目的の操作へ移動していきます。
ステージへ上げる、下ろす
最初に作成した、
index.html
をステージに上げます。
magitのバッファで、カーソルをindex.html
に合わせて、s
とタイプするとステージされます。![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/2e678846-f514-4d9f-ad76-bf2d1683119e/stage.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T031759Z&X-Amz-Expires=3600&X-Amz-Signature=86ec9f1836f1dcd3b42eb930fc05a3758d442c36350c0544947e85f393c013bf&X-Amz-SignedHeaders=host&x-id=GetObject)
逆に、ステージから下ろす場合は、同じく
index.html
にカーソルを当てて、u
とタイプします。![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/889d9efb-e50f-4640-b390-c02140683d60/unstage.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T031759Z&X-Amz-Expires=3600&X-Amz-Signature=2148555a8873310e009281f4ce8f4e05c54fd8dfb721dc2344213a967db2734d&X-Amz-SignedHeaders=host&x-id=GetObject)
コミットする
ステージに上げた差分をコミットします。
c
とタイプするとこのようなコミット操作へのウィンドウが表示されます。![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/d82d34e0-291f-485b-81f9-85b79206561e/tocommit.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T031759Z&X-Amz-Expires=3600&X-Amz-Signature=fa771546bd44f3f2e2a2e657dba6820894eec06641a485512cc50607584c182d&X-Amz-SignedHeaders=host&x-id=GetObject)
上の画像を見ると、
c
がコミットへ進むキーになることがわかります。そのままc
をタイプすると、コミットログのバッファと差分が表示されます。![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/949d2e87-9294-42ad-ba45-0931e39222a2/firstcommit.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T031759Z&X-Amz-Expires=3600&X-Amz-Signature=b549310cc2d342d30ecb533f706f1a2288436b97090689772499c9135162bd39&X-Amz-SignedHeaders=host&x-id=GetObject)
コミットログバッファに
first commit
と入力し、これがコミットメッセージになります。コミットを確定するには
C-c C-c
を入力します。
magitを利用したコミットができました。リモートを追加
Githubのリモートを追加します。
"C-x g" magit-status)
でmagitバッファを開いて、とりあえずh
でヘルプを見ます。![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/4843472f-60f1-4e87-bed6-be358f7d7c2a/help.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T031759Z&X-Amz-Expires=3600&X-Amz-Signature=e92ad7205d9720bc4bde64092b26897de6debef2fb03283edaad04b287a0817a&X-Amz-SignedHeaders=host&x-id=GetObject)
リモート関連は
M
とあるので、それをタイプします。
リモートを加えるはAdd
なのでa
をタイプします。![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/09175e0d-d18f-418c-9fd9-b5d64a3801e4/add.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T031759Z&X-Amz-Expires=3600&X-Amz-Signature=1004d62a1bf232bb1800b8eb45a9bab754889b351f17c2d6226b657d2b542418&X-Amz-SignedHeaders=host&x-id=GetObject)
エコーエリアに
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](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/4843472f-60f1-4e87-bed6-be358f7d7c2a/help.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T031759Z&X-Amz-Expires=3600&X-Amz-Signature=e92ad7205d9720bc4bde64092b26897de6debef2fb03283edaad04b287a0817a&X-Amz-SignedHeaders=host&x-id=GetObject)
Push関連は
P
なのでそれをタイプします。今の設定ではorigin/main
がリモート先です。そこに向けてプッシュしたいのでp
をタイプします。![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/af3b2ec5-2fbc-4987-95b4-16eb4aa0db5a/push.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T031759Z&X-Amz-Expires=3600&X-Amz-Signature=96492cd3b646c3a972cbb124c06f3bcaceb71bb451c5bae9c156380b21f7ce97&X-Amz-SignedHeaders=host&x-id=GetObject)
エコーエリアに
Git finished
が表示されればプッシュが成功しています。Gitログを表示
"C-x g" magit-status)
でmagitバッファを開いて、h
でヘルプを見ます。![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/4843472f-60f1-4e87-bed6-be358f7d7c2a/help.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T031801Z&X-Amz-Expires=3600&X-Amz-Signature=88214810a358d9f59f2c78143a53a7ad051a4889d60b8ff64f045a4820f90f8e&X-Amz-SignedHeaders=host&x-id=GetObject)
ログ表示は
l
でそれをタイプします。次のウィンドウではいくつかのログの表示オプションが提示されます。一番無難なのはローカルのブランチも、リモートのブランチも表示するb
です。リモートの表示が不必要な場合はl
がおすすめです。ここではリモートもチェックしたいのでb
をタイプします。![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/d878a0e5-3369-492a-8fb7-d6fb8420cd63/log.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T031800Z&X-Amz-Expires=3600&X-Amz-Signature=90fbbf1a870580fa703f18e1ae48214b1ebaade2e25406356dfea5621c892383&X-Amz-SignedHeaders=host&x-id=GetObject)
このようにログが表示されます。
![article image](https://prod-files-secure.s3.us-west-2.amazonaws.com/a3d79190-572a-4604-a045-8b27c534a5b2/49aa2c17-ddf3-4bf5-add7-9fee2c27dcd6/tree.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45HZZMZUHI%2F20240727%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20240727T031801Z&X-Amz-Expires=3600&X-Amz-Signature=8e2b84deacafbc5096cfd356dea154c0f9e5fb2c90cc8070d5cc49a7982d8b4b&X-Amz-SignedHeaders=host&x-id=GetObject)
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](/prof.jpg)
Ted
大学でコンセンサスアルゴリズムを研究。卒業後ベンチャー企業に入社してフルスタックでWebサービスを開発。現在は大手IT企業に転職し、プログラミングを行っている。AIにプログラマーの仕事を奪って欲しいと願っている。