Πώς λειτουργούν οι αλγόριθμοι diff
Κάθε προβολή diff σε αυτή τη σελίδα παράγεται από τον αλγόριθμο Myers — μια τεχνική του 1986 από τον Eugene W. Myers που βρίσκει το συντομότερο σενάριο επεξεργασίας μεταξύ δύο ακολουθιών διακριτικών σε χρόνο O((N+M)D), όπου D είναι η απόσταση επεξεργασίας. Ο αλγόριθμος είναι χτισμένος γύρω από το πρόβλημα Longest Common Subsequence και η μηχανή τρέχει εξ ολοκλήρου στο πρόγραμμα περιήγησής σας χρησιμοποιώντας τη βιβλιοθήκη ανοιχτού κώδικα jsdiff.
- Tokenize τις εισόδους — Πριν από τη σύγκριση, ο αλγόριθμος χωρίζει κάθε είσοδο σε μια ακολουθία διακριτικών. Η ανάλυση γραμμής χωρίζει σε νέες γραμμές· η ανάλυση λέξης χωρίζει σε όρια λευκού διαστήματος και στίξης· η ανάλυση χαρακτήρα αντιμετωπίζει κάθε κωδικό σημείο Unicode ως το δικό του διακριτικό.
- Χτίστε το γράφημα επεξεργασίας — Ο αλγόριθμος Myers μοντελοποιεί τη σύγκριση ως μια διαδρομή μέσω ενός 2D πλέγματος όπου η κίνηση δεξιά σημαίνει «διαγραφή από το πρωτότυπο», η κίνηση κάτω σημαίνει «εισαγωγή από το αλλαγμένο» και η κίνηση διαγώνια σημαίνει «το διακριτικό ταιριάζει και στα δύο». Ο αλγόριθμος βρίσκει τη συντομότερη διαδρομή με πολλές διαγώνιες.
- Εξαγωγή του LCS — Οι διαγώνιες κινήσεις στη συντομότερη διαδρομή ανιχνεύουν τη Longest Common Subsequence — τα διακριτικά που εμφανίζονται και στις δύο εισόδους στην ίδια σχετική σειρά. Κάθε διακριτικό στο LCS είναι «αμετάβλητο»· οτιδήποτε άλλο είναι είτε προσθήκη είτε διαγραφή.
- Εφαρμογή επιλογών προεπεξεργασίας — Αν ενεργοποιήσετε «Αγνόηση πεζών/κεφαλαίων», και οι δύο είσοδοι γίνονται πεζά πριν από το πέρασμα LCS, ώστε το «HELLO» και το «hello» να μετρήσουν ως πανομοιότυπα. «Αγνόηση λευκού διαστήματος» συμπτύσσει πολλά κενά σε ένα. «Περικοπή κάθε γραμμής» αφαιρεί το μπροστινό και πίσω λευκό διάστημα ανά γραμμή πριν από τη σύγκριση.
- Απόδοση της επιλεγμένης προβολής — Η έξοδος είναι το ίδιο αποτέλεσμα LCS που εμφανίζεται με τρεις τρόπους: Side-by-side δείχνει το πρωτότυπο αριστερά και το αλλαγμένο δεξιά σε ένα πλέγμα δύο στηλών με κόκκινες και πράσινες επισημάνσεις γραμμών. Unified δείχνει μια μόνο στήλη με γραμμές προθέματος − και +, όπως η έξοδος του
git diff. Inline δείχνει διαγραφές ως κόκκινη διαγράμμιση και προσθήκες ως πράσινη υπογράμμιση στην ίδια ροή κειμένου. - Υπολογισμός της λωρίδας σύνοψης — Μετά την απόδοση, το εργαλείο μετρά πόσα διακριτικά προστέθηκαν, αφαιρέθηκαν και παρέμειναν αμετάβλητα, στη συνέχεια υπολογίζει την ομοιότητα ως την αναλογία αμετάβλητων διακριτικών προς το μεγαλύτερο από τα δύο μήκη εισόδου. Μια ομοιότητα 100% σημαίνει ότι οι είσοδοι είναι ταυτόσημες μετά την προεπεξεργασία.
Γιατί να χρησιμοποιήσετε ένα diff checker
- Αναθεώρηση κώδικα χωρίς Git client — Επικολλήστε δύο εκδόσεις ενός αρχείου διαμόρφωσης, μιας μετεγκατάστασης SQL ή ενός shell script και δείτε τι άλλαξε χωρίς να κάνετε clone ενός repo, να αλλάξετε κλαδιά ή να περιμένετε έναν αγωγό CI. Το εργαλείο είναι χρήσιμο για γρήγορες αναθεωρήσεις κατά τη διάρκεια pair programming, για παραδόσεις εργολάβων όπου η άλλη πλευρά δεν έχει μοιραστεί την ιστορία Git της και για παλαιότερα αποθετήρια που προϋπήρχαν του ελέγχου εκδόσεων.
- Κόκκινες γραμμές συμβολαίων και εγγράφων — Το diff σε επίπεδο λέξης δείχνει ποιοι όροι μετατοπίστηκαν μεταξύ προσχεδίων συμβολαίου γρηγορότερα από τον πίνακα Track Changes του Word. Επικολλήστε τη ρήτρα Α από το πρώτο προσχέδιο και τη ρήτρα Β από το υπογεγραμμένο αντίγραφο και η αντικατάσταση φωτίζεται κόκκινο-σε-πράσινο στην ακριβή φράση που μετακινήθηκε. Οι δικηγορικοί βοηθοί και οι ομάδες προμηθειών το χρησιμοποιούν για να επαληθεύσουν ότι οι κόκκινες γραμμές της τελευταίας στιγμής δεν γλίστρησαν από την αναθεώρηση πριν υπογραφεί ένα συμβόλαιο.
- Αναθεωρήσεις δοκιμίων και προσχεδίων — Οι συγγραφείς που συγκρίνουν ένα πρώτο προσχέδιο με μια επεξεργασμένη έκδοση μπορούν να μεταβούν σε ανάλυση λέξης για να δουν κάθε αντικατάσταση, εισαγωγή και περικοπή χωρίς να ξαναδιαβάσουν και τα δύο αντίγραφα. Η ίδια ροή εργασίας λειτουργεί για μεταφραστές που ελέγχουν αλλαγές έναντι του πηγαίου κειμένου, για συντάκτες που ελέγχουν ότι μια επιμέλεια κειμένου διατήρησε τη φωνή του συγγραφέα και για ομάδες δημοσιογραφίας που συμφιλιώνουν ένα δημοσιευμένο άρθρο με το κατατεθέν προσχέδιο.
- Σύγκριση αρχείων καταγραφής και διαμόρφωσης — Οι διαχειριστές συστημάτων που συγκρίνουν δύο στιγμιότυπα διαμόρφωσης διακομιστή, δύο χρονοδιαγράμματα cron ή δύο εξόδους
ps auxμπορούν να χρησιμοποιήσουν ανάλυση γραμμής για να εντοπίσουν τη μοναδική αλλαγή παραμέτρου σε ένα αρχείο 200 γραμμών σε δευτερόλεπτα. Συνδυάστε το με την επιλογή Αγνόησης λευκού διαστήματος και ένα θορυβώδες diff μόνο με στοίχιση συμπτύσσεται στις αλλαγές παραμέτρων που έχουν πραγματικά σημασία.
Συνήθεις εφαρμογές
Το diff κειμένου εμφανίζεται στο τέλος κάθε κύκλου επεξεργασίας σε εργασίες γραφής, ανάπτυξης και λειτουργιών.
- Αναθεώρηση PR: επικολλήστε δύο υλοποιήσεις συναρτήσεων δίπλα-δίπλα για να κατανοήσετε την αλλαγή λογικής πριν εγκρίνετε, χωρίς την επιβάρυνση του checkout του κλαδιού.
- Διασφάλιση ποιότητας διεθνοποίησης: συγκρίνετε μια αγγλική συμβολοσειρά πηγής με το μεταφρασμένο ισοδύναμό της σε επίπεδο λέξης για να ανιχνεύσετε εισαγωγές, παραλείψεις ή αλλαγές ορολογίας που μπορεί να έχει εισαγάγει ο μεταφραστής.
- Ανάλυση περιστατικών: κάντε diff δύο στιγμιότυπων μανιφέστου Kubernetes ή δύο εξόδων «docker inspect» σε επίπεδο γραμμής για να απομονώσετε την αλλαγή διαμόρφωσης που προηγήθηκε μιας διακοπής υπηρεσίας.
Ένα παράδειγμα
Πάρτε μια διαμόρφωση διακομιστή πέντε γραμμών. Πρωτότυπο: host=localhost, port=5432, dbname=app_db, user=app, password=secret. Αλλαγμένο: host=db.prod.example.com, port=5432, dbname=app_db, user=app_prod, password=secret. Με ανάλυση γραμμής και προβολή Side-by-side, η γραμμή 1 δείχνει κόκκινο αριστερά (host=localhost) και πράσινο δεξιά (host=db.prod.example.com), η γραμμή 4 δείχνει κόκκινο (user=app) και πράσινο (user=app_prod) και οι γραμμές 2, 3 και 5 παραμένουν αμετάβλητες. Η λωρίδα σύνοψης αναφέρει 2 προσθήκες, 2 διαγραφές, 3 αμετάβλητα και ομοιότητα 60% — τρεις από τις πέντε γραμμές παρέμειναν. Μεταβείτε σε ανάλυση λέξης και το diff γίνεται ακόμα πιο σφιχτό: μόνο οι τιμές στα δεξιά του = στις γραμμές 1 και 4 φωτίζονται, τα κλειδιά παραμένουν αμετάβλητα και η ομοιότητα ανεβαίνει σε περίπου 85% επειδή το LCS μετρά τώρα host, user και τα γύρω σημεία στίξης ως διατηρημένα.
Αυτό τρέχει στο πρόγραμμα περιήγησής μου;
Ναι. Ολόκληρος ο υπολογισμός diff τρέχει από την πλευρά του πελάτη χρησιμοποιώντας τη βιβλιοθήκη ανοιχτού κώδικα jsdiff που φορτώνεται με τη σελίδα. Τίποτα από όσα πληκτρολογείτε, επικολλάτε ή συγκρίνετε δεν αποστέλλεται σε κανέναν διακομιστή. Μπορείτε να το επαληθεύσετε μόνοι σας: ανοίξτε τα DevTools του προγράμματος περιήγησης, μεταβείτε στην καρτέλα Δικτύου, εκκαθαρίστε το αρχείο καταγραφής, κάντε κλικ στο Σύγκριση και επιβεβαιώστε ότι δεν εκτελούνται μηδενικά αιτήματα δικτύου για το βήμα σύγκρισης.
Τι σημαίνει το ποσοστό ομοιότητας;
Η ομοιότητα υπολογίζεται ως αμετάβλητα διακριτικά / max(σύνολο διακριτικών στο πρωτότυπο, σύνολο διακριτικών στο αλλαγμένο). Μια βαθμολογία 100% σημαίνει ότι οι δύο είσοδοι είναι ταυτόσημες μετά την εφαρμογή των επιλογών προεπεξεργασίας σας (αναδίπλωση πεζών/κεφαλαίων, σύμπτυξη λευκού διαστήματος, περικοπή γραμμών). Μια βαθμολογία 0% σημαίνει ότι κανένα διακριτικό δεν μοιράζεται μεταξύ των εισόδων. Η μετρική είναι μια χονδρική προσέγγιση της απόστασης επεξεργασίας — χρήσιμη ως γρήγορος δείκτης — όχι μια βαθμολογία λογοκλοπής ή πρωτοτυπίας.
Μπορώ να κάνω diff JSON / YAML / XML σημασιολογικά;
Όχι σε αυτό το εργαλείο. Αυτό είναι ένα diff σε επίπεδο κειμένου, οπότε η αναδιαμόρφωση μόνο με λευκό διάστημα JSON ή XML εξακολουθεί να δείχνει πολλές αλλαγές ακόμα κι όταν τα δεδομένα είναι λογικά ταυτόσημα. Η αναδιάταξη κλειδιών αντικειμένων σε JSON εμφανίζεται επίσης ως αλλαγές παρόλο που οι περισσότεροι αναλυτές αντιμετωπίζουν τη σειρά των κλειδιών ως ασήμαντη. Για ένα πραγματικό σημασιολογικό diff που συγκρίνει αναλυόμενα δέντρα αντικειμένων και αγνοεί τη σειρά κλειδιών και τη μορφοποίηση, σχεδιάζουμε ένα αποκλειστικό εργαλείο JSON Diff. Προς το παρόν, κανονικοποιήστε και τις δύο εισόδους στην ίδια εσοχή και σειρά κλειδιών πριν τις επικολλήσετε εδώ.
Πώς διαφέρουν οι προβολές unified και side-by-side;
Το Side-by-side εμφανίζει δύο στήλες: το πρωτότυπο αριστερά και την αλλαγμένη έκδοση δεξιά, με τις αφαιρεθείσες γραμμές τονισμένες με κόκκινο αριστερά και τις προστεθείσες γραμμές τονισμένες με πράσινο δεξιά. Οι αμετάβλητες γραμμές εμφανίζονται και στις δύο στήλες ευθυγραμμισμένες στην ίδια γραμμή. Το Unified εμφανίζει μια μόνο στήλη με ένα πρόθεμα − και κόκκινο φόντο για αφαιρεθείσες γραμμές και ένα πρόθεμα + και πράσινο φόντο για προστεθείσες γραμμές — την ίδια διάταξη που εκτυπώνει το git diff στο τερματικό σας. Χρησιμοποιήστε unified όταν θέλετε να αντιγράψετε το αποτέλεσμα ως αρχείο patch ή να το επικολλήσετε σε ένα νήμα αναθεώρησης κώδικα. Χρησιμοποιήστε side-by-side όταν η οπτική ευθυγράμμιση του τι αντικατέστησε τι έχει μεγαλύτερη σημασία από το ακατέργαστο κείμενο patch.
Επικολλήστε το πρωτότυπο αριστερά, την αλλαγμένη έκδοση δεξιά, επιλέξτε μια προβολή και μια ανάλυση και η σύγκριση εμφανίζεται σε χιλιοστά του δευτερολέπτου. Ενεργοποιήστε τη ζωντανή λειτουργία και το diff τρέχει ξανά σε κάθε πληκτρολόγηση καθώς επεξεργάζεστε οποιαδήποτε πλευρά. Κατεβάστε το αποτέλεσμα ως τυπικό αρχείο .patch unified που το git apply καταναλώνει απευθείας. Χωρίς μεταφόρτωση, χωρίς λογαριασμό, χωρίς κλειδί API προμηθευτή, χωρίς όριο.