Jinsi algorithm za tofauti zinavyofanya kazi
Kila maono ya tofauti kwenye ukurasa huu inazalishwa na algorithm ya Myers — mbinu ya 1986 na Eugene W. Myers inayopata hati fupi ya kuhariri kati ya mlolongo wa tokeni mbili kwa muda wa O((N+M)D), ambapo D ni umbali wa kuhariri. Algorithm imejengwa kuzunguka tatizo la Mlolongo Mrefu wa Kawaida, na injini inafanya kazi kabisa kwenye kivinjari chako ukitumia maktaba ya chanzo huria ya jsdiff.
- Gawanya ingizo kwa tokeni — Kabla ya kulinganisha, algorithm hugawanya kila ingizo katika mlolongo wa tokeni. Kiwango cha mstari hugawanya kwenye mistari mipya; kiwango cha neno hugawanya kwenye nafasi za wazi na mipaka ya uakifishaji; kiwango cha herufi hutreatiwa kila pointi ya msimbo wa Unicode kama tokeni yake.
- Jenga grafu ya kuhariri — Algorithm ya Myers humodelisha ulinganisho kama njia kupitia gridi ya 2D ambapo kwenda kulia kunamaanisha "futa kutoka asili", kwenda chini kunamaanisha "ingiza kutoka kilichobadilishwa", na kwenda diagonally kunamaanisha "tokeni inafanana katika zote mbili". Algorithm inapata njia fupi inayoelemea diagonal.
- Toa LCS — Harakati za diagonal kwenye njia fupi hufuatilia Mlolongo Mrefu wa Kawaida — tokeni ambazo zinaonekana katika maingizo yote mawili kwa utaratibu sawa wa jamaa. Kila tokeni kwenye LCS ni "haijabadilika"; kila kitu kingine ni ziada au ufutaji.
- Tumia chaguo za utayarishaji — Ukiwezesha "Puuza hali", maingizo yote mawili yanafanywa herufi ndogo kabla ya kifungu cha LCS ili "HABARI" na "habari" vihesabike kama sawa. "Puuza nafasi za wazi" hupanga nafasi nyingi kuwa moja. "Kata kila mstari" huondoa nafasi za wazi za mwanzo na mwisho kwa kila mstari kabla ya ulinganisho.
- Piga picha maono yaliyochaguliwa — Matokeo ni matokeo sawa ya LCS yaliyoonyeshwa kwa njia tatu: Kando kwa kando inaonyesha asili upande wa kushoto na kilichobadilishwa upande wa kulia kwenye gridi ya safu mbili na uangazaji wa safu nyekundu na kijani. Umoja inaonyesha safu moja yenye mistari ya kiambishi awali ya − na +, kama matokeo ya
git diff. Ndani inaonyesha ufutaji kama kufutwa kwa nyekundu na ziada kama kupigwa mstari wa kijani ndani ya mtiririko huo huo wa maandishi. - Hesabu mkanda wa muhtasari — Baada ya kuonyesha, chombo kinahesabu ni tokeni ngapi ziliongezwa, kuondolewa, na kubaki zisizobadilika, kisha huhesabu ufanani kama uwiano wa tokeni zisizobadilika kwa kubwa zaidi kati ya urefu wa maingizo mawili. Ufanani wa 100% unamaanisha maingizo ni sawa baada ya utayarishaji.
Kwa nini kutumia kikaguzi cha tofauti
- Ukaguzi wa msimbo bila mteja wa Git — Bandika matoleo mawili ya faili ya usanidi, uhamishaji wa SQL, au hati ya shell na uone kilichobadilika bila kuclone repo, kubadilisha matawi, au kusubiri mfumo wa CI. Chombo ni cha manufaa kwa ukaguzi wa haraka wakati wa uprogramu wa pamoja, kwa uhamisho wa mkandarasi ambapo upande mwingine haushiriki historia yao ya Git, na kwa misimbo ya zamani inayotangulia udhibiti wa toleo kabisa. Maono ya umoja huzalisha matokeo unayoweza kunakili moja kwa moja kwenye uzi wa mazungumzo au tikiti.
- Mabadiliko ya mkataba na hati — Tofauti ya kiwango cha neno inaonyesha ni maneno yapi yaliyobadilika kati ya rasimu za mkataba kwa haraka zaidi kuliko paneli ya Kufuatilia Mabadiliko ya Word. Bandika kifungu A kutoka rasimu ya kwanza na kifungu B kutoka nakala iliyotekelezwa na ubadilishaji unawaka nyekundu-kwenye-kijani kwenye sentensi halisi iliyohama. Wasaidizi wa kisheria na timu za manunuzi hutumia hili kuthibitisha mabadiliko ya mwisho wa dakika hayakupita ukaguzi kabla mkataba kusainiwa.
- Marekebisho ya insha na rasimu — Waandishi wanaolinganisha rasimu ya kwanza dhidi ya toleo lililohaririwa wanaweza kubadilika hadi kiwango cha neno kuona kila ubadilishaji, kuingizwa, na kukatwa bila kusoma tena nakala zote mbili. Mtiririko huo huo unafanya kazi kwa watafsiri wakikagua mabadiliko dhidi ya maandishi chanzo, kwa wahariri wanaokagua kwamba uhariri wa nakala ulihifadhi sauti ya mwandishi, na kwa timu za uandishi wa habari zinazopatanisha makala iliyochapishwa dhidi ya rasimu iliyowasilishwa.
- Ulinganisho wa kumbukumbu na usanidi — Wasimamizi wa mfumo wanaolinganisha picha mbili za usanidi wa seva, ratiba mbili za cron, au matokeo mawili ya
ps auxwanaweza kutumia kiwango cha mstari kupata parameta moja iliyobadilika katika faili la mistari 200 kwa sekunde. Ioanishe na chaguo la Puuza-nafasi-za-wazi na tofauti yenye kelele ya uratibu tu inakaa kwenye mabadiliko ya parameta yanayohusika kweli.
Matumizi ya kawaida
Tofauti ya maandishi inaonekana mwishoni mwa kila mzunguko wa kuhariri katika kazi za uandishi, uendelezaji, na uendeshaji.
- Ukaguzi wa ombi la kuipokelewa: bandika utekelezaji wa vitendo viwili kando kwa kando ili kuelewa mabadiliko ya mantiki kabla ya kuidhinisha, bila mzigo wa kuangalia tawi.
- Udhibiti wa ubora wa kimataifa: linganisha mfuatano wa chanzo wa Kiingereza dhidi ya sawa yake iliyotafsiriwa kwa kiwango cha neno ili kugundua kuingizwa, kukosa, au kubadilishana kwa istilahi ambazo mtafsiri angeweza kuanzisha.
- Uchambuzi wa tukio: fanya tofauti kwa picha mbili za manifesto ya Kubernetes au matokeo mawili ya "docker inspect" kwa kiwango cha mstari ili kutengua mabadiliko ya usanidi ambayo yalitangulia kukatika.
Mfano wa kufanyiwa kazi
Chukua usanidi wa seva wa mistari mitano. Asili: host=localhost, port=5432, dbname=app_db, user=app, password=secret. Kilichobadilishwa: host=db.prod.example.com, port=5432, dbname=app_db, user=app_prod, password=secret. Na kiwango cha mstari na maono ya Kando kwa kando, mstari 1 unaonyesha nyekundu upande wa kushoto (host=localhost) na kijani upande wa kulia (host=db.prod.example.com), mstari 4 unaonyesha nyekundu (user=app) na kijani (user=app_prod), na mistari 2, 3, na 5 inabaki isiyobadilika pande zote. Mkanda wa muhtasari unaripoti ziada 2, ufutaji 2, isiyobadilika 3, na ufanani wa 60% — mistari mitatu ya mitano imehifadhiwa. Badilika hadi kiwango cha neno na tofauti inakaza zaidi: tu thamani upande wa kulia wa = kwenye mistari 1 na 4 zinawaka, funguo zinabaki hazijabadilika, na ufanani unapanda hadi takriban 85% kwa sababu LCS sasa inahesabu host, user, na uakifishaji unaozunguka kama umehifadhiwa.
Je, hii inafanya kazi kwenye kivinjari changu?
Ndiyo. Hesabu nzima ya tofauti inafanya kazi upande wa mteja ukitumia maktaba ya chanzo huria ya jsdiff iliyopakiwa na ukurasa. Hakuna unachoweka, kubandika, au kulinganisha kinatumwa kwa seva yoyote. Unaweza kuithibitisha mwenyewe: fungua DevTools ya kivinjari, nenda kwenye kichupo cha Mtandao, futa kumbukumbu, bonyeza Linganisha, na uthibitishe kwamba maombi sifuri ya mtandao yanawaka kwa hatua ya ulinganisho.
Asilimia ya ufanani inamaanisha nini?
Ufanani unahesabika kama tokeni zisizobadilika / max(jumla ya tokeni kwenye asili, jumla ya tokeni kwenye kilichobadilishwa). Alama ya 100% inamaanisha maingizo mawili ni sawa baada ya kutumia chaguo zako za utayarishaji (kupiga herufi ndogo, kupanga nafasi za wazi, kukata mistari). Alama ya 0% inamaanisha hakuna tokeni inayoshirikiwa kati ya maingizo. Kipimo ni takriban ya umbali wa kuhariri — muhimu kama kipimo cha haraka — si alama ya wizi wa nakala au asili.
Je, naweza kufanya tofauti ya JSON / YAML / XML kisemantiki?
Si kwenye chombo hiki. Hii ni tofauti ya kiwango cha maandishi, kwa hivyo uumbizaji upya wa JSON au XML wa nafasi za wazi tu bado unaonyesha mabadiliko mengi hata data ni sawa kimantiki. Upangaji upya wa funguo za kitu cha JSON pia unaonyeshwa kama mabadiliko hata kama wachakato wengi wanachukulia utaratibu wa funguo kama usio na umuhimu. Kwa tofauti ya kweli ya kisemantiki inayolinganisha miti ya kitu iliyochakatiwa na kupuuza utaratibu wa funguo na uumbizaji, tunapanga zana maalum ya JSON Diff. Kwa sasa, sawazisha maingizo yote mawili kwa msisitizo na utaratibu wa funguo sawa kabla ya kuyabandika hapa.
Maono ya umoja dhidi ya kando kwa kando yanatofautiana vipi?
Kando kwa kando huonyesha safu mbili: asili upande wa kushoto na toleo lililobadilishwa upande wa kulia, na mistari iliyoondolewa ikiangaziwa nyekundu upande wa kushoto na mistari iliyoongezwa ikiangaziwa kijani upande wa kulia. Mistari isiyobadilika inaonekana kwenye safu zote mbili iliyopangwa kwenye safu sawa. Umoja huonyesha safu moja yenye kiambishi awali − na mandharinyuma nyekundu kwa mistari iliyoondolewa na kiambishi awali + na mandharinyuma kijani kwa mistari iliyoongezwa — mpangilio ule ule ambao git diff inachapisha kwenye terminal yako. Tumia umoja unapotaka kunakili matokeo kama faili la kiraka au kubandika kwenye uzi wa ukaguzi wa msimbo. Tumia kando kwa kando wakati uratibu wa kuona wa nini kibadala cha nini kina umuhimu zaidi kuliko maandishi ya kiraka ghafi.
Bandika asili upande wa kushoto, toleo lililobadilishwa upande wa kulia, chagua maono na kiwango, na ulinganisho unaonekana kwa millisekunde. Washa Hali ya moja kwa moja na tofauti inafanya kazi tena kwa kila kibonyezo unapohariri upande wowote. Pakua matokeo kama faili la kawaida la .patch la umoja ambalo git apply hutumia moja kwa moja. Hakuna kupakia, hakuna akaunti, hakuna ufunguo wa API wa muuzaji, hakuna kota.