guide/diff-algorithms.md

Myers, Patience, Histogram — Perbandingan Algoritma diff

Cara kerja tiap pilihan opsi --diff-algorithm pada git diff (myers, minimal, patience, histogram) dan mengapa hasilnya berbeda, lengkap dengan contoh.

Terakhir diperbarui: 2026-09-23

Meskipun dua file yang dibandingkan sama, hasilnya bisa berbeda tergantung algoritma diff yang dipakai. Semuanya diff yang "benar", tetapi karena berbeda dalam memilih baris mana yang dipasangkan sebagai sama, tingkat keterbacaannya pun berbeda. git menyediakan empat pilihan lewat opsi --diff-algorithm.

NilaiPenjelasan di dokumentasi gitCiri
myers (default)Algoritma serakah (greedy) dasar, bawaan saat iniCepat dan umumnya mendekati minimal
minimalMeluangkan waktu ekstra untuk menghasilkan diff terkecilSelalu minimal, bisa lambat pada masukan besar
patienceAlgoritma patience diffMenjadikan baris unik sebagai titik acuan
histogramMemperluas patience agar mendukung elemen bersama yang jarang munculMenjadikan baris yang jarang muncul sebagai titik acuan

Ada juga bentuk singkat seperti git diff --patience dan git diff --histogram, dan nilai bawaannya bisa diganti dengan git config diff.algorithm histogram.

Myers: bawaan yang mencari edit minimal

Algoritma Myers mencari jalur dengan jumlah penghapusan dan penambahan paling sedikit (prinsipnya lihat Cara kerja diff). Masalahnya muncul ketika ada beberapa pilihan baris mana yang dianggap sama. Dalam kode banyak sekali baris yang sangat umum seperti }, {, baris kosong, dan return, sehingga algoritma bisa memasangkan baris yang maknanya tidak berhubungan, sementara jumlah editnya tetap minimal.

Satu perubahan, dua hasil

Misalkan Anda menyisipkan fungsi baru h di antara fungsi f dan g. Kedua diff berikut sama-sama berisi 4 baris tambahan, jadi jumlah editnya sama.

@@ -1,6 +1,10 @@ int f() {     return 1; }++int h() {+    return 3;+}  int g() {     return 2;
@@ -1,5 +1,9 @@ int f() {     return 1;+}++int h() {+    return 3; }  int g() {

Pada yang pertama, fungsi baru terlihat utuh, sedangkan pada yang kedua kurung penutup milik fungsi lama f dianggap sebagai kurung fungsi baru sehingga bagian tambahannya terpotong secara janggal. Bentuk seperti ini muncul karena urutan pencarian, dan git versi terbaru memperbaiki sebagian besarnya dengan heuristik yang menggeser batas blok perubahan berdasarkan indentasi agar mudah dibaca (--indent-heuristic, aktif secara bawaan).

Patience: cocokkan baris unik lebih dulu

Patience diff diusulkan oleh Bram Cohen. Algoritma ini lebih dulu mencari baris yang muncul tepat satu kali di masing-masing file, karena pasangan baris unik seperti deklarasi fungsi int h() { sudah pasti. Dari baris-baris unik itu dipilih daftar terpanjang yang urutannya konsisten (subbarisan naik terpanjang) sebagai titik acuan, lalu hanya bagian kecil di antara titik acuan yang dibandingkan ulang.

Histogram: dahulukan baris yang jarang muncul

Algoritma histogram dikembangkan di JGit (implementasi git dalam Java) lalu dimasukkan ke git. Berbeda dengan patience yang hanya melihat "baris yang muncul tepat satu kali", histogram menghitung berapa kali setiap baris muncul dan memilih yang paling jarang sebagai titik acuan. Karena itu, meskipun tidak ada baris unik, ia tetap bisa berpegang pada baris yang relatif jarang. Dokumentasi git menjelaskannya sebagai "memperluas algoritma patience untuk mendukung elemen bersama yang jarang muncul". Dalam praktik, seperti patience, algoritma ini sering menghasilkan diff yang menjaga struktur kode dengan baik.

Mana yang dipakai

Algoritma mana pun yang dipakai, file hasilnya dipulihkan dengan cara yang sama. Yang berbeda hanya tampilan yang dibaca manusia.

Di alat ini

Situs ini membandingkan baris dengan algoritma keluarga Myers, lalu memasangkan baris yang berubah berdasarkan kemiripan isinya sebagai "diubah" dan membandingkan ulang isinya. Jadi meskipun hasil per baris sedikit terpotong janggal, kata yang berubah langsung terlihat. Masukkan contoh di atas ke Pembanding Teks dan bandingkan tampilannya dalam mode gabungan dan berdampingan. Cara membaca hasilnya dirangkum di Cara membaca unified diff.

Buka pembanding teks