{count, plural, one {Kursus} other {Kursus}}
Tidak ada yang lebih menjengkelkan bagi developer atau data engineer selain tidak sengaja menghapus branch git atau me-reset commit saat Anda tidak menginginkannya. Karena itu, saya senang berbagi sesuatu yang saya pelajari dari pengalaman sendiri dan berharap saya mempelajarinya lebih cepat, yaitu cara menggunakan git reflog. git reflog adalah salah satu teknik yang sangat layak dipelajari; jika Anda meluangkan sedikit waktu sekarang, Anda bisa menghindari sakit kepala besar di kemudian hari.
Saya akan menunjukkan git reflog, yang menurut saya sangat membantu untuk menavigasi dan pulih dari kesalahan, dan saya juga ingin merekomendasikan kursus Foundations of Git dan Introduction to GitHub Concepts kami untuk mempelajari semua hal tentang version control.
Apa itu git reflog?
Git reflog, atau reference log, adalah mekanisme pelacakan lokal yang merekam pembaruan pada ujung branch dan referensi HEAD di sebuah repositori Git. (Dalam konteks Git, HEAD mengacu pada commit saat ini yang menjadi dasar working directory dan staging area Anda.)
Berbeda dengan git log, yang menampilkan riwayat commit berdasarkan garis keturunan, menunjukkan bagaimana commit terhubung dalam sebuah branch, git reflog menangkap semua pergerakan HEAD, termasuk perpindahan branch, rebase, reset, dan commit. Ini membuat reflog berguna untuk memulihkan commit yang hilang dan men-debug tindakan terbaru.
Kapan entri reflog dibuat?
Entri reflog dibuat setiap kali Anda melakukan tindakan yang mengubah status HEAD atau referensi branch. Skenario umum meliputi:
-
Melakukan commit perubahan menggunakan
git commit. -
Checkout ke branch lain menggunakan
git checkout branch_name. -
Membuat branch baru menggunakan
git branch new_branch. -
Rebase
git rebase -
Reset ke commit sebelumnya
git reset --hard. -
Menggabungkan branch menggunakan
git merge.
Berikut adalah kode yang Anda gunakan untuk melacak pembaruan di repositori lokal:
git reflog

Menggunakan git reflog untuk melacak pembaruan di repositori lokal. Gambar oleh Penulis.
Bagaimana cara menafsirkan output git reflog?
Anda dapat menafsirkannya sebagai berikut:
-
HEAD@{0}: Tindakan terbaru adalah beralih ke branch HEAD. -
HEAD@{1}: Sebelumnya, saya mengubah tipe file dari format.xlxske.csv. -
HEAD@{2}: Saya melakukan commit pertama saat mendorong file ke repositori.
Setiap entri menampilkan:
-
Commit hash (
fa82776) -
Indeks reflog (
HEAD@{0},HEAD@{1}, dll.) -
Deskripsi tindakan yang dilakukan (commit, checkout, rebase)
Cara Menggunakan git reflog
Git reflog menyediakan cara untuk melacak pembaruan referensi dan memulihkan keadaan repositori Anda sebelumnya. Dengan memahami cara menavigasi entri reflog, Anda dapat memulihkan commit yang hilang, membatalkan perubahan, dan membandingkan versi pekerjaan Anda di masa lalu.
Perintah dasar git reflog
Di bawah ini adalah perintah reflog dasar:
git reflog
Perintah di atas menampilkan daftar tindakan terbaru yang memperbarui HEAD atau referensi branch, termasuk commit, perpindahan branch, reset, rebase, dan lainnya. Setiap entri diberi indeks, seperti HEAD@{0}, dan HEAD@{1}, untuk merepresentasikan posisinya dalam riwayat reflog.
Merujuk keadaan masa lalu
Git reflog berfungsi sebagai catatan pembaruan referensi di masa lalu, memungkinkan kita menemukan dan memulihkan titik-titik sebelumnya dalam riwayat repositori kita. Tanpanya, referensi ini tidak akan ada, dan kita membutuhkan commit hash yang tepat untuk kembali ke keadaan tertentu di masa lalu. Sekarang, mari kita lihat bagaimana Git memungkinkan kita menavigasi keadaan masa lalu menggunakan git checkout.
HEAD@{n}: Mengacu pada entri reflog tertentu, di mana n adalah indeksnya. Misalnya, HEAD@{2} mengacu pada keadaan HEAD ketiga yang paling baru.
git checkout HEAD@{2}

Menggunakan git checkout untuk melacak perubahan masa lalu. Gambar oleh Penulis.
branch@{time}: Mengacu pada keadaan sebuah branch pada waktu tertentu. Misalnya, main@{1.week.ago} mengacu pada keadaan branch main satu minggu yang lalu sementara feature@{yesterday} mengacu pada keadaan branch feature kemarin.
git checkout main@{1.week.ago}

Menggunakan git checkout untuk melacak perubahan masa lalu. Gambar oleh Penulis.
Kualifier berbasis waktu
git reflog tidak hanya membantu kita memulihkan keadaan masa lalu, tetapi juga memungkinkan kita membandingkannya. Karena reflog melacak pembaruan referensi, kita dapat menggunakannya untuk melihat bagaimana repositori berubah seiring waktu. Sekarang, mari lihat bagaimana git diff memanfaatkan entri reflog untuk membandingkan keadaan masa lalu dan saat ini.
Berikut adalah contoh kualifier waktu yang memudahkan memulihkan repositori Anda ke titik waktu tertentu alih-alih hanya mengandalkan nomor indeks reflog.
git checkout HEAD@{1.minute.ago} # State from one minute ago
git checkout HEAD@{1.hour.ago} # State from one hour ago
git checkout HEAD@{1.week.ago} # State from one week ago
git checkout HEAD@{yesterday} # State from yesterday
git checkout HEAD@{2024-01-01.12:00:00} # State at a specific timestamp
Membandingkan keadaan masa lalu dengan git diff
Anda dapat membandingkan keadaan masa lalu menggunakan perintah seperti git diff. Perintah berikut membandingkan keadaan saat ini dari branch utama main@{0} dengan keadaannya satu hari yang lalu, main@{1.day.ago}. Output akan menampilkan perbedaan antara kedua snapshot tersebut.
git diff main@{0} main@{1.day.ago}

Membandingkan keadaan masa lalu dengan git diff. Gambar oleh Penulis.
Kasus Penggunaan Umum untuk Git Reflog
Git reflog adalah alat yang sangat berharga untuk memulihkan perubahan yang hilang, membatalkan kesalahan, dan memperbaiki kekeliruan Git yang umum. Di bawah ini beberapa skenario praktis di mana git reflog dapat membantu.
Membatalkan reset yang buruk
Jika Anda keliru me-reset branch menggunakan git reset --hard, Anda dapat menggunakan reflog untuk memulihkan keadaan sebelumnya.
git reset --hard HEAD@{3}
Memulihkan commit yang hilang
Jika Anda tidak sengaja menghapus sebuah branch atau kehilangan commit akibat reset atau rebase, Anda dapat menemukan commit yang hilang menggunakan git reflog.
git reflog
Temukan commit hash dari output reflog dan checkout:
git checkout <commit-hash>
Setelah Anda memverifikasi commit yang hilang, Anda dapat membuat branch baru untuk menyimpannya:
git branch recovered-branch <commit-hash>
Memperbaiki rebase yang berantakan
Jika rebase berjalan tidak semestinya, Anda dapat menggunakan git reflog untuk menemukan commit sebelum rebase dan me-reset branch Anda. Identifikasi commit sebelum rebase dan reset.
git reset --hard HEAD@{3} # Adjust the number based on the reflog output
Memulihkan branch yang terhapus
Jika Anda tidak sengaja menghapus sebuah branch, Anda dapat memulihkannya menggunakan git reflog. Temukan commit terakhir yang diketahui dari branch yang dihapus dan buat kembali:
git branch restored-branch <commit-hash>
Melacak riwayat stash
Git reflog juga dapat digunakan untuk melihat riwayat stash. Perintah di bawah ini mencantumkan operasi stash, memungkinkan Anda memulihkan stash yang lebih lama jika diperlukan.
git reflog stash
Untuk menerapkan entri stash sebelumnya, gunakan perintah berikut:
git stash apply stash@{2}
Lihat tutorial Git Pull Force: How to Overwrite a Local Branch With Remote untuk mempelajari praktik terbaik menimpa perubahan lokal.
Subperintah dan Opsi Git Reflog
Git menyediakan beberapa subperintah dan opsi untuk mengelola dan berinteraksi dengan reflog.
Subperintah git reflog
Di bawah ini adalah rincian terstruktur dari subperintah git reflog utama dan penggunaannya.
git reflog show: Menampilkan entri reflog untuk HEAD secara default atau untuk referensi tertentu seperti sebuah branch.
git reflog show

Menggunakan git reflog show untuk menampilkan entri bagi referensi tertentu. Gambar oleh Penulis.
git reflog list: Perintah ini menampilkan semua referensi dengan reflog. Berguna untuk mengidentifikasi branch dan referensi HEAD dengan entri reflog yang tersimpan.
git reflog list
git reflog delete <ref>@{<specifier>}: Membersihkan entri reflog lama yang melampaui batas waktu yang ditentukan. Misalnya, perintah berikut menghapus entri yang lebih lama dari 30 hari.
git reflog expire --expire=30.days.ago
git reflog delete <ref>@{<specifier>}: Menghapus entri reflog tertentu berdasarkan referensi dan posisinya. Perintah di bawah ini menghapus entri reflog pada indeks 2 untuk HEAD.
git reflog delete HEAD@{2}
git reflog exists <ref>: Memverifikasi apakah reflog ada untuk referensi tertentu. Misalnya, perintah di bawah ini akan berhasil jika branch main memiliki reflog.
git reflog exists main
Opsi untuk subperintah git reflog
Berikut adalah opsi yang tersedia untuk subperintah git reflog dan penggunaannya.
--expire-unreachable=<time>: Memangkas hanya entri reflog yang tidak dapat dijangkau dari referensi mana pun. Misalnya, perintah di bawah ini menghapus entri reflog yang tidak dapat dijangkau dan berusia lebih dari 7 hari.
git reflog expire --expire-unreachable=7.days.ago
--all: Memproses reflog untuk semua referensi, bukan hanya HEAD. Perintah di bawah ini membersihkan semua reflog yang lebih lama dari 60 hari di seluruh branch.
git reflog expire --expire=60.days.ago --all
--dry-run: Mensimulasikan eksekusi perintah, menampilkan apa yang akan dipangkas tanpa benar-benar menghapus apa pun. Misalnya, perintah di bawah ini menampilkan entri mana yang akan dihapus.
git reflog expire --expire=30.days.ago --dry-run
--verbose: Memberikan output terperinci tentang tindakan yang dilakukan oleh perintah. Perintah di bawah ini menampilkan detail verbose saat menghapus entri reflog lama.
git reflog expire --expire=90.days.ago --verbose
Git Reflog vs. Git Log: Perbedaan Utama
Baik git log maupun git reflog memberikan wawasan tentang riwayat repositori, tetapi keduanya memiliki tujuan yang berbeda. Mari kita lihat perbedaan ini untuk memahami bagaimana masing-masing dapat digunakan untuk strategi version control dan pemulihan.
-
git logmenampilkan riwayat commit dengan mengikuti garis keturunan commit dalam sebuah branch. Ini memberikan tampilan kronologis bagaimana konten repositori berkembang. -
git reflogmencatat pembaruan pada referensi seperti HEAD, branch, dan stash, termasuk tindakan seperti perpindahan branch, reset, rebase, dan lainnya. Ini melacak perubahan yang mungkin tidak menjadi bagian dari garis keturunan commit. -
git reflogbersifat lokal di mesin Anda dan tidak dibagikan ke repositori remote. -
Sementara
git logtidak dapat memulihkan commit yang tidak lagi menjadi bagian dari garis keturunan branch,git reflogdapat membantu memulihkan commit yang "hilang" dengan melacak pembaruan referensi, bahkan jika commit tersebut tidak lagi dapat dijangkau dari branch mana pun.
Tabel di bawah ini merangkum perbedaan utama tersebut.
| Feature | git log | git reflog |
|---|---|---|
| Tracks commits | Yes | No |
| Track reference updates | No | Yes |
| Shared in remote | Yes | No |
| Can recover lost commits | No | Yes |
Praktik Terbaik Menggunakan Git Reflog
Git reflog adalah alat yang kuat untuk memulihkan commit yang hilang dan memperbaiki masalah riwayat, tetapi menggunakannya secara efektif memerlukan kehati-hatian. Berikut beberapa praktik terbaik yang perlu diikuti saat bekerja dengan reflog.
-
Gunakan Reflog untuk Pemulihan dan Debugging: Jika Anda tidak sengaja me-reset atau me-rebase sebuah branch secara tidak benar, periksa
git refloguntuk menemukan referensi sebelumnya dan memulihkannya. -
Berhati-hatilah dengan
git reset --hard:git reset --harddapat secara permanen menghapus perubahan yang belum di-commit. Selalu periksa reflog terlebih dahulu untuk memastikan Anda dapat memulihkan jika terjadi kesalahan. -
Simpan Cadangan Sebelum Menjalankan Perintah Destruktif: Untuk melindungi dari kehilangan data, terapkan pencadangan otomatis untuk repositori Git Anda. Selalu simpan cadangan di lokasi yang aman dan terpisah agar dapat dipulihkan jika terjadi kegagalan perangkat keras atau bencana lainnya.
-
Jangan Hanya Mengandalkan Reflog untuk Pemulihan Jangka Panjang: Secara default, entri reflog disimpan selama 90 hari. Setelah periode ini, entri dapat digarbage collect dan tidak dapat dipulihkan. Secara rutin dorong commit Anda ke repositori remote untuk memastikan entri tersebut tersimpan di luar reflog lokal Anda.
-
Gunakan
git reflog expireuntuk Mengelola Entri Lama: Jika reflog repositori Anda menjadi penuh, pangkas entri yang lebih lama atau tidak dapat dijangkau menggunakangit reflog expire.
Kesimpulan
Mengelola riwayat proyek secara efektif di Git memerlukan lebih dari sekadar perintah dasar. Menjelajahi alat tingkat lanjut yang melacak pembaruan referensi dapat memberikan jaring pengaman berharga untuk memulihkan commit yang hilang, memulihkan branch yang terhapus, dan memperbaiki kesalahan. Mendapatkan pengalaman langsung dengan alat-alat ini, bersama perintah seperti git reset, git checkout, dan git revert, dapat secara signifikan meningkatkan kemahiran Anda dalam version control.
Mengikuti kursus kami bukan hanya cara yang bagus untuk belajar tetapi juga cara yang baik untuk memberi sinyal kepada pemberi kerja bahwa Anda serius dengan pengembangan perangkat lunak. Untuk itu, saya merekomendasikan mempelajari posting blog Top 20 Git Interview Questions and Answers for All Levels dan mengikuti skill track baru kami Git Fundamentals untuk menjadi ahli dalam segala hal tentang Git.
git reflog FAQs
Apa itu Git reflog?
Git reflog adalah reference log yang melacak pembaruan pada ujung branch dan HEAD, membantu pengguna memulihkan commit yang hilang dan membatalkan kesalahan.
Apa perbedaan Git reflog dengan Git log?
git log melacak riwayat commit, sedangkan git reflog mencatat perubahan pada referensi seperti HEAD dan branch.
Apakah Git reflog dibagikan dengan repositori remote?
Tidak, git reflog bersifat lokal dan tidak dibagikan saat mendorong ke repositori remote.
Apakah reflog melacak perubahan yang belum di-commit?
Tidak, reflog hanya melacak perubahan referensi dan tidak merekam pekerjaan yang belum di-commit.
Tindakan apa yang membuat entri reflog?
Commit, checkout branch, reset, rebase, merge, dan operasi stash semuanya menghasilkan entri reflog.
Berapa lama entri reflog bertahan?
Secara default, entri reflog kedaluwarsa setelah 90 hari, tetapi hal ini dapat dikonfigurasi.

