Bagaimana algoritma diff berfungsi
Setiap paparan diff pada halaman ini dihasilkan oleh algoritma Myers — teknik 1986 oleh Eugene W. Myers yang mencari skrip edit terpendek antara dua jujukan token dalam masa O((N+M)D), di mana D ialah jarak edit. Algoritma ini dibina berdasarkan masalah Subsequens Lazim Terpanjang, dan enjin berjalan sepenuhnya dalam pelayar anda menggunakan pustaka jsdiff sumber terbuka.
- Tokenkan input — Sebelum membandingkan, algoritma membahagikan setiap input kepada jujukan token. Perincian baris membahagi pada baris baharu; perincian perkataan membahagi pada sempadan ruang putih dan tanda baca; perincian aksara menganggap setiap titik kod Unicode sebagai tokennya sendiri.
- Bina graf edit — Algoritma Myers memodelkan perbandingan sebagai laluan melalui grid 2D di mana bergerak ke kanan bermakna "padam dari asal", bergerak ke bawah bermakna "sisip dari yang diubah", dan bergerak secara pepenjuru bermakna "token sepadan dalam kedua-dua". Algoritma mencari laluan pepenjuru terpendek.
- Ekstrak LCS — Pergerakan pepenjuru dalam jejak laluan terpendek Subsequens Lazim Terpanjang — token yang muncul dalam kedua-dua input dalam susunan relatif yang sama. Setiap token dalam LCS adalah "tidak berubah"; semua yang lain adalah sama ada penambahan atau pemadaman.
- Terapkan pilihan prapemprosesan — Jika anda mendayakan "Abaikan kes", kedua-dua input diturunkan sebelum lulus LCS supaya "HELLO" dan "hello" dikira sebagai sama. "Abaikan ruang putih" menggabungkan berbilang ruang menjadi satu. "Potong setiap baris" membuang ruang putih di hadapan dan di belakang setiap baris sebelum perbandingan.
- Paparkan paparan yang dipilih — Output ialah hasil LCS yang sama dipaparkan tiga cara: Bersebelahan menunjukkan asal di sebelah kiri dan yang diubah di sebelah kanan dalam grid dua lajur dengan sorotan baris merah dan hijau. Bersatu menunjukkan satu lajur dengan baris awalan − dan +, seperti output
git diff. Sebaris menunjukkan pemadaman sebagai coretan merah dan penambahan sebagai garis bawah hijau dalam aliran teks yang sama. - Kira jalur ringkasan — Selepas pemaparan, alat mengira berapa banyak token ditambah, dibuang, dan tidak berubah, kemudian mengira persamaan sebagai nisbah token tidak berubah kepada yang lebih besar antara dua panjang input. Persamaan 100% bermakna input adalah sama selepas prapemprosesan.
Mengapa menggunakan pemeriksa diff
- Semakan kod tanpa klien Git — Tampal dua versi fail konfigurasi, migrasi SQL, atau skrip shell dan lihat apa yang berubah tanpa mengklon repositori, bertukar cabang, atau menunggu saluran paip CI. Alat ini berguna untuk semakan pantas semasa pengaturcaraan berpasangan, untuk penyerahan kontraktor di mana pihak lain tidak berkongsi sejarah Git mereka, dan untuk pangkalan kod warisan yang mendahului kawalan versi sama sekali. Paparan bersatu menghasilkan output yang boleh anda salin terus ke dalam utas sembang atau tiket.
- Redline kontrak dan dokumen — Diff peringkat perkataan menunjukkan istilah mana yang berubah antara draf kontrak lebih pantas daripada panel Track Changes Word. Tampal klausa A dari draf pertama dan klausa B dari salinan yang dilaksanakan dan penggantian menyala merah-pada-hijau pada frasa tepat yang berubah. Pasukan perundangan dan perolehan menggunakan ini untuk mengesahkan redline saat akhir tidak terlepas dari semakan sebelum kontrak ditandatangani.
- Semakan esei dan draf — Penulis yang membandingkan draf pertama dengan versi yang disunting boleh beralih kepada perincian perkataan untuk melihat setiap penggantian, sisipan, dan potongan tanpa membaca semula kedua-dua salinan. Aliran kerja yang sama berfungsi untuk penterjemah yang mengaudit perubahan terhadap teks sumber, untuk editor yang menyemak bahawa suntingan teks mengekalkan suara pengarang, dan untuk pasukan kewartawanan yang menyelaraskan artikel yang diterbitkan dengan draf yang difailkan.
- Perbandingan log dan konfigurasi — Pentadbir sistem yang membandingkan dua syot kilat konfigurasi pelayan, dua jadual cron, atau dua output
ps auxboleh menggunakan perincian baris untuk mencari satu parameter yang diubah dalam fail 200 baris dalam beberapa saat. Padankan dengan pilihan Abaikan-ruang-putih dan diff penjajaran sahaja yang bising runtuh kepada perubahan parameter yang benar-benar penting.
Aplikasi biasa
Diff teks muncul di penghujung setiap kitaran edit dalam kerja penulisan, pembangunan, dan operasi.
- Semakan permintaan tarik: tampal dua pelaksanaan fungsi bersebelahan untuk memahami perubahan logik sebelum meluluskan, tanpa perlu menyemak cabang.
- QA pengantarabangsaan: bandingkan rentetan sumber Bahasa Inggeris dengan padanan yang diterjemahkan di peringkat perkataan untuk mengesan sisipan, peninggalan, atau pertukaran terminologi yang mungkin diperkenalkan oleh penterjemah.
- Analisis insiden: diff dua syot kilat manifes Kubernetes atau dua output "docker inspect" di peringkat baris untuk mengasingkan perubahan konfigurasi yang mendahului gangguan.
Contoh yang dikerjakan
Ambil konfigurasi pelayan lima baris. Asal: host=localhost, port=5432, dbname=app_db, user=app, password=secret. Diubah: host=db.prod.example.com, port=5432, dbname=app_db, user=app_prod, password=secret. Dengan perincian baris dan paparan Bersebelahan, baris 1 menunjukkan merah di sebelah kiri (host=localhost) dan hijau di sebelah kanan (host=db.prod.example.com), baris 4 menunjukkan merah (user=app) dan hijau (user=app_prod), dan baris 2, 3, dan 5 kekal tidak berubah di kedua-dua belah. Jalur ringkasan melaporkan 2 penambahan, 2 pemadaman, 3 tidak berubah, dan persamaan 60% — tiga daripada lima baris dikekalkan. Beralih kepada perincian perkataan dan diff mengecil lebih lanjut: hanya nilai di sebelah kanan = pada baris 1 dan 4 menyala, kunci kekal tidak berubah, dan persamaan meningkat kepada kira-kira 85% kerana LCS kini mengira host, user, dan tanda baca sekeliling sebagai dikekalkan.
Adakah ini berjalan dalam pelayar saya?
Ya. Keseluruhan pengiraan diff berjalan sisi klien menggunakan pustaka sumber terbuka jsdiff yang dimuatkan bersama halaman. Tiada apa yang anda taip, tampal, atau bandingkan dihantar ke mana-mana pelayan. Anda boleh mengesahkannya sendiri: buka DevTools pelayar, beralih ke tab Rangkaian, kosongkan log, klik Bandingkan, dan sahkan bahawa sifar permintaan rangkaian berlaku untuk langkah perbandingan.
Apakah maksud peratusan persamaan?
Persamaan dikira sebagai token tidak berubah / max(jumlah token dalam asal, jumlah token dalam yang diubah). Skor 100% bermakna kedua-dua input adalah sama selepas menerapkan pilihan prapemprosesan anda (lipatan kes, penggabungan ruang putih, pemotongan baris). Skor 0% bermakna tiada token dikongsi antara input. Metrik ini ialah anggaran kasar jarak edit — berguna sebagai ukuran pantas — bukan skor plagiat atau keaslian.
Bolehkah saya membuat diff JSON / YAML / XML secara semantik?
Tidak dalam alat ini. Ini ialah diff peringkat teks, jadi pemformatan semula JSON atau XML dengan hanya ruang putih masih menunjukkan banyak perubahan walaupun data adalah sama secara logik. Menyusun semula kunci objek dalam JSON juga menunjukkan perubahan walaupun kebanyakan penghurai menganggap susunan kunci sebagai tidak penting. Untuk diff semantik sebenar yang membandingkan pokok objek yang dihurai dan mengabaikan susunan kunci dan pemformatan, kami merancang alat JSON Diff yang khusus. Buat masa ini, normalkan kedua-dua input kepada inden dan susunan kunci yang sama sebelum menampalnya di sini.
Bagaimana paparan bersatu berbeza daripada bersebelahan?
Bersebelahan memaparkan dua lajur: asal di sebelah kiri dan versi yang diubah di sebelah kanan, dengan baris yang dibuang disorot merah di sebelah kiri dan baris yang ditambah disorot hijau di sebelah kanan. Baris yang tidak berubah muncul dalam kedua-dua lajur diselaraskan pada baris yang sama. Bersatu memaparkan satu lajur dengan awalan − dan latar belakang merah untuk baris yang dibuang dan awalan + dan latar belakang hijau untuk baris yang ditambah — susun atur yang sama yang dicetak oleh git diff ke terminal anda. Gunakan bersatu apabila anda ingin menyalin hasil sebagai fail patch atau menampalnya ke dalam utas semakan kod. Gunakan bersebelahan apabila penjajaran visual tentang apa yang menggantikan apa lebih penting daripada teks patch mentah.
Tampal asal di sebelah kiri, versi yang diubah di sebelah kanan, pilih paparan dan perincian, dan perbandingan muncul dalam milisaat. Hidupkan Mod langsung dan diff dijalankan semula pada setiap ketukan kekunci semasa anda mengedit mana-mana bahagian. Muat turun hasil sebagai fail .patch bersatu piawai yang digunakan terus oleh git apply. Tiada muat naik, tiada akaun, tiada kunci API vendor, tiada kuota.