HEAD adalah penunjuk posisi kerja saat ini, dan hampir semua operasi Git dimulai dari tempat yang ditunjuknya. Topik ini membahas cara kerja HEAD sebagai penunjuk berlapis, nama relatif seperti HEAD~1 yang dibangun di atasnya, keadaan detached HEAD yang kerap menakutkan namun sebenarnya sederhana, dan cara keluar dari keadaan itu dengan aman.
HEAD sebagai penunjuk berlapis#
Pada keadaan normal, HEAD tidak menunjuk commit secara langsung, melainkan menunjuk sebuah branch, dan branch itulah yang menunjuk commit. Isi berkas HEAD dapat dilihat langsung.
# tanggal commit ditetapkan agar keluaran contoh dapat direproduksi secara persis
export GIT_AUTHOR_DATE="2026-11-01T09:00:00+07:00"
export GIT_COMMITTER_DATE="2026-11-01T09:00:00+07:00"rm -rf /tmp/lab-head
mkdir /tmp/lab-head
cd /tmp/lab-head
git init -b main
git config user.name "Budi"
git config user.email "[email protected]"
printf "Versi pertama.\n" > app.txt
git add app.txt
git commit -m "Versi pertama"
cat .git/HEADInitialized empty Git repository in /tmp/lab-head/.git/
[main (root-commit) 967f0ba] Versi pertama
1 file changed, 1 insertion(+)
create mode 100644 app.txt
ref: refs/heads/mainAwalan ref: menyatakan bahwa HEAD menunjuk sebuah branch, bukan commit. Ketika commit baru dibuat, dua pergerakan terjadi sekaligus: branch yang ditunjuk HEAD bergerak maju ke commit baru, sedangkan HEAD sendiri tidak berubah karena masih menunjuk branch yang sama. Inilah alasan branch “berjalan mengikuti” commit, dan penjelasan berkas 41 karakter pada pembahasan branch kini tersambung utuh.
Nama relatif dibangun dari HEAD: HEAD adalah commit saat ini, HEAD~1 adalah induknya, dan HEAD~2 adalah induk dari induknya. Semua perintah yang menerima nama commit menerima bentuk-bentuk ini, sehingga git show HEAD~1 dan git log -1 HEAD~1 tidak memerlukan hash apa pun.
printf "Versi kedua.\n" >> app.txt
git commit -am "Versi kedua"
git log --oneline -1 HEAD~1[main 7ce8de4] Versi kedua
1 file changed, 1 insertion(+)
967f0ba Versi pertamaDetached HEAD#
HEAD menjadi detached ketika ia dipaksa menunjuk sebuah commit secara langsung, misalnya ketika commit lama hendak diperiksa tanpa berpindah branch.
git switch --detach HEAD~1
cat .git/HEADHEAD is now at 967f0ba Versi pertama
967f0ba62f0c4010c6c1389350f456df917707eeIsi HEAD kini berupa hash commit, bukan awalan ref:. Working directory menampilkan keadaan commit lama tersebut, dan pemeriksaannya aman: membaca log, menampilkan berkas, atau menjalankan program pada keadaan lama tidak mengubah apa pun.
Bahaya baru muncul ketika commit dibuat pada keadaan detached. Commit baru itu tidak berada di atas branch mana pun, sehingga tidak ada penunjuk yang bergerak mengikutinya.
printf "Percobaan di commit lama.\n" > eksperimen.txt
git add eksperimen.txt
git commit -m "Percobaan pada commit lama"
git switch main[detached HEAD 496ae11] Percobaan pada commit lama
1 file changed, 1 insertion(+)
create mode 100644 eksperimen.txt
Warning: you are leaving 1 commit behind, not connected to
any of your branches:
496ae11 Percobaan pada commit lama
If you want to keep it by creating a new branch, this may be a good time
to do so with:
git branch <new-branch-name> 496ae11
Switched to branch 'main'Baris [detached HEAD ...] pada keluaran commit adalah sinyal utamanya. Apabila posisi kerja langsung berpindah tanpa langkah penyelamatan, commit tersebut tidak lagi ditunjuk branch mana pun dan berisiko dibersihkan Git pada pengumpulan sampah rutinnya.
Keluar dari detached HEAD#
Aturan keputusannya sederhana dan bergantung pada satu pertanyaan: apakah pekerjaan di atas commit lama ingin disimpan? Apabila ingin disimpan, buat branch pada posisi itu sebelum berpindah, sehingga commit yang sedang dikerjakan ikut menjadi bagian branch baru tersebut.
git switch --detach HEAD~1
printf "Lanjutan eksperimen.\n" >> eksperimen.txt
git commit -am "Lanjutan eksperimen"
git switch -c cabang-eksperimen
git branchHEAD is now at 967f0ba Versi pertama
HEAD detached at 967f0ba
Untracked files:
(use "git add <file>..." to include in what will be committed)
eksperimen.txt
nothing added to commit but untracked files present (use "git add" to track)
Switched to a new branch 'cabang-eksperimen'
* cabang-eksperimen
mainPerintah git switch -c dalam keadaan detached HEAD membuat branch baru yang menunjuk ke commit saat ini. Dengan demikian, rangkaian commit hasil percobaan memiliki penunjuk tetap dan terlindung dari proses pembersihan otomatis. Jika percobaan tersebut tidak lagi diperlukan, cukup jalankan git switch main dan biarkan commit yang tidak lagi memiliki referensi dibersihkan secara otomatis oleh Git. Kedua pilihan tersebut sama-sama valid. Yang berisiko adalah meninggalkan keadaan detached HEAD tanpa menentukan tindakan selanjutnya.
Ringkasan#
- HEAD pada keadaan normal menunjuk branch dengan isi
ref: refs/heads/nama, dan branch itulah yang menunjuk commit. HEAD~1,HEAD~2, dan seterusnya menyebut induk berantai, sehingga commit lama dapat dirujuk tanpa hash.- Detached HEAD berarti HEAD menunjuk commit secara langsung, aman untuk membaca, berisiko untuk menulis.
- Keluar dari detached HEAD dengan
git switch -cbila pekerjaan ingin disimpan, atau berpindah branch bila tidak.
Referensi#
- Git Branching - Branches in a Nutshell — Pro Git — bagian yang menjelaskan HEAD dan keadaan detached-nya.
- git-switch — Git Documentation
— rujukan opsi
--detachdan-c.