Tiga kata pada judul ini biasa diucapkan berurutan seperti satu tarikan napas: modified, staged, committed. Padahal ketiganya bukan tiga label yang menempel pada tempat yang sama, melainkan tiga fase yang dilalui satu perubahan sebelum menjadi riwayat. Kekeliruan yang paling sering terjadi adalah menganggap staged sebagai tanda pada berkas dan modified sebagai lawannya — padahal keduanya lahir dari pembandingan antar area: modified berarti isi working tree berbeda dari index, staged berarti isi index berbeda dari HEAD. Cara tercepat menguasainya adalah menelusuri satu berkas melewati ketiga fase dengan mata sendiri, dan chapter ini mengajak melakukan persis hal itu: sunting bertahap, stage bertahap, lalu membaca setiap fase lewat git status dan git diff.
Bukan Tiga Status, Tiga Pembandingan #
Ketiga fase dapat dirumuskan presisi lewat dua pembandingan:
| Fase | Pembandingan yang berbeda | Tampil di git status | git diff | git diff --cached |
|---|---|---|---|---|
| modified | working tree ≠ index | Changes not staged for commit | menampilkan suntingan | kosong |
| staged | index ≠ HEAD | Changes to be committed | kosong | menampilkan suntingan |
| staged + modified | keduanya | dua daftar sekaligus | suntingan terbaru | suntingan terdahulu |
| committed | tidak ada | tidak muncul | kosong | kosong |
Baris ketiga pada tabel adalah keadaan yang menjadi kunci pemahaman: satu berkas bisa staged dan modified sekaligus, karena versi di index dan versi di working tree adalah dua hal berbeda. Demo berikut membangun keempat baris tabel itu satu per satu.
Menyiapkan Latihan #
Repository latihan berisi satu berkas panduan.md yang sudah dicatat pada commit pertama:
mkdir latihan-fase && cd latihan-fase
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf '# Panduan Kontributor\n\nAlur dasar berkontribusi di proyek ini.\n' > panduan.md
git add panduan.md
git commit -m "Tambah panduan kontributor"Working tree bersih; panduan.md berstatus unmodified. Perjalanan tiga fase dimulai dari sini.
Fase Modified: Suntingan Menyimpang dari Index #
Kita tambahkan satu baris pada berkas:
printf '# Panduan Kontributor\n\nAlur dasar berkontribusi di proyek ini.\nKontributor baru disarankan membaca glosarium terlebih dahulu.\n' > panduan.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: panduan.md
no changes added to commit (use "git add" and/or "git commit -a")Isi perubahannya dilihat lewat git diff — pembanding working tree terhadap index:
git diffOutput yang Dihasilkan:
diff --git a/panduan.md b/panduan.md
index 6cb58ac..90de95c 100644
--- a/panduan.md
+++ b/panduan.md
@@ -1,3 +1,4 @@
# Panduan Kontributor
Alur dasar berkontribusi di proyek ini.
+Kontributor baru disarankan membaca glosarium terlebih dahulu.Catat pasangan hash blob pada baris index: 6cb58ac..90de95c — versi lama 6cb58ac adalah isi yang tersimpan di index (dan di HEAD), sedangkan 90de95c adalah isi baru di working tree. Selama fase ini git diff --cached tidak mencetak apa pun karena index dan HEAD masih identik: seluruh perbedaan baru terjadi di working tree.
Fase Staged: Versi Baru Menempati Index #
Suntingan dipilih masuk keranjang:
git add panduan.md
git statusOutput yang Dihasilkan:
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: panduan.mdPerpindahan fase bukan sekadar ganti judul daftar. Yang terjadi di balik layar: isi index untuk panduan.md diganti menjadi salinan versi baru — blob 90de95c kini bersemayam di index. Akibatnya git diff (working tree vs index) tidak lagi mencetak apa pun karena keduanya identik. Pembanding yang ramai justru pindah ke git diff --cached (index vs HEAD):
git diff --cachedOutput yang Dihasilkan:
diff --git a/panduan.md b/panduan.md
index 6cb58ac..90de95c 100644
--- a/panduan.md
+++ b/panduan.md
@@ -1,3 +1,4 @@
# Panduan Kontributor
Alur dasar berkontribusi di proyek ini.
+Kontributor baru disarankan membaca glosarium terlebih dahulu.Perhatikan bahwa pasangan hash pada keluaran ini — 6cb58ac..90de95c — persis sama dengan keluaran git diff pada fase modified. Pasangan perbandingan yang sama hanya berganti posisi: dari working tree-vs-index menjadi index-vs-HEAD. Inilah makna harfiah staged: versi 90de95c sudah duduk di index, menunggu commit.
Suntingan Kedua: Staged dan Modified Sekaligus #
Sekarang momen yang menjelaskan semuanya. Commit belum dibuat, dan kita menyunting berkas yang sama sekali lagi:
printf '# Panduan Kontributor\n\nAlur dasar berkontribusi di proyek ini.\nKontributor baru disarankan membaca glosarium terlebih dahulu.\nGlosarium singkat kini tertaut dari panduan.\n' > panduan.md
git statusOutput yang Dihasilkan:
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: panduan.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: panduan.mdBerkas yang sama muncul di dua daftar sekaligus. Format ringkas merangkumnya:
git status -sOutput yang Dihasilkan:
MM panduan.mdDua pembandingan kini melaporkan dua suntingan yang berbeda. Pertama, working tree vs index:
git diffOutput yang Dihasilkan:
diff --git a/panduan.md b/panduan.md
index 90de95c..75c49a5 100644
--- a/panduan.md
+++ b/panduan.md
@@ -2,3 +2,4 @@
Alur dasar berkontribusi di proyek ini.
Kontributor baru disarankan membaca glosarium terlebih dahulu.
+Glosarium singkat kini tertaut dari panduan.Yang tampil hanya baris kedua — suntingan baru yang belum pernah di-git add. Pasangan hash 90de95c..75c49a5 menegaskan pembandingnya: index (yang masih memuat versi pertama 90de95c) versus working tree (versi termutakhir 75c49a5). Kedua, index vs HEAD:
git diff --cachedOutput yang Dihasilkan:
diff --git a/panduan.md b/panduan.md
index 6cb58ac..90de95c 100644
--- a/panduan.md
+++ b/panduan.md
@@ -1,3 +1,4 @@
# Panduan Kontributor
Alur dasar berkontribusi di proyek ini.
+Kontributor baru disarankan membaca glosarium terlebih dahulu.Yang tampil justru hanya baris pertama — versi yang dibekukan git add sebelumnya. Dari sini rumusannya menjadi nyata: staged adalah versi yang menempati index, modified adalah selisih working tree terhadap index, dan keduanya bisa hidup bersama pada satu berkas. Adapun git diff HEAD menggabungkan keduanya dalam satu keluaran — perilaku yang sudah kita buktikan pada chapter Memahami Working Tree
.
Fase Committed: Versi Index Menjadi Riwayat #
Commit dibuat pada keadaan berkas di atas — dengan satu suntingan di index dan satu lagi tertinggal di working tree:
git commit -m "Sarankan baca glosarium sebelum kontribusi"Output yang Dihasilkan:
[main 3f5a4a6] Sarankan baca glosarium sebelum kontribusi
1 file changed, 1 insertion(+)Ringkasan 1 file changed, 1 insertion(+) sudah memberi petunjuk: hanya satu baris yang tercatat. Isi commit dapat diperiksa dengan git show HEAD, yang menampilkan metadata commit diikuti diff-nya terhadap commit sebelumnya (dokumentasi lengkapnya di dokumentasi git show
):
git show HEADOutput yang Dihasilkan:
commit 3f5a4a65ce0e28bb416448244f4d6f4729bbb3c3
Author: Budi Santoso <[email protected]>
Date: Tue Oct 13 09:30:00 2026 +0700
Sarankan baca glosarium sebelum kontribusi
diff --git a/panduan.md b/panduan.md
index 6cb58ac..90de95c 100644
--- a/panduan.md
+++ b/panduan.md
@@ -1,3 +1,4 @@
# Panduan Kontributor
Alur dasar berkontribusi di proyek ini.
+Kontributor baru disarankan membaca glosarium terlebih dahulu.Bukti bertumpuk pada keluaran itu. Diff commit memuat pasangan hash 6cb58ac..90de95c — persis isi index sebelumnya: commit mencatat versi index, bukan versi terbaru di working tree. Suntingan kedua tidak ikut, dan akibatnya langsung terlihat pada keadaan setelah commit:
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: panduan.md
no changes added to commit (use "git add" and/or "git commit -a")panduan.md kembali berstatus modified — bukan kegagalan, melainkan konsekuensi logis: HEAD kini memuat versi 90de95c, sedangkan working tree masih memuat 75c49a5. Perjalanan versi kedua dimulai lagi dari fase modified.
Perjalanan satu berkas tadi kini lengkap: dari modified, naik ke staged, berlipat menjadi dua fase sekaligus, lalu tercatat sebagai committed. Realitas kerja jarang semudah satu berkas satu topik — dua perubahan beda maksud sering selesai bersamaan, dan keduanya layak menjadi dua commit terpisah. Caranya adalah memilih berkas yang di-stage secara selektif. Lanjut ke Staging File Tertentu .