Di Halaman Ini
git log
Ringkasnya: git log adalah alat utama Git untuk mengaudit riwayat proyek. Perintah ini menelusuri graf berarah tanpa siklus (Directed Acyclic Graph/DAG) commit dengan memulai dari titik checkout saat ini (HEAD), membaca hash parent-nya, lalu berjalan mundur secara rekursif hingga commit root pertama. Perintah ini adalah alat pencarian dan analisis yang andal, bukan sekadar daftar berbasis teks.
Catatan tentang hash di bawah: ID commit dan tree dalam pelajaran ini hanyalah contoh. Hash commit dihitung dari tree, parent, identitas author/committer, dan stempel waktu commit—jadi jika Anda menjalankan perintah yang sama, struktur grafnya akan sama tetapi ID-nya berbeda. Stempel waktu ditampilkan sebagai detik Unix epoch dengan offset
+0000(UTC).
Apa Sebenarnya yang Dilakukan git log?
Untuk memahami cara git log menghasilkan riwayat, Anda perlu melihat cara Git mengatur commit. Git tidak menyimpan commit dalam daftar atau array datar. Sebaliknya, Git menyusunnya sebagai graf berarah tanpa siklus (Directed Acyclic Graph/DAG).
Dalam graf ini:
- Simpul: Ini adalah objek commit Anda.
- Sisi: Ini adalah penunjuk dari commit anak ke parent-nya. Sisi bersifat berarah (menunjuk mundur dalam waktu) dan asiklik (riwayat tidak dapat berputar kembali ke dirinya sendiri).
graph RL
C3[Commit 3<br>HEAD / main] -->|parent| C2[Commit 2]
C2 -->|parent| C1[Commit 1<br>Root Commit]
Saat Anda menjalankan git log, Git tidak memindai seluruh disk. Git menelusuri graf mulai dari titik masuk tertentu—secara default, commit yang ditunjuk oleh HEAD (lokasi Anda saat ini, tautan git-checkout).
Algoritme Penelusuran
- Git membaca file
.git/HEADuntuk menentukan branch aktif Anda (misalnya,ref: refs/heads/main). - Git menyelesaikan referensi branch aktif menjadi hash commit 40 karakter dengan membaca
.git/refs/heads/main(misalnya,8a4c10...). - Git memuat object commit
8a4c10...dari database object (.git/objects/) dan mengekstrak metadata: author, committer, timestamp, dan message, serta hashparent. - Git menampilkan detail commit ini di konsol Anda.
- Git memasukkan hash parent (misalnya,
55a420...) ke antrean penelusuran. - Perulangan berulang: Git mengambil hash commit berikutnya dari antrean, membacanya, menampilkannya, lalu memasukkan parent-nya ke antrean.
- Penelusuran berhenti ketika commit tidak memiliki field
parent, yang menandakan commit pertama repository (commit root).
Dalam kasus merge commit, object commit mencantumkan beberapa baris parent. Git menanganinya dengan memasukkan semua hash parent ke antrean. Bergantung pada pengaturan pengurutan (misalnya kronologis, topologis, atau berdasarkan tanggal), Git akan menyisipkan commit dari branch yang digabungkan untuk menyusun kembali linimasa terpadu.
Apa yang Terjadi di Dalam .git/ (Eksplorasi Praktis)
Mari buat repository yang berisi beberapa commit dan branch, lalu telusuri secara tepat cara Git mengurai file-file tersebut untuk menghasilkan keluaran git log.
Langkah 1: Siapkan Repository dengan Beberapa Commit
Mari inisialisasi repository dan buat dua commit cepat di branch main.
$ mkdir git-log-demo && cd git-log-demo
$ git init
Initialized empty Git repository in /git-log-demo/.git/
$ echo "v1" > file.txt
$ git add file.txt
$ git commit -m "First commit"
[main (root-commit) 5be36ab] First commit
$ echo "v2" > file.txt
$ git add file.txt
$ git commit -m "Second commit"
[main ae39f81] Second commit
Langkah 2: Buat Branch dan Merge Commit
Sekarang, mari buat branch bernama feature (tautan git-branch), buat commit, kembali ke branch sebelumnya, lalu gabungkan branch tersebut.
$ git checkout -b feature
Switched to a new branch 'feature'
$ echo "feature-work" > feature.txt
$ git add feature.txt
$ git commit -m "Feature commit"
[feature c4f8101] Feature commit
$ git checkout main
Switched to branch 'main'
$ git merge feature -m "Merge feature branch"
Merge made by the 'ort' strategy.
feature.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 feature.txt
Langkah 3: Selesaikan ref dan catat commit
Mari lihat ke mana HEAD menunjuk saat ini:
$ cat .git/HEAD
ref: refs/heads/main
Sekarang mari lihat hash commit yang ditunjuk main:
$ cat .git/refs/heads/main
6df8d0354178de3d038fa61dfb63e8a157580b33
Inilah merge commit kita. Mari lihat objek commit ini menggunakan perintah plumbing git cat-file:
$ git cat-file -p 6df8d0354178de3d038fa61dfb63e8a157580b33
tree e7c3909ea1dc725f187e1451f2ad490e5b0213ef
parent ae39f81ca99d45e5b619d854cf78d1f2a36b1d2e
parent c4f810129a8a72cf5a1db5b2f270a2936274b1e2
author Purna Pattela <purna@example.com> 1772960500 +0000
committer Purna Pattela <purna@example.com> 1772960500 +0000
Merge feature branch
Perhatikan bahwa karena ini adalah merge commit, commit ini memiliki dua parent:
parent ae39f81...(commit terakhir dimainsebelum merge).parent c4f8101...(commit dari branchfeature).
Jika kita menjalankan git log, Git akan menampilkan merge commit (6df8d03), lalu membaca parent-nya. Git menelusuri parent ae39f81 dan c4f8101 dalam urutan kronologis. Mari periksa ae39f81:
$ git cat-file -p ae39f81ca99d45e5b619d854cf78d1f2a36b1d2e
tree b4f93dc52c0dfa6c7f8a9a2a6dfba1d2a36b567d
parent 5be36abc0e9df7f2a7db2e9b0cf2a3d2427a1d1e
author Purna Pattela <purna@example.com> 1772960400 +0000
committer Purna Pattela <purna@example.com> 1772960400 +0000
Second commit
Commit ini menunjuk ke parent pertama 5be36ab.... Mari periksa 5be36ab:
$ git cat-file -p 5be36abc0e9df7f2a7db2e9b0cf2a3d2427a1d1e
tree f3b3a3c9e6db5832a875a6c11d2b270a2936274b
author Purna Pattela <purna@example.com> 1772960300 +0000
committer Purna Pattela <purna@example.com> 1772960300 +0000
First commit
Karena 5be36ab... tidak memiliki baris parent, Git mengetahui bahwa commit ini adalah root tree kita dan menghentikan penelusuran. Keluaran log yang dihasilkan mencantumkan keempat commit dalam urutan kronologis terbalik.
Opsi Perintah Terperinci dan Penggunaan Lanjutan
Keluaran default git log bersifat panjang dan berurutan. Anda dapat memformat, memfilter, dan menelusuri riwayat menggunakan flag.
1. Opsi Pemformatan Lanjutan
--oneline
Meringkas setiap commit menjadi satu baris yang berisi hash commit singkat dan baris subjek. Ini ideal untuk menelusuri riwayat commit dengan cepat.
$ git log --oneline
6df8d03 Merge feature branch
c4f8101 Feature commit
ae39f81 Second commit
5be36ab First commit
--graph --decorate
Menggambar representasi ASCII jalur eksekusi branch beserta label branch (HEAD, nama branch, tag).
$ git log --graph --oneline --decorate --all
* 6df8d03 (HEAD -> main) Merge feature branch
|\
| * c4f8101 (feature) Feature commit
* | ae39f81 Second commit
|/
* 5be36ab First commit
Format Kustom (--pretty=format:)
Anda dapat merancang templat keluaran sendiri menggunakan placeholder. Misalnya, untuk hanya mencetak hash, nama author, tanggal, dan pesan commit:
$ git log --pretty=format:"%h - %an (%ar): %s"
6df8d03 - Purna Pattela (2 minutes ago): Merge feature branch
c4f8101 - Purna Pattela (5 minutes ago): Feature commit
Placeholder utama mencakup:
%h: Hash commit singkat.%an: Nama author.%ar: Tanggal author (relatif, misalnya “3 hari yang lalu”).%ad: Tanggal author (format absolut).%s: Baris subjek (baris pertama pesan commit).%d: Dekorasi ref (misalnya(HEAD -> main)).
2. Pemfilteran Riwayat untuk Investigasi
Mencari berdasarkan perubahan kode (Pickaxe -S)
Jika Anda ingin mengetahui commit mana yang menambahkan atau menghapus string teks tertentu (seperti nama fungsi atau endpoint API) dari basis kode, gunakan flag -S:
$ git log -S "payment_processor_v2" --oneline
Fitur ini disebut Pickaxe. Fitur ini mencari isi file pada setiap keadaan commit, bukan hanya teks dalam pesan commit.
Mencari berdasarkan pesan commit (--grep)
Untuk hanya mencari kata kunci dalam pesan commit:
$ git log --grep="bugfix"
Memfilter berdasarkan path
Untuk hanya melihat commit yang mengubah file atau folder tertentu, tambahkan dua tanda hubung diikuti path file:
$ git log --oneline -- src/utils/helper.js
Skenario Dunia Nyata: Men-debug Regresi
Bayangkan tim Anda menerapkan versi baru aplikasi, lalu pengguna melaporkan bahwa aplikasi mengalami crash ketika mereka mengeklik tombol “Submit”. Anda tahu tombol itu berfungsi baik seminggu lalu.
Untuk menemukan penyebabnya, Anda dapat menggabungkan filter riwayat:
# Step 1: List all commits from the last week that modified the checkout button component
$ git log --since="1 week ago" --oneline -- src/components/SubmitButton.js
a3d5f9c refactor: rewrite submit click handler
54f8b9e chore: update button styling
# Step 2: Show the actual code modifications in the suspicious commit (a3d5f9c)
$ git log -p -1 a3d5f9c
Dengan flag patch -p, Anda meninjau perubahan persis pada fungsi handler, menemukan parameter event yang hilang, lalu membuat hotfix.
Jebakan dan Kesalahan Umum
1. Terjebak di Pager
Secara default, jika keluaran log lebih panjang daripada tinggi layar, Git mengalirkan keluaran ke utilitas pager (biasanya less). Pemula sering tidak tahu cara kembali ke terminal biasa.
- Solusi: Tekan
quntuk keluar dari pager. - Tips: Jika Anda ingin Git mencetak keluaran langsung ke terminal tanpa membuka pager, atur konfigurasi pager ke
cat:
$ git --no-pager log -n 5
2. Commit dari Branch Lain Tidak Muncul
Menjalankan git log hanya menampilkan commit yang dapat dijangkau dari riwayat branch saat ini. Jika Anda berada di main dan orang lain mendorong perubahan ke feature-b, commit tersebut tidak akan terlihat.
- Solusi: Gunakan flag
--alluntuk menampilkan semua commit di semua branch:
$ git log --oneline --all --graph
3. Menyamakan git log dengan git reflog
Jika Anda menjalankan rebase (tautan git-rebase) atau reset commit, commit tersebut dihapus dari riwayat branch dan tidak akan lagi muncul di git log.
- Mengapa:
git loghanya menelusuri pointer aktif. - Solusi: Gunakan
git reflog. Reference log melacak setiap perubahan pada pointer HEAD di mesin lokal Anda (termasuk perpindahan checkout, amend, reset, dan rebase). Ini adalah jaring pengaman utama untuk memulihkan commit yang “dihapus”.
Referensi Cepat Perintah
| Perintah | Tindakan |
|---|---|
git log | Menampilkan seluruh riwayat commit (hash, author, tanggal, pesan). |
git log --oneline | Menampilkan ringkasan satu baris per commit. |
git log --graph --oneline --all | Menampilkan pohon visual semua branch dan merge. |
git log -p | Menampilkan patch (diff kode) yang diperkenalkan setiap commit. |
git log -n <limit> | Membatasi keluaran ke jumlah commit yang ditentukan (misalnya -n 5). |
git log --author="Name" | Memfilter riwayat berdasarkan nama author. |
git log --grep="pattern" | Memfilter commit berdasarkan kata kunci dalam pesan. |
git log -S "code" | Menemukan commit yang menambahkan atau menghapus baris atau kata kode tertentu. |
git log --no-merges | Mengecualikan merge commit dari log riwayat. |
FAQ (Pertanyaan yang Sering Diajukan)
Mengapa commit saya tidak muncul di git log?
Jika Anda baru saja menjalankan git commit tetapi commit tersebut tidak muncul di log, periksa hal-hal berikut:
- Pemeriksaan staging: Apakah Anda menjalankan
git addsebelum commit? Jika tidak, commit mungkin ditolak karena tidak ada yang dipentaskan. - Detached HEAD: Jika Anda berada dalam keadaan detached HEAD, commit Anda tidak terkait dengan branch. Jika Anda checkout
main, commit tersebut akan tampak hilang dari log. Jalankangit refloguntuk menemukan hash yang hilang.
Apa perbedaan tanggal author dan tanggal committer?
- Tanggal author: Stempel waktu saat commit awalnya dibuat (misalnya menggunakan
git commit). - Tanggal committer: Stempel waktu saat commit terakhir kali ditulis ke repository (misalnya ketika di-cherry-pick, di-rebase, atau di-amend).
- Secara default,
git logmenampilkan tanggal author. Untuk melihat tanggal committer, gunakan:git log --pretty=fuller.
Bagaimana cara melihat siapa yang mengubah baris tertentu dalam file?
Meskipun git log -S dapat menemukan commit yang memperkenalkan string, git blame <file> adalah cara tercepat untuk melihat atribusi setiap baris. Perintah ini menampilkan hash commit, nama author, dan stempel waktu untuk setiap baris file.
Bagaimana cara mencari riwayat commit dalam rentang tanggal tertentu?
Anda dapat menggabungkan flag --since (atau --after) dan --until (atau --before):
$ git log --since="2026-06-01" --until="2026-07-01" --oneline
Git juga mengurai tanggal relatif yang mudah dipahami, seperti --since="3 weeks ago" atau --until="yesterday".
Uji Pengetahuan Anda
Memuat kuis…