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:
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):
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:
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.txtOutput yang Dihasilkan (perintah cat sample.txt):
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:
git status
git add .
git commit -m "Rintis buku resep dengan resep sup"Output yang Dihasilkan (perintah git status):
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):
[main (root-commit) 12594d0] Rintis buku resep dengan resep sup
2 files changed, 24 insertions(+)
create mode 100644 README.md
create mode 100644 sample.txtCommit 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:
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):
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):
[main 691f4f6] Tambah resep gudeg
1 file changed, 12 insertions(+)Rendang menyusul dengan pola yang sama:
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):
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):
[main 1c4a93c] Tambah resep rendang
1 file changed, 12 insertions(+)Menutup Pagi dengan Catatan dan Daftar Resep #
Dua commit terakhir pagi ini merapikan sisi dokumen. Pertama, catatan penyajian ditempelkan di ujung sample.txt:
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):
## Catatan Penyajian
Sajikan sup jagung hangat, gudeg dengan nasi putih, dan rendang
paling pas dalam keadaan kering.Output yang Dihasilkan (perintah git commit):
[main 84e2ae5] Tambah catatan penyajian
1 file changed, 5 insertions(+)Kedua, README.md dilengkapi daftar resep supaya pembaca cepat tahu isi bukunya:
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):
# 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
- RendangOutput yang Dihasilkan (perintah git commit):
[main 563d368] Lengkapi README dengan daftar resep
1 file changed, 6 insertions(+)Pagi ditutup dalam keadaan rapi — lima commit, semuanya terlihat di riwayat:
git log --onelineOutput yang Dihasilkan:
563d368 Lengkapi README dengan daftar resep
84e2ae5 Tambah catatan penyajian
1c4a93c Tambah resep rendang
691f4f6 Tambah resep gudeg
12594d0 Rintis buku resep dengan resep supMembaca 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:
git reflogOutput yang Dihasilkan:
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 supLima baris itu persis lima aksi kita tadi. Mari bedah anatominya:
- Hash di kiri — posisi HEAD setelah aksi tersebut selesai; baris
HEAD@{2}menunjuk1c4a93c, commit rendang. HEAD@{n}— nomor urut dari terbaru;HEAD@{0}selalu posisi sekarang, dan angka bertambah setiap kita mundur satu langkah.- Pesan di kanan titik dua — aksi yang menggerakkan HEAD; hari ini semuanya
commit, dan baris terbawah diberi tanda(initial)karena akar riwayat. - Pesan itu ditulis oleh mesin Git, bukan oleh kita — nanti kita akan bertemu
reset:,checkout:, danmerge: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:
git rev-parse HEAD@{1}Output yang Dihasilkan:
84e2ae56712f6968188bb05698c0fb63b8e1442bSatu 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
.