はじめに
- Emacs Advent Calendar 2025をLLM(Claude Code)を使って埋めるのはいかがなものかと思いつつ、記事が出ることに布教上の意味があるのではと、崇高な使命感を持って書いてます
- もはやgitコマンドを覚えておらず、VS Codeではどうするの?と聞かれてもわからなくて、エンジニア初心者をフォローできなくなっています
VC, Magitとは
VCはEmacs上のバージョンコントロールシステムで、Magitは、Gitのインターフェースです。It's Magit !!! です(tigは近いのかな?)。
つまり:
- そもそもEmacsはvcをベースとしてファイル単体の版管理機能があり、
- その拡張としてmagitはディレクトリも含めて透過的に構成管理ができるので、
- gitのコマンドを覚えなくてよい(逆に忘れる)
うーん、説明が難しい。
基本設定
(package-install 'magit)
;; 基本的なキーバインド
(global-set-key (kbd "C-x g") 'magit-status)
(global-set-key (kbd "C-x G") 'magit-blame)
(global-set-key (kbd "C-x v M") 'magit-dispatch)
(global-set-key (kbd "C-x v c") 'magit-clone)
;; clone時にpushDefaultを自動設定
(setq magit-clone-set-remote.pushDefault t)
;; シンボリックリンクを自動で追跡
(setq vc-follow-symlinks t)
VCはほぼデフォルトで、C-x gでmagit-statusを起動します。
補助パッケージ
git-link
(package-install 'git-link)
(global-set-key (kbd "C-x v U") 'git-link)
現在のファイル・行をGitHub/GitLabなどのURLとして取得できてちょっと便利。
git-gutter
(package-install 'git-gutter)
(when window-system
(package-install 'git-gutter-fringe)
(require 'git-gutter-fringe)
(set-face-foreground 'git-gutter-fr:modified "LemonChiffon3")
(set-face-foreground 'git-gutter-fr:added "SkyBlue1")
(set-face-foreground 'git-gutter-fr:deleted "firebrick1")
(set-face-background 'git-gutter-fr:modified "LemonChiffon3")
(set-face-background 'git-gutter-fr:added "SkyBlue1")
(set-face-background 'git-gutter-fr:deleted "firebrick1")
(global-git-gutter-mode t))
(global-set-key (kbd "C-x v p") 'git-gutter:previous-hunk)
(global-set-key (kbd "C-x v n") 'git-gutter:next-hunk)
(global-set-key (kbd "C-x v s") 'git-gutter:stage-hunk)
(global-set-key (kbd "C-x v r") 'git-gutter:revert-hunk)
これも神パッケージ。色がついいる場所の差分確認や、選択した箇所のステージ、消したところを元に戻すなどをファイル編集中に操作できます。
treemacs-magit
(package-install 'treemacs-magit)
treemacsとmagitを連携させられるらしいが、恩恵を感じたことはない
magit-todos
;; (package-install 'magit-todos)
;; (magit-todos-mode 1)
リポジトリ内のTODO:コメントをmagit-statusに表示するパッケージですが、最近はうるさくなって使ってません
単体ファイルの編集
- ファイルを編集します
-
C-x v vでコミットメッセージをつくり、 -
C-c C-cでコミットします -
C-x v Pでプッシュします - あ、やっぱ今のなしと思ったら修正したあと、
-
C-x v vC-c C-eで コミット修正(Extend, Amend)し、 -
C-u C-x v P -f ENTERで流れるようにフォースプッシュします
区切りのよいところに中断なく履歴管理がされるのが、当たり前すぎて他の方法が意味不明だと思っています(実際に単体ファイルを編集し続けることはあまりないですが
)
複数ファイルの編集
- どの作業ブランチにいるか
- どのファイルが編集中か
- どのリモートブランチと差異があるか
が表示され、
-
ステージング(保存候補選択): ファイル選択して
sでstage、uでunstage → ファイル単位ではなく修正部分を選べる -
コミット(ローカル保存): ステージングされたファイルを
c cでコミット、c eでコミット上書き追加(Etend)、c aでコミット修正(amend)、c wでコミエットメッセージ編集(Reword) -
フェッチ/マージ(リモートと連携1):
f uでフェッチ、m mでマージ -
プッシュ/プル(リモートと連携2):
P pでpush、F pでpullP -f pでフォースプッシュ -
ブランチ操作:
yでブランチ一覧表示、b bでブランチ切り替え、b cで新規作成 -
ワークツリー操作:
Z gでワークツリー切り替え、Z cで新規作成 -
ログ表示:
l lでログ表示 -
差分表示:
ediff差分表示、TABで差分の展開/折りたたみ -
スタッシュ(一時退避) :
z z保管、z pポップ適用 -
リベース(履歴改変):
r iでインタラクティブrebaser e origin/mainでmainでリベース
- 「あ、今のちょっとなし」
ファイル選択 s c e(Extend)なんか多分コミット操作の10倍ぐらいやってます - 「このファイルのこの行とこのファイルのこの行だけコミット」
ステータス画面で範囲選択 s c cも直感的かつ気軽できます - リベース中等に画面が切り変っても、慌てず操作途中のワークスペースであることが腹落ちできてるかが初心者と中級者の境目だと思っています
最近はAI時代な分ワークツリー間の移動も快適で、最小限のショートカットキーによって全てのファイルがEmacs内で展開され、流れるような作業、条件反射的な操作性が!とうまく説明したいですが、難しいですね。。。
まとめ
vcなんかはそもそもCVSというかバージョン管理が抽象化されたライブラリであり、svnも同じように使っていた昔から、git時代がきたところの2010年ぐらい(もう15年前か)にmagitの噂は聞きつつも最初は懐疑的だったんですが(やっぱ漢はコマンドライン)、我慢して使い始めてみると、その洗練された操作性に大興奮(感動)してました。
ということで、興味を持った方はぜひ試してみてください
。
あと本当に正直、Emacs+magitを越える環境があったら教えてください (いや、ないことはわかっていますが)
