Pemulihan lewat reflog hanya mungkin bila reflog punya isi — dan reflog hanya mencatat repository yang benar-benar bergerak. Bagian ini karena itu dimulai bukan dari bencana, melainkan dari pekerjaan yang sehat: kita membangun buku-resep dengan lima commit bertahap, tiap resep masuk sebagai satu satuan kerja. Setelah riwayatnya berdiri, kita membuka git reflog dan membaca peta pergerakan HEAD-nya baris demi baris, lalu mencoba notasi HEAD@{1} sebagai alamat yang bisa diurai tanpa menggerakkan apa pun.

Menyiapkan Repository Buku Resep #

Mulai dari folder kerja kosong, buat repository dengan branch main sejak awal:

bash
mkdir buku-resep && cd buku-resep
git init -b main
git config user.name "Budi Santoso"
git config user.email "[email protected]"

Output yang Dihasilkan (perintah git init -b main):

text
Initialized empty Git repository in /home/z/my-project/tutorial-extracted/work/sandbox/proyek-git/proyek-05/buku-resep/.git/

Isi pertama adalah resep sup jagung, ditulis ke sample.txt, plus satu README.md kecil yang menjelaskan proyeknya:

bash
printf 'Buku Resep Warung\n=================\n\nKumpulan resep andalan warung — dicatat bertahap di satu berkas.\n\n## Sup Jagung\n\nBahan:\n- 2 tongkol jagung manis\n- 1 batang serai, memarkan\n- 1 liter air\n\nLangkah:\n1. Didihkan air bersama serai.\n2. Masukkan jagung, rebus 15 menit.\n3. Bumbui garam dan merica secukupnya.\n' > sample.txt
printf '# Buku Resep Warung\n\nKumpulan resep andalan warung — latihan pemulihan riwayat untuk\nCourse Git Proyek 05.\n\n## Isi\n\n- `sample.txt` — seluruh resep dalam satu berkas\n' > README.md
cat sample.txt

Output yang Dihasilkan (perintah cat sample.txt):

text
Buku Resep Warung
=================

Kumpulan resep andalan warung — dicatat bertahap di satu berkas.

## Sup Jagung

Bahan:
- 2 tongkol jagung manis
- 1 batang serai, memarkan
- 1 liter air

Langkah:
1. Didihkan air bersama serai.
2. Masukkan jagung, rebus 15 menit.
3. Bumbui garam dan merica secukupnya.

Periksa keadaannya sebelum mencatat:

bash
git status
git add .
git commit -m "Rintis buku resep dengan resep sup"

Output yang Dihasilkan (perintah git status):

text
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	README.md
	sample.txt

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

Output yang Dihasilkan (perintah git commit):

text
[main (root-commit) 12594d0] Rintis buku resep dengan resep sup
 2 files changed, 24 insertions(+)
 create mode 100644 README.md
 create mode 100644 sample.txt

Commit pertama memasang fondasi: dua berkas, 24 baris, ditandai (root-commit) karena tidak punya induk. Hash 12594d0 di mesin kita akan berbeda — hash dipengaruhi isi, pesan, dan waktu pembuatan.

Menambah Gudeg dan Rendang #

Resep kedua dan ketiga masuk sebagai perubahan kecil pada berkas yang sama. Satu resep satu commit: pola ini bukan gaya-gayaan — setiap commit yang kecil dan berdiri sendiri menjadi satu alamat yang enak dikunjungi kembali, baik lewat git log maupun reflog nanti. Tambahkan gudeg:

bash
printf '\n## Gudeg\n\nBahan:\n- 500 gram nangka muda\n- 100 gram daging sapi\n- 400 ml santan\n\nLangkah:\n1. Rebus nangka hingga setengah lunak.\n2. Tumis bumbu halus hingga wangi.\n3. Masak semua bahan dengan api kecil 2 jam.\n' >> sample.txt
cat sample.txt
git add sample.txt
git commit -m "Tambah resep gudeg"

Output yang Dihasilkan (perintah cat sample.txt):

text
Buku Resep Warung
=================

Kumpulan resep andalan warung — dicatat bertahap di satu berkas.

## Sup Jagung

Bahan:
- 2 tongkol jagung manis
- 1 batang serai, memarkan
- 1 liter air

Langkah:
1. Didihkan air bersama serai.
2. Masukkan jagung, rebus 15 menit.
3. Bumbui garam dan merica secukupnya.

## Gudeg

Bahan:
- 500 gram nangka muda
- 100 gram daging sapi
- 400 ml santan

Langkah:
1. Rebus nangka hingga setengah lunak.
2. Tumis bumbu halus hingga wangi.
3. Masak semua bahan dengan api kecil 2 jam.

Output yang Dihasilkan (perintah git commit):

text
[main 691f4f6] Tambah resep gudeg
 1 file changed, 12 insertions(+)

Rendang menyusul dengan pola yang sama:

bash
printf '\n## Rendang\n\nBahan:\n- 1 kg daging sapi\n- 2 liter santan kental\n- 20 cabai merah\n\nLangkah:\n1. Haluskan cabai, bawang, dan lengkuas.\n2. Rebus daging dalam santan berbumbu.\n3. Aduk hingga kuah mengering dan berminyak.\n' >> sample.txt
cat sample.txt
git add sample.txt
git commit -m "Tambah resep rendang"

Output yang Dihasilkan (perintah cat sample.txt):

text
Buku Resep Warung
=================

Kumpulan resep andalan warung — dicatat bertahap di satu berkas.

## Sup Jagung

Bahan:
- 2 tongkol jagung manis
- 1 batang serai, memarkan
- 1 liter air

Langkah:
1. Didihkan air bersama serai.
2. Masukkan jagung, rebus 15 menit.
3. Bumbui garam dan merica secukupnya.

## Gudeg

Bahan:
- 500 gram nangka muda
- 100 gram daging sapi
- 400 ml santan

Langkah:
1. Rebus nangka hingga setengah lunak.
2. Tumis bumbu halus hingga wangi.
3. Masak semua bahan dengan api kecil 2 jam.

## Rendang

Bahan:
- 1 kg daging sapi
- 2 liter santan kental
- 20 cabai merah

Langkah:
1. Haluskan cabai, bawang, dan lengkuas.
2. Rebus daging dalam santan berbumbu.
3. Aduk hingga kuah mengering dan berminyak.

Output yang Dihasilkan (perintah git commit):

text
[main 1c4a93c] Tambah resep rendang
 1 file changed, 12 insertions(+)

Dua commit terakhir pagi ini merapikan sisi dokumen. Pertama, catatan penyajian ditempelkan di ujung sample.txt:

bash
printf '\n## Catatan Penyajian\n\nSajikan sup jagung hangat, gudeg dengan nasi putih, dan rendang\npaling pas dalam keadaan kering.\n' >> sample.txt
tail -n 5 sample.txt
git add sample.txt
git commit -m "Tambah catatan penyajian"

Output yang Dihasilkan (perintah tail -n 5 sample.txt):

text

## Catatan Penyajian

Sajikan sup jagung hangat, gudeg dengan nasi putih, dan rendang
paling pas dalam keadaan kering.

Output yang Dihasilkan (perintah git commit):

text
[main 84e2ae5] Tambah catatan penyajian
 1 file changed, 5 insertions(+)

Kedua, README.md dilengkapi daftar resep supaya pembaca cepat tahu isi bukunya:

bash
printf '# Buku Resep Warung\n\nKumpulan resep andalan warung — latihan pemulihan riwayat untuk\nCourse Git Proyek 05.\n\n## Isi\n\n- `sample.txt` — seluruh resep dalam satu berkas\n\n## Daftar Resep\n\n- Sup Jagung\n- Gudeg\n- Rendang\n' > README.md
cat README.md
git add README.md
git commit -m "Lengkapi README dengan daftar resep"

Output yang Dihasilkan (perintah cat README.md):

text
# Buku Resep Warung

Kumpulan resep andalan warung — latihan pemulihan riwayat untuk
Course Git Proyek 05.

## Isi

- `sample.txt` — seluruh resep dalam satu berkas

## Daftar Resep

- Sup Jagung
- Gudeg
- Rendang

Output yang Dihasilkan (perintah git commit):

text
[main 563d368] Lengkapi README dengan daftar resep
 1 file changed, 6 insertions(+)

Pagi ditutup dalam keadaan rapi — lima commit, semuanya terlihat di riwayat:

bash
git log --oneline

Output yang Dihasilkan:

text
563d368 Lengkapi README dengan daftar resep
84e2ae5 Tambah catatan penyajian
1c4a93c Tambah resep rendang
691f4f6 Tambah resep gudeg
12594d0 Rintis buku resep dengan resep sup

Membaca Peta Pergerakan #

Sekarang bagian yang menjadi bekal sepanjang proyek ini. git log tadi berjalan menyusuri rantai induk — ia hanya menunjukkan commit yang masih dirujuk main. Reflog mencatat hal yang berbeda: ke mana HEAD pernah pergi:

bash
git reflog

Output yang Dihasilkan:

text
563d368 HEAD@{0}: commit: Lengkapi README dengan daftar resep
84e2ae5 HEAD@{1}: commit: Tambah catatan penyajian
1c4a93c HEAD@{2}: commit: Tambah resep rendang
691f4f6 HEAD@{3}: commit: Tambah resep gudeg
12594d0 HEAD@{4}: commit (initial): Rintis buku resep dengan resep sup

Lima baris itu persis lima aksi kita tadi. Mari bedah anatominya:

  1. Hash di kiri — posisi HEAD setelah aksi tersebut selesai; baris HEAD@{2} menunjuk 1c4a93c, commit rendang.
  2. HEAD@{n} — nomor urut dari terbaru; HEAD@{0} selalu posisi sekarang, dan angka bertambah setiap kita mundur satu langkah.
  3. Pesan di kanan titik dua — aksi yang menggerakkan HEAD; hari ini semuanya commit, dan baris terbawah diberi tanda (initial) karena akar riwayat.
  4. Pesan itu ditulis oleh mesin Git, bukan oleh kita — nanti kita akan bertemu reset:, checkout:, dan merge: dengan format yang sama persis.

Seluruh sintaks HEAD@{n} beserta kerabatnya terdokumentasi di dokumentasi git reflog .

Menjelajah Posisi Lama Tanpa Berpindah #

Notasi HEAD@{n} bukan sekadar hiasan daftar — ia adalah alamat yang bisa diurai menjadi hash utuh:

bash
git rev-parse HEAD@{1}

Output yang Dihasilkan:

text
84e2ae56712f6968188bb05698c0fb63b8e1442b

Satu langkah mundur dari HEAD@{0} adalah HEAD@{1} — commit catatan penyajian, dan hash penuhnya kini tercetak di layar. Perintah ini murni pembacaan: HEAD tidak berpindah, tidak ada berkas yang berubah, working tree tidak tersentuh. Kita baru saja meminta Git membaca peta tanpa berjalan.

Pemahaman inilah bekal hari buruk kita: git log menjawab “apa yang dirujuk sekarang”, git reflog menjawab “ke mana saja HEAD pernah pergi”, dan HEAD@{n} adalah cara menunjuk salah satu perhentian lama itu. Peta sudah di tangan — saatnya bencana pertama menghapus dua commit terakhir, dan kita membuktikan bahwa peta ini bisa mengantar pulang: Bagian 2: Memulihkan Commit .