Peralatannya sudah lengkap: git status memetakan keadaan, git diff membaca pekerjaan, git restore membersihkan, dan opsi-opsi diff menyaring derau. Peralatan hanya berarti jika dipakai pada saat yang tepat — dan saat itu bukan setelah commit terkirim, melainkan sesaat sebelum tombol commit ditekan. Sesi pemeriksaan pra-commit yang disiplin membutuh waktu satu-dua menit dan mencegah tiga kecelakaan klasik: baris debug yang ikut tercatat, berkas besar atau artefak build yang terselundup, dan commit yang mencampur dua topik berbeda. Chapter penutup section ini merangkai seluruh peralatan menjadi satu sesi nyata — lengkap dengan ketiga kecelakaan itu, tertangkap satu per satu.
Sesi Nyata: Menangkap Tiga Kecelakaan #
Repository latihan memuat dokumentasi proyek dan sebuah skrip build kecil — keduanya dicatat pada commit pertama:
mkdir latihan-pracommit && cd latihan-pracommit
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
cat > bangun.py <<'PYEOF'
# Bangun situs dokumentasi statis.
daftar_halaman = ["index", "glosarium", "panduan"]
for halaman in daftar_halaman:
print("memproses " + halaman)
PYEOF
git add README.md bangun.py
git commit -m "Commit awal situs dokumentasi"Kedua berkas tercatat dan git status menjawab nothing to commit, working tree clean. Pekerjaan dimulai: pengantar diperbarui dan bangun.py dikembangkan — termasuk satu baris print("DEBUG: ...") yang sengaja kita biarkan seolah lupa dihapus, karena tugas kita justru menangkapnya:
printf '# Situs Dokumentasi\n\nKumpulan catatan teknis tim internal.\n' > README.md
cat > bangun.py <<'PYEOF'
# Bangun situs dokumentasi statis.
import zipfile
daftar_halaman = ["index", "glosarium", "panduan", "tentang"]
for halaman in daftar_halaman:
print("memproses " + halaman)
print("DEBUG: total halaman", len(daftar_halaman))
arsip = zipfile.ZipFile("artikel-gambar.zip", "w")
arsip.writestr("index.html", "<h1>Situs Dokumentasi</h1>")
arsip.close()
PYEOF
python3 bangun.py
git status -sOutput yang Dihasilkan:
memproses index
memproses glosarium
memproses panduan
memproses tentang
DEBUG: total halaman 4
M README.md
M bangun.py
?? artikel-gambar.zipSesi pemeriksaan dimulai dari git status -s. Peta menunjukkan dua berkas tersunting plus satu berkas baru yang tidak direncanakan: artikel-gambar.zip, artefak yang dibuat oleh bangun.py barusan — keluaran proses build, bukan materi sumber. Beruntun penulisan .gitignore dari chapter Untracked dan Tracked Files
menyelesaikannya:
printf '*.zip\n' > .gitignore
git status -sOutput yang Dihasilkan:
M README.md
M bangun.py
?? .gitignoreArtefak hilang dari radar; artikel-gambar.zip akan terus diabaikan di sesi-sesi berikutnya.
git diff bangun.pyOutput yang Dihasilkan:
diff --git a/bangun.py b/bangun.py
index 2cb092d..874e705 100644
--- a/bangun.py
+++ b/bangun.py
@@ -1,5 +1,13 @@
# Bangun situs dokumentasi statis.
-daftar_halaman = ["index", "glosarium", "panduan"]
+import zipfile
+
+daftar_halaman = ["index", "glosarium", "panduan", "tentang"]
for halaman in daftar_halaman:
print("memproses " + halaman)
+
+print("DEBUG: total halaman", len(daftar_halaman))
+
+arsip = zipfile.ZipFile("artikel-gambar.zip", "w")
+arsip.writestr("index.html", "<h1>Situs Dokumentasi</h1>")
+arsip.close()Baris print("DEBUG: total halaman", ...) jelas bukan bagian dari fitur. Kita hapus baris itu, simpan berkasnya, lalu periksa ulang:
cat > bangun.py <<'PYEOF'
# Bangun situs dokumentasi statis.
import zipfile
daftar_halaman = ["index", "glosarium", "panduan", "tentang"]
for halaman in daftar_halaman:
print("memproses " + halaman)
arsip = zipfile.ZipFile("artikel-gambar.zip", "w")
arsip.writestr("index.html", "<h1>Situs Dokumentasi</h1>")
arsip.close()
PYEOF
git diff bangun.pyOutput yang Dihasilkan:
diff --git a/bangun.py b/bangun.py
index 2cb092d..817c831 100644
--- a/bangun.py
+++ b/bangun.py
@@ -1,5 +1,11 @@
# Bangun situs dokumentasi statis.
-daftar_halaman = ["index", "glosarium", "panduan"]
+import zipfile
+
+daftar_halaman = ["index", "glosarium", "panduan", "tentang"]
for halaman in daftar_halaman:
print("memproses " + halaman)
+
+arsip = zipfile.ZipFile("artikel-gambar.zip", "w")
+arsip.writestr("index.html", "<h1>Situs Dokumentasi</h1>")
+arsip.close()Baris DEBUG sudah tidak ada. Tahap staging menjadi aman — dan keputusan staging-nya sendiri perlu satu pertimbangan terakhir. Angkat seluruh pekerjaan ke keranjang lalu periksa isi keranjangnya:
git add README.md bangun.py .gitignore
git diff --staged --statOutput yang Dihasilkan:
.gitignore | 1 +
README.md | 2 +-
bangun.py | 8 +++++++-
3 files changed, 9 insertions(+), 2 deletions(-)Ringkasan ini memperlihatkan persoalan yang ketiga: keranjang memuat dua topik yang tidak berhubungan. Suntingan README.md adalah topik dokumentasi; bangun.py beserta .gitignore yang menyertainya adalah topik proses build. Satu commit yang memuat keduanya akan menyulitkan penelusuran di kemudian hari — pembahasan mendalam tentang alasan beserta dampaknya ada di chapter Menjaga Riwayat Commit
. Kita pisahkan dengan alat dari chapter Membatalkan Staging
:
git restore --staged README.md
git diff --staged --statOutput yang Dihasilkan:
.gitignore | 1 +
bangun.py | 8 +++++++-
2 files changed, 8 insertions(+), 1 deletion(-)Keranjang kini hanya memuat topik build. Satu commit pertama lahir:
git commit -m "Tambah halaman tentang dan abaikan arsip build"Output yang Dihasilkan:
[main 9f5e04a] Tambah halaman tentang dan abaikan arsip build
2 files changed, 8 insertions(+), 1 deletion(-)
create mode 100644 .gitignoreTopik kedua diangkat dan diperiksa dengan urutan yang sama, lalu dicatat sebagai commit tersendiri:
git add README.md
git diff --staged
git commit -m "Tegaskan cakupan catatan internal"Output yang Dihasilkan:
diff --git a/README.md b/README.md
index 5d6c796..cd254c4 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
# Situs Dokumentasi
-Kumpulan catatan teknis tim.
+Kumpulan catatan teknis tim internal.
[main 9126f1e] Tegaskan cakupan catatan internal
1 file changed, 1 insertion(+), 1 deletion(-)Hash 9f5e04a dan 9126f1e berbeda di mesin pembaca. Penutup sesi: keadaan akhir dipastikan bersih dan riwayat dibaca ulang:
git status
git log --onelineOutput yang Dihasilkan:
On branch main
nothing to commit, working tree clean
9126f1e Tegaskan cakupan catatan internal
9f5e04a Tambah halaman tentang dan abaikan arsip build
e5343e3 Commit awal situs dokumentasiChecklist Review Pra-Commit #
Sesi di atas dapat dipadatkan menjadi daftar periksa yang sama setiap kali commit akan dibuat:
- Peta keadaan —
git status -s: berkas apa saja yang berubah, dan apa yang tidak direncanakan muncul? - Berkas tak diundang — untracked yang bukan materi sumber (artefak, hasil unduhan, berkas besar) jangan diangkat ke keranjang; abaikan lewat
.gitignorebila berulang, dibahas tuntas di chapter gitignore . - Baris terlupakan —
git diffdangit diff --stageddibaca baris demi baris: baris debug, komentar sementara, dan perubahan yang bukan bagian topik. - Whitespace menyusup —
git diff --checkdangit diff --staged --checkmembereskannya dalam satu perintah, seperti dibahas pada chapter Whitespace dan Opsi Diff ; daftar pola yang diperiksa tercatat pada dokumentasi git diff . - Satu commit, satu topik — keranjang yang memuat dua topik dipisah dengan
git restore --stagedlalu di-commit berurutan. - Pesan siap — subjek singkat yang menjelaskan apa dan mengapa, dibahas pada chapter Menulis Commit Message .
Kebiasaan ini terasa lambat pada commit pertama dan terasa otomatis pada commit keseratus. Manfaatnya tidak berhenti di rapi-tidaknya riwayat: commit yang diperiksa adalah commit yang bisa dipercaya saat di-revert, di-cherry-pick, atau dibaca kembali setahun kemudian — kegiatan-kegiatan yang seluruhnya bergantung pada kualitas isi commit, tema utama chapter Menjaga Riwayat Commit
.
Section Melacak Perubahan sampai di sini tuntas: keadaan berkas dapat dibaca, staging area dapat dikurasi, versi lama dapat dipulihkan, dan isi diff dapat dibedah sampai baris terakhir. Melacak adalah setengah dari siklus; setengah satunya adalah mencatat — memberi nama pada pekerjaan yang sudah diperiksa dan menyusunnya menjadi riwayat yang bisa dibaca orang lain. Seluruh mekanisme itu, dari anatomi commit sampai kebiasaan pesan yang baik, menanti di section Commit dan Riwayat .