Keluaran git status pada chapter git status terasa mudah dibaca karena labelnya menjelaskan diri sendiri: Untracked files, Changes not staged for commit, Changes to be committed. Label-label itu bukan sekadar teks antarmuka — di baliknya bersembunyi model yang tetap: empat keadaan berkas dan sejumlah perintah yang memindahkan berkas di antara keadaan-keadaan tersebut. Memahami siklus ini berarti dapat memprediksi isi git status sebelum perintah dijalankan, dan tahu perintah mana yang mengembalikan keadaan yang tidak diinginkan. Chapter ini membedah siklus hidup tersebut, lalu mengajak satu berkas menempuh putaran penuh — lahir sebagai berkas baru sampai kembali ke keranjang — dengan keluaran git status nyata di setiap persimpangan.

Empat Keadaan Berkas #

Setiap berkas di repository berada pada tepat satu dari empat keadaan berikut:

KeadaanArtiTerlihat pada git status sebagai
untrackedberkas ada di folder proyek, belum pernah dicatat Gitdaftar Untracked files
unmodifiedisi berkas sama persis dengan versi terakhir yang tercatattidak muncul di daftar mana pun
modifiedisi di working tree berbeda dari versi di indexChanges not staged for commit
stagedversi baru sudah tersimpan di index, menunggu commitChanges to be committed

Keadaan unmodified adalah keadaan paling sunyi: berkas yang bersih tidak pernah disebut oleh git status, karena tidak ada yang perlu dilaporkan. Justru karena senyap itulah keadaan ini sering dilupakan padahal menjadi titik kembali seluruh siklus. Keempat istilah ini juga dipakai dokumentasi resmi, jadi dokumentasi git status enak dijadikan rujukan silang saat membaca manual.

Diagram Siklus Hidup #

Perpindahan antar keadaan mengikuti pola yang tetap:

Putaran utama siklus tersebut berjalan searah jarum jam: berkas baru lahir sebagai untracked, dipilih dengan git add menjadi staged, dicatat git commit menjadi unmodified, lalu disunting menjadi modified dan kembali dipilih menjadi staged. Satu transisi tambahan tergambar di diagram — membuang suntingan mengembalikan berkas modified ke unmodified — dan beberapa jalur ke luar lainnya kita bahas setelah demo.

Satu Berkas Menempuh Putaran Penuh #

Kita siapkan repository latihan segar berisi satu commit, lalu mengikuti sebuah berkas baru menempuh seluruh siklus:

bash
mkdir latihan-status && cd latihan-status
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
git add README.md
git commit -m "Commit awal situs dokumentasi"

Lahir sebagai Untracked #

Berkas baru selalu lahir tanpa dikenal Git:

bash
printf '# Panduan Kontributor\n\nAlur dasar berkontribusi di proyek ini.\n' > panduan.md
git status

Output yang Dihasilkan:

text
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	panduan.md

nothing added to commit but untracked files present (use "git add" to track)

Baris penutupnya lugas: tidak ada yang siap di-commit, hanya berupa berkas yang belum dilacak (use "git add" to track). Git melihat keberadaan panduan.md di folder, tetapi belum diminta mengawasi isinya.

Terpilih menjadi Staged #

Perintah git add memindahkan berkas ke 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)
	new file:   panduan.md

Untuk berkas yang baru pertama kali masuk keranjang, Git memakai label new file: — bukan modified: — karena yang dibandingkan index dengan HEAD adalah keberadaan berkas itu sendiri. Petunjuk (use "git restore --staged <file>..." to unstage) mengingatkan bahwa pilihan ini bisa dibatalkan tanpa menghapus berkas.

Tercatat menjadi Unmodified #

Commit memindahkan isi keranjang ke riwayat:

bash
git commit -m "Tambah panduan kontributor"

Output yang Dihasilkan:

text
[main f959231] Tambah panduan kontributor
 1 file changed, 3 insertions(+)
 create mode 100644 panduan.md
bash
git status

Output yang Dihasilkan:

text
On branch main
nothing to commit, working tree clean

Inilah keadaan unmodified versi paling ekstrem: tidak ada satu pun berkas yang perlu dilaporkan, seluruh isi working tree sama dengan snapshot terakhir. Hash f959231 dihitung dari isi dan waktu commit, sehingga nilainya berbeda di komputer pembaca.

Disunting menjadi Modified #

Penyuntingan di editor memutus kesamaan itu:

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")

Label kembali menjadi modified — berkas sudah dikenal Git (pernah masuk snapshot), hanya isinya yang kini menyimpang dari index.

Kembali ke Keranjang #

Putaran ditutup dengan git add yang sama seperti pada transisi pertama:

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

Perhatikan perbedaan halus dengan transisi sebelumnya: labelnya kini modified: bukan new file:, karena yang berbeda kini isinya, bukan keberadaannya. Setelah commit kedua ini dibuat, perjalanan berkas dapat dilihat utuh di riwayat:

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

Output yang Dihasilkan:

text
[main 31c19c0] Sarankan baca glosarium sebelum kontribusi
 1 file changed, 1 insertion(+)
bash
git log --oneline

Output yang Dihasilkan:

text
31c19c0 Sarankan baca glosarium sebelum kontribusi
f959231 Tambah panduan kontributor
849aa8b Commit awal situs dokumentasi

Jalur ke Luar Putaran Utama #

Diagram di awal chapter memuat putaran utama; ada beberapa transisi lain yang sama pentingnya:

  • modified → unmodified — membuang suntingan dan kembali ke versi terakhir yang tercatat, dibahas pada chapter Membuang Perubahan Lokal dan Memulihkan File .
  • staged → modified atau untracked — mengeluarkan berkas dari keranjang tanpa membuang suntingannya lewat git restore --staged, topik utama chapter Membatalkan Staging .
  • unmodified → untracked — berhenti melacak berkas yang tetap ingin dipertahankan di disk, dilakukan dengan git rm --cached dan dibahas pada chapter git rm .

Mengenal keadaan-keadaan ini juga memberi nama pada kebutuhan kita: “berkas ini masih untracked” atau “suntingan ini belum staged” adalah kalimat yang menuntun ke perintah yang tepat. Satu pemisahan mendasar masih perlu dibedah — perbedaan antara berkas yang dilacak dan yang tidak, beserta konsekuensi nyatanya bagi commit dan pemulihan. Lanjut ke Untracked dan Tracked Files .