Belajar Emacs - Version Control dengan Magit
Episode 15 of 30

Belajar Emacs - Version Control dengan Magit

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.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

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.

Install & Buka Status

Install Magit di init.el
(use-package magit
  :ensure t
  :defer t)

Buka repositori git lalu panggil status:

text
C-x g  →  magit-status  (di dalam repositori git)

Buffer *magit: <repo>* menampilkan seluruh state git dalam satu layar:

text
  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 git

Staging: Tekan s

Magit menggunakan tekstual, bukan menu: setiap aksi adalah satu tombol.

text
s  →  stage item (masukkan ke staging area)
u  →  unstage item
TAB  →  buka detail diff file
SPC  →  preview diff di window lain

Letakkan 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):

text
TAB   →  buka diff file
(s pada hunk)  →  stage hanya hunk itu

Ini fitur yang paling sering membuat orang takjub: staging sebagian per bagian perubahan, tanpa git add -p.

Commit: c c

text
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 gs (stage) → c c → tulis pesan → C-c C-c. Semua tanpa keluar Emacs.

text
c a  →  commit amend (perbaiki commit terakhir)
c e  →  extend: gabung perubahan ke commit terakhir
c w  →  edit pesan commit terakhir

Branch & Checkout

text
b b  →  checkout branch / buat branch baru
b n  →  buat branch baru dari posisi sekarang
b c  →  checkout branch
b r  →  rename branch

Pindah branch, lihat log, dan staging berjalan mulus — buffer status selalu memperlihatkan lokasi sekarang.

Log & Inspect

text
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 commit

Di log, tekan RET pada sebuah commit untuk melihat diff lengkapnya; n/p berpindah commit. Ini cara terbaik meninjau riwayat kode.

Push & Pull

text
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 rebase

Magit memberi preview aksi: menekan P p menunjukkan perintah git yang akan dijalankan sebelum eksekusi — transparansi yang tidak dimiliki git push di terminal.

Rebase Interaktif: r i

text
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:

text
r i HEAD~5 RET    →  rebase 5 commit terakhir
(edit todo di buffer, C-c C-c untuk mulai)

Resolve Konflik dengan Ediff

Konflik merge adalah momen paling menegangkan di git. Magit menangani dengan Ediff:

text
Setelah konflik: magit-status → file bermasalah terlihat "Unmerged"
e  →  pada file konflik → ediff-merge

Ediff menampilkan tiga panel: file milik kalian (A), file mereka (B), hasil merge (C). Shortcut:

text
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.

Sinkronisasi Workflow Git CLI → Magit

Tabel pemetaan cepat:

Git CLIMagit
git statusC-x g
git add files
git commit -mc c + pesan + C-c C-c
git checkout -bb b
git logl l
git rebase -ir i
git pushP p
git pull --rebaseF u
git mergetoole (ediff)

Pitfall Magit

  • Buffer status tidak auto-refresh: setelah operasi git di luar Emacs (misal 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.
  • Jangan menutup buffer commit dengan C-x 0: gunakan C-c C-c untuk commit, C-c C-k untuk membatalkan.
  • Push force: Magit P f memaksa push — pastikan kalian benar-benar paham konsekuensinya (contohnya setelah rebase dengan kolaborator).

Penutup

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.
  • Konflik diselesaikan dengan Ediff (e): n/p, a/b, ! massal.
  • Semua aksi menampilkan perintah git yang akan dijalankan — transparan sampai ke command line.

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!

Belajar Emacs - Version Control dengan Magit | Belajar Emacs