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 reverttanpa 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:
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:
[main (root-commit) e475a1d] Commit awal situs dokumentasi
2 files changed, 7 insertions(+)
create mode 100644 README.md
create mode 100644 glosarium.mdLalu 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:
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 statusOutput yang Dihasilkan:
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:
git add README.md
git statusOutput yang Dihasilkan:
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.mdDaftar Changes to be committed hanya berisi README.md — persis isi commit yang akan dibuat. Commitnya langsung jujur pada satu topik:
git commit -m "Perbarui pengantar halaman utama"Output yang Dihasilkan:
[main 2da131e] Perbarui pengantar halaman utama
1 file changed, 1 insertion(+)Setelah commit pertama, pekerjaan kedua masih utuh menunggu — tidak ikut terbawa:
git statusOutput yang Dihasilkan:
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:
git add glosarium.md
git commit -m "Tambah istilah staging pada glosarium"Output yang Dihasilkan:
[main 72176f2] Tambah istilah staging pada glosarium
1 file changed, 2 insertions(+)git statusOutput yang Dihasilkan:
On branch main
nothing to commit, working tree cleanRiwayat yang Dihasilkan #
Dua commit terpisah kini terbaca sebagai dua langkah yang masing-masing jelas:
git log --onelineOutput yang Dihasilkan:
72176f2 Tambah istilah staging pada glosarium
2da131e Perbarui pengantar halaman utama
e475a1d Commit awal situs dokumentasiBukti bahwa keduanya tidak saling mencampur dapat dilihat dengan menambahkan --stat pada git log --oneline:
git log --oneline --statOutput yang Dihasilkan:
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 committedpadagit statusadalah 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 .