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:

FasePembandingan yang berbedaTampil di git statusgit diffgit diff --cached
modifiedworking tree ≠ indexChanges not staged for commitmenampilkan suntingankosong
stagedindex ≠ HEADChanges to be committedkosongmenampilkan suntingan
staged + modifiedkeduanyadua daftar sekaligussuntingan terbarusuntingan terdahulu
committedtidak adatidak munculkosongkosong

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:

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

bash
printf '# Panduan Kontributor\n\nAlur dasar berkontribusi di proyek ini.\nKontributor baru disarankan membaca glosarium terlebih dahulu.\n' > panduan.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:   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:

bash
git diff

Output yang Dihasilkan:

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

bash
git add panduan.md
git status

Output yang Dihasilkan:

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

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

bash
git diff --cached

Output yang Dihasilkan:

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

bash
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 status

Output yang Dihasilkan:

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

Berkas yang sama muncul di dua daftar sekaligus. Format ringkas merangkumnya:

bash
git status -s

Output yang Dihasilkan:

text
MM panduan.md

Dua pembandingan kini melaporkan dua suntingan yang berbeda. Pertama, working tree vs index:

bash
git diff

Output yang Dihasilkan:

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

bash
git diff --cached

Output yang Dihasilkan:

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

bash
git commit -m "Sarankan baca glosarium sebelum kontribusi"

Output yang Dihasilkan:

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

bash
git show HEAD

Output yang Dihasilkan:

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

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