Menelusuri tiga fase dengan satu berkas memang lancar, tetapi realitas kerja jarang semudah itu: suntingan untuk dua pekerjaan berbeda sering selesai pada waktu yang sama. Kita bisa saja memasukkan semuanya ke satu commit — dan pesannya terpaksa dibaca seperti daftar belanja. Praktik yang lebih sehat disepakati luas di komunitas Git: atomic commit, satu commit yang memuat satu perubahan dengan satu maksud. Kunci teknisnya sederhana — git add diberi nama berkas secara eksplisit, sehingga isi keranjang (dan akhirnya isi commit) benar-benar terkendali. Chapter ini membuktikan pola tersebut dengan dua perubahan beda topik yang dijadikan dua commit terpisah, lalu merangkum kebiasaan praktik baik di sekelilingnya.

Satu Commit, Satu Maksud #

Argumentasi mengapa staging selektif penting sudah kita bangun pada chapter Staging Area ; di sini kita fokus pada penerapannya. Manfaat atomic commit terasa nyata pada tiga situasi:

  • Pesan yang jujur — subjek commit dapat mendeskripsikan seluruh isinya tanpa kata “dan”, dan panduan menulisnya dibahas pada chapter Menulis Commit Message .
  • Peninjauan yang cepat — rekan tim yang membaca perbedaan satu commit meninjau satu topik sekaligus, bukan campuran.
  • Pembatalan yang selektif — satu commit dapat dibatalkan sendirian lewat git revert tanpa menyeret perubahan lain, dibahas pada chapter revert .

Alat kerjanya adalah git add dengan nama berkas sebagai argumen — perilaku dasarnya terdokumentasi pada dokumentasi git add .

Demo: Dua Topik, Dua Commit #

Kita siapkan repository latihan dengan dua berkas yang sudah tercatat pada commit awal:

bash
mkdir latihan-atomik && cd latihan-atomik
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Situs Dokumentasi\n\nKumpulan catatan teknis tim.\n' > README.md
printf '## Glosarium\n\n- commit: catatan satu keadaan proyek\n- repository: wadah riwayat beserta berkasnya\n' > glosarium.md
git add README.md glosarium.md
git commit -m "Commit awal situs dokumentasi"

Output yang Dihasilkan:

text
[main (root-commit) e475a1d] Commit awal situs dokumentasi
 2 files changed, 7 insertions(+)
 create mode 100644 README.md
 create mode 100644 glosarium.md

Lalu dua pekerjaan berbeda selesai hampir bersamaan: memperbarui kalimat pengantar di README.md, dan menambah dua istilah baru di glosarium.md. Kedua suntingan sama-sama belum di-stage:

bash
printf '# Situs Dokumentasi\n\nKumpulan catatan teknis tim.\nKini dilengkapi panduan kontributor singkat.\n' > README.md
printf '## Glosarium\n\n- commit: catatan satu keadaan proyek\n- repository: wadah riwayat beserta berkasnya\n- staging area: keranjang perubahan terpilih\n- working tree: salinan berkas yang sedang disunting\n' > glosarium.md
git status

Output yang Dihasilkan:

text
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   README.md
	modified:   glosarium.md

no changes added to commit (use "git add" and/or "git commit -a")

Commit Pertama: Topik Halaman Utama #

Keranjang diisi hanya dengan berkas milik topik pertama:

bash
git add README.md
git status

Output yang Dihasilkan:

text
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   README.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   glosarium.md

Daftar Changes to be committed hanya berisi README.md — persis isi commit yang akan dibuat. Commitnya langsung jujur pada satu topik:

bash
git commit -m "Perbarui pengantar halaman utama"

Output yang Dihasilkan:

text
[main 2da131e] Perbarui pengantar halaman utama
 1 file changed, 1 insertion(+)

Setelah commit pertama, pekerjaan kedua masih utuh menunggu — tidak ikut terbawa:

bash
git status

Output yang Dihasilkan:

text
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   glosarium.md

no changes added to commit (use "git add" and/or "git commit -a")

Commit Kedua: Topik Glosarium #

Sisa suntingan diangkat ke keranjang lalu dicatat:

bash
git add glosarium.md
git commit -m "Tambah istilah staging pada glosarium"

Output yang Dihasilkan:

text
[main 72176f2] Tambah istilah staging pada glosarium
 1 file changed, 2 insertions(+)
bash
git status

Output yang Dihasilkan:

text
On branch main
nothing to commit, working tree clean

Riwayat yang Dihasilkan #

Dua commit terpisah kini terbaca sebagai dua langkah yang masing-masing jelas:

bash
git log --oneline

Output yang Dihasilkan:

text
72176f2 Tambah istilah staging pada glosarium
2da131e Perbarui pengantar halaman utama
e475a1d Commit awal situs dokumentasi

Bukti bahwa keduanya tidak saling mencampur dapat dilihat dengan menambahkan --stat pada git log --oneline:

bash
git log --oneline --stat

Output yang Dihasilkan:

text
72176f2 Tambah istilah staging pada glosarium
 glosarium.md | 2 ++
 1 file changed, 2 insertions(+)
2da131e Perbarui pengantar halaman utama
 README.md | 1 +
 1 file changed, 1 insertion(+)
e475a1d Commit awal situs dokumentasi
 README.md    | 3 +++
 glosarium.md | 4 ++++
 2 files changed, 7 insertions(+)

Setiap commit menyentuh tepat satu berkas milik topiknya. Hash pada keluaran dihitung dari isi dan waktu commit, jadi nilainya berbeda di komputer pembaca.

Menambahkan Beberapa Berkas Sekaligus #

Staging selektif tidak berarti harus satu berkas per perintah. git add menerima beberapa nama sekaligus (git add README.md glosarium.md) dan nama folder untuk menaikkan seluruh isi folder tersebut. Bentuk terluas git add . menaikkan semua berkas di direktori saat ini — praktis saat memang berniat mencatat semuanya, tetapi meniadakan kurasi; gunakan dengan disiplin. Ragam bentuk git add beserta perilakunya terhadap folder dan berkas baru dibahas tuntas pada chapter git add .

Kebiasaan di Sekitar Atomic Commit #

Tiga kebiasaan kecil menjaga pola ini tetap hidup dalam kerja harian:

  • Baca keranjang sebelum commit — daftar Changes to be committed pada git status adalah kesempatan terakhir menangkap berkas yang salah ikut sebelum ia permanen di riwayat.
  • Pisahkan kembali bila terlanjur — berkas yang salah masuk keranjang dikeluarkan tanpa kehilangan suntingannya lewat git restore --staged, topik chapter Membatalkan Staging .
  • Tunda bila belum utuh — suntingan setengah jadi yang tidak ingin ikut cukup dibiarkan di working tree; commit hanya membaca isi index, seperti dibuktikan pada chapter Modified, Staged, dan Committed .

Membuang nama berkas satu per satu menuntaskan pemisahan topik yang kebetulan berada di berkas berbeda. Pertanyaan tinggal satu: bagaimana bila dua topik justru hidup dalam satu berkas yang sama? Git punya mode khusus untuk itu — memilih per potongan perubahan. Lanjut ke Staging Sebagian Perubahan .