Menghapus branch dengan git branch -D terasa final: nama branch lenyap dari daftar, dan Git bahkan tidak bertanya ulang. Pemahaman kita dari chapter sebelumnya sudah membocorkan akhir ceritanya — branch hanyalah penunjuk kecil berisi satu hash, dan menghapus penunjuk tidak menghapus commit yang ditunjuknya. Yang perlu dicari hanyalah hash posisi terakhir branch itu, dan reflog menyimpannya. Chapter ini mengeksekusi penghapusan sungguhan, membuktikan bahwa git reflog masih tahu ke mana fitur pernah pergi, lalu membangkitkannya kembali dengan satu perintah.

Skenario: fitur Dihapus dengan -D #

Repository latihan latihan-branch menampung branch fitur berisi dua commit yang belum digabungkan ke main — kondisi yang membuat opsi -d menolak jalan. Selagi branch masih hidup, reflog miliknya bisa dibaca langsung:

bash
mkdir latihan-branch && cd latihan-branch
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"
printf 'beranda\n' > situs.md
git add situs.md
git commit -m "Buat halaman beranda"
git switch -c fitur
printf 'galeri foto\n' > galeri.md
git add galeri.md
git commit -m "Mulai halaman galeri"
printf 'galeri foto\nalbum 2026\n' > galeri.md
git add galeri.md
git commit -m "Selesaikan halaman galeri"
git reflog show fitur

Output yang Dihasilkan:

text
5fd8a64 fitur@{0}: commit: Selesaikan halaman galeri
d12558d fitur@{1}: commit: Mulai halaman galeri
5707824 fitur@{2}: branch: Created from HEAD

Reflog fitur mencatat dua pergerakannya: kelahiran dari HEAD dan commit terakhirnya. Sekarang kita kembali ke main, maju satu commit agar percabangan semakin jelas, lalu coba hapus dengan opsi aman -d:

bash
git switch main
printf 'beranda\nfaq\n' > situs.md
git add situs.md
git commit -m "Tambah halaman faq"
git branch -d fitur

Output yang Dihasilkan:

text
error: the branch 'fitur' is not fully merged
hint: If you are sure you want to delete it, run 'git branch -D fitur'
hint: Disable this message with "git config advice.forceDeleteBranch false"

-d menolak — branch belum tergabung penuh ke main, persis perilaku yang dibahas chapter Menghapus Branch . Penolakan ini adalah jaring pengaman terakhir. Karena skenario kita memang sengaja ceroboh, opsi paksa -D dijalankan:

bash
git branch -D fitur

Output yang Dihasilkan:

text
Deleted branch fitur (was 5fd8a64).

fitur resmi terhapus. Perintah yang merujuk namanya kini gagal keras:

bash
git log --oneline fitur

Output yang Dihasilkan:

text
fatal: ambiguous argument 'fitur': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Mencari Posisi Terakhir fitur di reflog #

Bila keluaran -D sudah lewat, reflog HEAD mengambil alih peran pemandu:

bash
git reflog

Output yang Dihasilkan:

text
c69bc6e HEAD@{0}: commit: Tambah halaman faq
5707824 HEAD@{1}: checkout: moving from fitur to main
5fd8a64 HEAD@{2}: commit: Selesaikan halaman galeri
d12558d HEAD@{3}: commit: Mulai halaman galeri
5707824 HEAD@{4}: checkout: moving from main to fitur
5707824 HEAD@{5}: commit (initial): Buat halaman beranda

Perhatikan baris 5fd8a64 HEAD@{2}: commit: Selesaikan halaman galeri — itulah posisi terakhir fitur, tercatat karena commit itu dibuat selagi HEAD berada di branch fitur. Baris HEAD@{1} yang bertuliskan checkout: moving from fitur to main menegaskan jejak keberadaannya. Reflog fitur sendiri sudah tidak bisa dibaca — penghapusan branch ikut menghapus berkas reflog milik branch itu — tetapi salinan jejaknya di reflog HEAD bertahan.

Membangkitkan fitur Kembali #

Memulihkan branch hanya butuh satu perintah: git branch dengan nama branch dan titik berdirinya. Sintaks HEAD@{2} bekerja sama mulusnya dengan hash mentah:

bash
git branch fitur HEAD@{2}
git log --oneline fitur

Output yang Dihasilkan:

text
5fd8a64 Selesaikan halaman galeri
d12558d Mulai halaman galeri
5707824 Buat halaman beranda

Branch fitur hidup kembali dengan riwayat utuh: dua commit galerinya masih menempel pada “Buat halaman beranda”. git branch fitur 5fd8a64 menghasilkan keadaan yang persis sama — cukup ganti HEAD@{2} dengan hash dari keluaran -D atau baris reflog. Seluruh bentuk perintah git branch yang dipakai di chapter ini terdokumentasi di git-branch .

Batasan: Branch yang Tak Pernah Aktif #

Satu celah tetap perlu diwaspadai. Reflog HEAD hanya mencatat pergerakan HEAD — branch yang tidak pernah di-switch dan tidak pernah menerima commit tidak meninggalkan jejak apa pun di sana. Kita buktikan dengan branch baru yang langsung dihapus tanpa pernah dikunjungi:

bash
git branch topik-baru
git branch -D topik-baru
git reflog

Output yang Dihasilkan:

text
c69bc6e HEAD@{0}: commit: Tambah halaman faq
5707824 HEAD@{1}: checkout: moving from fitur to main
5fd8a64 HEAD@{2}: commit: Selesaikan halaman galeri
d12558d HEAD@{3}: commit: Mulai halaman galeri
5707824 HEAD@{4}: checkout: moving from main to fitur
5707824 HEAD@{5}: commit (initial): Buat halaman beranda

Keluarannya identik dengan sebelumnya — tidak ada satu baris pun tentang topik-baru. Posisinya sama dengan ujung main, commit yang dirujuknya tetap hidup karena dirujuk main, tetapi tidak ada catatan yang menghubungkan nama topik-baru dengan niat kita. Satu-satunya tempat hash posisinya pernah muncul adalah keluaran git branch -D itu sendiri.

Dengan hash posisi terakhir sebagai satu-satunya bahan baku, branch apa pun yang pernah aktif bisa dibangkitkan dalam hitungan detik. Berikutnya kita turun ke satuan yang lebih kecil namun sama sering terjadi: satu berkas yang terhapus — baik yang belum sempat di-commit maupun yang sudah telanjur masuk riwayat — di Memulihkan File Terhapus .