Menguasai git sepenuhnya dari dalam Emacs dengan Magit: status buffer transparan, staging dengan s, commit dengan c c, branching dengan b, rebase interaktif dengan r i, push/pull dengan P, serta resolve konflik yang nyaman dengan ediff tanpa harus berpindah ke terminal.

Jika ada satu paket yang paling sering disebut sebagai alasan utama orang berpindah ke Emacs, itu adalah Magit — antarmuka git yang berjalan di dalam Emacs. Banyak yang menyebutnya "tidak ada alasan untuk tidak mencoba Magit", bahkan dari kalangan pengguna Vim sekalipun.
Mengapa ini penting? Karena git adalah sistem yang stateful: staging area, working tree, index, remotes. Di terminal, state ini tersembunyi di balik perintah yang bisa salah urut. Magit menampilkan semua state secara visual, sehingga apa yang sedang terjadi — sebelum dan sesudah — selalu transparan. Episode ini mengubah cara kalian berinteraksi dengan git selamanya.
(use-package magit
:ensure t
:defer t)Buka repositori git lalu panggil status:
C-x g → magit-status (di dalam repositori git)Buffer *magit: <repo>* menampilkan seluruh state git dalam satu layar:
Local: main # Hash Buku tutorial
Remote: origin (https://github.com/budi/proyek.git)
Branch: 2 commits ahead of origin/main
Unstaged changes (1)
M src/app.py ← file berubah, belum di-stage
Untracked files (1)
U docs/roadmap.md ← file baru, belum dikenal gitMagit menggunakan tekstual, bukan menu: setiap aksi adalah satu tombol.
s → stage item (masukkan ke staging area)
u → unstage item
TAB → buka detail diff file
SPC → preview diff di window lainLetakkan kursor di baris file, tekan s — file pindah dari "Unstaged" ke "Staged". Tekan TAB untuk melihat diff secara inline; tekan s pada baris tertentu dalam diff untuk stage sebagian file (hunk-level staging):
TAB → buka diff file
(s pada hunk) → stage hanya hunk ituIni fitur yang paling sering membuat orang takjub: staging sebagian per bagian perubahan, tanpa git add -p.
c c → magit-commit (tulis pesan, C-c C-c untuk commit)Magit membuka buffer edit pesan commit dengan template (branch, diff summary). Siklus kerja: edit → C-x g → s (stage) → c c → tulis pesan → C-c C-c. Semua tanpa keluar Emacs.
c a → commit amend (perbaiki commit terakhir)
c e → extend: gabung perubahan ke commit terakhir
c w → edit pesan commit terakhirb b → checkout branch / buat branch baru
b n → buat branch baru dari posisi sekarang
b c → checkout branch
b r → rename branchPindah branch, lihat log, dan staging berjalan mulus — buffer status selalu memperlihatkan lokasi sekarang.
l l → log semua branch (l l)
l o → log hanya commit current branch
l r → log range (dua ref)
l p → log oleh penulis (paged)
RET → pada commit: buka detail commitDi log, tekan RET pada sebuah commit untuk melihat diff lengkapnya; n/p berpindah commit. Ini cara terbaik meninjau riwayat kode.
P p → push (ke upstream)
P u → push -u (set upstream + push)
P P → push all branches
F p → pull (fetch + merge)
F u → pull rebaseMagit memberi preview aksi: menekan P p menunjukkan perintah git yang akan dijalankan sebelum eksekusi — transparansi yang tidak dimiliki git push di terminal.
r i → interactive rebase (pilih range)Magit membuka buffer todo rebase — edit baris commit: p (pick), s (squash), r (reword), e (edit). Ini menulis file rebase-todo git langsung, tapi dengan konfirmasi visual:
r i HEAD~5 RET → rebase 5 commit terakhir
(edit todo di buffer, C-c C-c untuk mulai)Konflik merge adalah momen paling menegangkan di git. Magit menangani dengan Ediff:
Setelah konflik: magit-status → file bermasalah terlihat "Unmerged"
e → pada file konflik → ediff-mergeEdiff menampilkan tiga panel: file milik kalian (A), file mereka (B), hasil merge (C). Shortcut:
n / p → next/previous conflict region
a → pakai versi A
b → pakai versi B
SPC → gabungkan manual
! → otomatis untuk semua region (semua a atau b)Selesai: C-c C-c menyimpan hasil merge. Konflik yang tadinya menakutkan menjadi proses yang terarah.
Warning
Sebelum menekan ! di ediff (apply ke semua region), pastikan pola konfliknya konsisten — jangan sampai seluruh konflik terisi dari satu sisi secara membabi buta. Untuk repo besar, lihat dulu 2-3 region pertama.
Tabel pemetaan cepat:
| Git CLI | Magit |
|---|---|
git status | C-x g |
git add file | s |
git commit -m | c c + pesan + C-c C-c |
git checkout -b | b b |
git log | l l |
git rebase -i | r i |
git push | P p |
git pull --rebase | F u |
git mergetool | e (ediff) |
git pull di terminal), tekan g di buffer Magit untuk refresh.s di tempat yang salah: stage di Magit bergantung pada posisi kursor — stage file saat kursor di baris nama file, stage hunk saat kursor di dalam diff. Kalau yang ter-stage bukan yang diinginkan, u untuk unstage.C-x 0: gunakan C-c C-c untuk commit, C-c C-k untuk membatalkan.P f memaksa push — pastikan kalian benar-benar paham konsekuensinya (contohnya setelah rebase dengan kolaborator).Pada episode 15 ini, kalian telah menguasai git sepenuhnya dari dalam Emacs.
Inti yang harus dibawa pulang:
C-x g membuka status — peta lengkap repositori kalian.s/u staging, c c commit, b b branch, P p push, F u pull rebase.r i rebase interaktif dengan editor todo visual.e): n/p, a/b, ! massal.Di episode 16 selanjutnya, kita mengubah Emacs menjadi IDE: Eglot (LSP) dengan language server (pyright, clangd, typescript-language-server) untuk completion, jump-to-definition, dan diagnostics, plus tree-sitter untuk syntax highlighting yang akurat. Sampai jumpa di episode 16!