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

  1. Git membaca file .git/HEAD untuk menentukan branch aktif Anda (misalnya, ref: refs/heads/main).
  2. Git menyelesaikan referensi branch aktif menjadi hash commit 40 karakter dengan membaca .git/refs/heads/main (misalnya, 8a4c10...).
  3. Git memuat object commit 8a4c10... dari database object (.git/objects/) dan mengekstrak metadata: author, committer, timestamp, dan message, serta hash parent.
  4. Git menampilkan detail commit ini di konsol Anda.
  5. Git memasukkan hash parent (misalnya, 55a420...) ke antrean penelusuran.
  6. Perulangan berulang: Git mengambil hash commit berikutnya dari antrean, membacanya, menampilkannya, lalu memasukkan parent-nya ke antrean.
  7. 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 di main sebelum merge).
  • parent c4f8101... (commit dari branch feature).

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 q untuk 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 --all untuk 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 log hanya 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

PerintahTindakan
git logMenampilkan seluruh riwayat commit (hash, author, tanggal, pesan).
git log --onelineMenampilkan ringkasan satu baris per commit.
git log --graph --oneline --allMenampilkan pohon visual semua branch dan merge.
git log -pMenampilkan 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-mergesMengecualikan 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:

  1. Pemeriksaan staging: Apakah Anda menjalankan git add sebelum commit? Jika tidak, commit mungkin ditolak karena tidak ada yang dipentaskan.
  2. 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. Jalankan git reflog untuk 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 log menampilkan 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…