{"id":120981,"date":"2024-12-14T09:45:59","date_gmt":"2024-12-14T07:45:59","guid":{"rendered":"https:\/\/prohoster.info\/blog\/novosti-interneta\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git"},"modified":"2024-12-14T09:45:59","modified_gmt":"2024-12-14T07:45:59","slug":"mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/novosti-interneta\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git","title":{"rendered":"mergiraf \u2014 nj\u00eb mjet i orientuar nga AST p\u00ebr bashkimin tri-an\u00ebsh n\u00eb Git","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00cbsht\u00eb publikuar l\u00ebshimi i projektit mergiraf 0.4, i cili zhvillon nj\u00eb drejtues p\u00ebr Git me implementimin e mund\u00ebsis\u00eb s\u00eb bashkimit trepal\u00ebsh. Mergiraf mb\u00ebshtet zgjidhjen e llojeve t\u00eb ndryshme t\u00eb konflikteve gjat\u00eb bashkimit dhe mund t\u00eb p\u00ebrdoret p\u00ebr gjuh\u00eb programuese dhe formate skedash t\u00eb ndryshme. \u00cbsht\u00eb e mundur t\u00eb thirret mergiraf si nj\u00eb thirrje e ve\u00e7ant\u00eb p\u00ebr t\u00eb trajtuar konfliktet q\u00eb ndodhin gjat\u00eb pun\u00ebs me Git t\u00eb zakonsh\u00ebm, si dhe t\u00eb z\u00ebvend\u00ebsohet n\u00eb Git si nj\u00eb trajtues i bashkimeve p\u00ebr t\u00eb zgjeruar aft\u00ebsit\u00eb e komandave si merge, revert, rebase dhe cherry-pick. Kodi shp\u00ebrndahet n\u00ebn licenc\u00ebn GPLv3. N\u00eb versionin e ri \u00ebsht\u00eb shtuar mb\u00ebshtetje p\u00ebr gjuh\u00ebt Python, TOML, Scala dhe Typescript, si dhe \u00ebsht\u00eb optimizuar performanca.    <\/p>\n<p>M\u00eb posht\u00eb \u00ebsht\u00eb nj\u00eb p\u00ebrshkrim i detajuar i problemeve q\u00eb zgjidhen me an\u00eb t\u00eb mergiraf:    <\/p>\n<p>Nj\u00eb program \u00ebsht\u00eb nj\u00eb shembull e shk\u00eblqyer i nj\u00eb sistemi jasht\u00ebzakonisht t\u00eb komplikuar. Sistemet komplekse kan\u00eb nj\u00eb pron\u00eb t\u00eb p\u00ebrbashk\u00ebt \u2014 ato jan\u00eb T\u00cb KOMPLESASHME \u2014 dhe nuk mund t\u00eb prisni q\u00eb sjellja e duhur komplekse t\u00eb ndodh\u00eb vetvetiu, rast\u00ebsisht. N\u00eb vend t\u00eb k\u00ebsaj, k\u00ebto sisteme evolucionojn\u00eb me kalimin e koh\u00ebs, hap pas hapi, dhe \u00e7do mutacion kontrollohet me kujdes n\u00eb \u00e7do faz\u00eb. P\u00ebr ta arritur k\u00ebt\u00eb, nevojiten nj\u00eb struktur\u00eb e qart\u00eb dhe mjete t\u00eb p\u00ebrshtatshme. Evolucioni i \u00e7do sistemi kompleks mund t\u00eb vizatohet si nj\u00eb pem\u00eb e orientuar, ku rr\u00ebnja p\u00ebrfaq\u00ebson nj\u00eb grup t\u00eb zbraz\u00ebt funksionesh, dhe \u00e7do nyje \u2014 p\u00ebrve\u00e7 rr\u00ebnj\u00ebs \u2014 \u00ebsht\u00eb rezultati i aplikimit t\u00eb nj\u00eb mutacioni n\u00eb prindin e saj.     <\/p>\n<p>N\u00eb kontekstin e produkteve, \u00e7do nyje quhet \"version\", q\u00eb p\u00ebrfaq\u00ebson nj\u00eb grup t\u00eb caktuar funksionesh dhe anti-funksionesh. \u00c7do ndryshim i k\u00ebtij grupi konsiderohet nj\u00eb mutacion, q\u00eb formon nj\u00eb brinj\u00eb n\u00eb grafikun ton\u00eb t\u00eb orientuar dhe aciklik. K\u00ebto funksione, natyrisht, jan\u00eb abstrakte; ato nuk pasqyrojn\u00eb drejtp\u00ebrdrejt m\u00ebnyrat se si funksionojn\u00eb sistemet fizike, por p\u00ebrkundrazi tregojn\u00eb se si agjent\u00ebt racional\u00eb perceptojn\u00eb dobishm\u00ebrin\u00eb e k\u00ebtyre sistemeve. P\u00ebr t\u00eb p\u00ebrkthyer idet\u00eb n\u00eb realizime t\u00eb ekzistueshme n\u00eb bot\u00ebn reale, \u00ebsht\u00eb e nevojshme t\u00eb ngrem\u00eb m\u00ebng\u00ebt dhe t\u00eb zhytemi n\u00eb detaje *mjaft* t\u00eb nivelit t\u00eb ul\u00ebt, n\u00eb gjuh\u00ebn e t\u00eb cil\u00ebs mund t\u00eb shprehim dhe shpjegojm\u00eb se si funksionon sakt\u00ebsisht gjith\u00e7ka. N\u00eb zhvillimin e softuerit, k\u00ebto nivele t\u00eb ul\u00ebta zakonisht paraqiten n\u00eb form\u00ebn e kodit burimor.    <\/p>\n<p>P\u00ebr t\u00eb sjell\u00eb gradualisht kodin burimor n\u00eb nj\u00eb gjendje q\u00eb shfaq sjelljen e k\u00ebrkuar dhe p\u00ebr t\u00eb dokumentuar se si ata e arrijn\u00eb k\u00ebt\u00eb, programuesit paraqesin pun\u00ebn e tyre n\u00eb terma snapshot-\u00ebsh dhe changest-ash. Snapshot paraqet nj\u00eb gjendje t\u00eb caktuar t\u00eb produktit me t\u00eb gjitha detajet e ul\u00ebta, nd\u00ebrsa changeset tregon kalimin midis snapshot-\u00ebve. Zakonisht snapshot-\u00ebt krijohen nga changeset t\u00eb ve\u00e7anta tek prind\u00ebrit e tyre, k\u00ebshtu q\u00eb k\u00ebto snapshot-\u00eb zakonisht etiketohen me at\u00eb q\u00eb b\u00ebjn\u00eb changeset-t\u00eb q\u00eb i krijuan ato, prandaj k\u00ebto terma shpesh p\u00ebrdoren nd\u00ebrlidhur.     <\/p>\n<p>Ndonj\u00ebher\u00eb ekzistojn\u00eb snapshot-e t\u00eb marra si rezultat i disa kalimeve \u2014 bashkimeve t\u00eb komiteteve. Ato jan\u00eb t\u00eb v\u00ebshtira p\u00ebr t'u p\u00ebrdorur, k\u00ebshtu q\u00eb zakonisht shmangen. Sistemet moderne t\u00eb kontrollit t\u00eb versioneve me burim t\u00eb hapur, si Git, ofrojn\u00eb mund\u00ebsi shum\u00eb bazike p\u00ebr menaxhimin e proceseve t\u00eb zhvillimit. Ato lejojn\u00eb zhvilluesit t\u00eb organizojn\u00eb snapshot-et si grafika t\u00eb orientuar dhe aciklike, t\u00eb annotohen me komente dhe, kur \u00ebsht\u00eb e nevojshme, t\u00eb ndryshojn\u00eb rendin e tyre.     <\/p>\n<p>Kjo funksionalitet lejon zhvilluesit t\u00eb shkruajn\u00eb nj\u00eb histori semantike t\u00eb r\u00ebnd\u00ebsishme t\u00eb projektit, q\u00eb \u00ebsht\u00eb thelb\u00ebsore p\u00ebr diagnostikimin dhe p\u00ebr t'iu p\u00ebrgjigjur pyetjeve si \"Pse u fut kjo detaj e nivelit t\u00eb ul\u00ebt (p.sh., variabli)?\", \"Sa p\u00ebrqind \u00ebsht\u00eb kontributi im n\u00eb k\u00ebt\u00eb projekt?\", \"Kush u sulmua nga implementimet e backdoor-it dhe kur?\", \"Cila ndryshim i nivelit t\u00eb ul\u00ebt prishi k\u00ebt\u00eb funksion (ndon\u00ebse duket se nuk duhet, ne e kontrolluam gjith\u00e7ka!?)\".    <\/p>\n<p>Sistemet e kontrollit t\u00eb versioneve e plot\u00ebsojn\u00eb k\u00ebt\u00eb koncept me konceptin e deg\u00ebs \u2014 nj\u00eb koncept i nivelit t\u00eb ul\u00ebt q\u00eb thjesht n\u00ebnkupton nj\u00eb cop\u00eb t\u00eb vazhdueshme t\u00eb historis\u00eb s\u00eb nivelit t\u00eb ul\u00ebt t\u00eb projektit, e cila \u00ebsht\u00eb semantikisht e r\u00ebnd\u00ebsishme p\u00ebr zhvilluesin. Deg\u00ebt zakonisht p\u00ebrdoren p\u00ebr realizimin e funksioneve t\u00eb caktuara, nganj\u00ebher\u00eb krijohen disa deg\u00eb p\u00ebr kandidat\u00ebt e ndrysh\u00ebm n\u00eb implementimin e s\u00eb nj\u00ebjt\u00ebs funksion. Duke p\u00ebrdorur procese t\u00eb deg\u00ebzimit (t\u00eb cilat jan\u00eb faktikisht mainstrem dhe standard zhvillimi, p\u00ebrdoren kudo), \u00e7do zhvillues individual mund t\u00eb menaxhoj\u00eb n\u00eb m\u00ebnyr\u00eb efektive shum\u00eb deg\u00eb konfliktuese t\u00eb projektit, secila e ndryshme n\u00eb shkall\u00ebn e gatishm\u00ebris\u00eb ose cil\u00ebsis\u00eb. Kjo lejon zhvilluesit t\u00eb kombinojn\u00eb rezultatet e pun\u00ebs s\u00eb tyre dhe t\u00eb tjer\u00ebve pa e rip\u00ebrs\u00ebritur gjith\u00e7ka manualisht \u00e7do her\u00eb.     <\/p>\n<p>Zakonisht krijohet nj\u00eb deg\u00eb kryesore, q\u00eb p\u00ebrfaq\u00ebson produktin \"zyrtar\", nga e cila dega deg\u00ebzohet p\u00ebr \u00e7do funksion, t\u00eb cilat rregullisht (n\u00eb m\u00ebnyr\u00eb ideale \u2014 pas \u00e7do komiteti) sinkronizohen me deg\u00ebn kryesore, duke lejuar zhvilluesit t\u00eb punojn\u00eb me versionin m\u00eb t\u00eb ri t\u00eb produktit dhe nj\u00ebkoh\u00ebsisht t\u00eb implementojn\u00eb funksionet q\u00eb po zhvillojn\u00eb aktualisht, duke identifikuar problemet q\u00eb rrjedhin nga veprimet e zhvilluesve t\u00eb tjer\u00eb sa m\u00eb her\u00ebt t\u00eb jet\u00eb e mundur.    <\/p>\n<p>Kur p\u00ebrpiqeni t\u00eb kombinoni funksionet e snapshot-eve t\u00eb ndryshme (gj\u00eb q\u00eb \u00ebsht\u00eb thjesht gjetja e nj\u00eb paraardh\u00ebsi t\u00eb p\u00ebrbashk\u00ebt dhe aplikimi i changeset-eve q\u00eb krijojn\u00eb ato, n\u00eb m\u00ebnyr\u00eb t\u00eb rregullt mbi nj\u00eb tjet\u00ebr, kjo operacion quhet rebase, nd\u00ebrsa bashkimi \u2014 \u00ebsht\u00eb pothuajse si rebase, thjesht strukturojn\u00eb grafik\u00ebt e komiteteve ndryshe, duke b\u00ebr\u00eb q\u00eb ata t\u00eb jen\u00eb t\u00eb paqart\u00eb p\u00ebr t'u manipuluar, prandaj from bashkimet shmangen n\u00eb favor t\u00eb rebase-ve), shfaqen probleme. Sistemet moderne t\u00eb kontrollit t\u00eb versioneve (VCS) p\u00ebrdorin algoritma t\u00eb brendsh\u00ebm t\u00eb bashkimit t\u00eb ndryshimeve, t\u00eb cilat thjesht thyejn\u00eb skedar\u00ebt n\u00eb rreshta t\u00eb ve\u00e7uar, e trajtojn\u00eb \u00e7do rresht si nj\u00eb simbol, dhe skedar\u00ebt si sekuenca t\u00eb tyre, dhe pastaj aplikojn\u00eb algoritma p\u00ebr t'i bashkuar ato, t\u00eb cilat vijn\u00eb nga bioinformatika.     <\/p>\n<p>Fatkeqe, kjo paraqitje rresht pas rreshti e kodit burimor nuk ka asnj\u00eb lidhje me p\u00ebrmbajtjen e tij. E vetmja avantazh \u00ebsht\u00eb se \u00ebsht\u00eb e thjesht\u00eb dhe universale. Mosp\u00ebrputhja \u00e7on n\u00eb konflikte q\u00eb jan\u00eb nj\u00eb burim i vazhduesh\u00ebm i shqet\u00ebsimeve p\u00ebr zhvilluesit. Zgjidhja e konflikteve k\u00ebrkon q\u00eb zhvilluesi t\u00eb studioj\u00eb me kujdes t\u00eb dy versionet e kodit, jo vet\u00ebm seksionet q\u00eb jan\u00eb sh\u00ebnuar si \"t\u00eb ndryshuara\" ose \"n\u00eb konflikt\", por ndoshta edhe gjith\u00eb projektin.     <\/p>\n<p>Zhvilluesi duhet t\u00eb kuptoj\u00eb ndryshimet, t\u00eb shkruaj\u00eb manualisht kodin e bashkuar dhe t\u00eb eliminoj\u00eb \u00e7do mosp\u00ebrputhje. Problemet rriten kur mjeti rresht pas rreshti identifikon gabimisht ndryshimet, gj\u00eb q\u00eb ndodh shpesh gjat\u00eb ndryshimeve t\u00eb m\u00ebdha, p\u00ebrfshir\u00eb ato triviale, si rikthimi i kodit. N\u00ebse ndryshimet e m\u00ebvonshme nuk mund t\u00eb aplikohen n\u00eb kodin e bashkuar manualisht, situata shnd\u00ebrrohet n\u00eb nj\u00eb makth t\u00eb plot\u00eb. Megjithat\u00eb, n\u00eb shumic\u00ebn e rasteve, algoritmi rresht pas rreshti funksionon, ve\u00e7an\u00ebrisht n\u00ebse zhvilluesit p\u00ebrpiqen aktivisht t\u00eb mos krijojn\u00eb probleme p\u00ebr t\u00eb. Nj\u00eb nga m\u00ebnyrat p\u00ebr t\u00eb minimizuar problemet e tilla \u00ebsht\u00eb k\u00ebrkesa e domosdoshme p\u00ebr p\u00ebrpunimin e burimeve nga mjete t\u00eb kanonikizimit, si black.    <\/p>\n<p>Natyrisht, zgjidhja e duhur p\u00ebr rastet e tmerrshme (dhe n\u00eb p\u00ebrgjith\u00ebsi, jo vet\u00ebm p\u00ebr to, algoritmi rresht pas rreshti \u00ebsht\u00eb nj\u00eb heuristik\u00eb, dhe mund t\u00eb \u00e7oj\u00eb n\u00eb kod t\u00eb pa punuesh\u00ebm, p.sh., nj\u00eb zhvillues e rinovoi nj\u00eb variab\u00ebl, nd\u00ebrsa nj\u00eb tjet\u00ebr po shkruante nj\u00eb pjes\u00eb t\u00eb re kodesh q\u00eb p\u00ebrdorte at\u00eb variab\u00ebl, nuk do t\u00eb ket\u00eb konflikt bashkimi\/ribazimi k\u00ebtu, por rezultati do t\u00eb b\u00ebhet i pa punuesh\u00ebm) \u00ebsht\u00eb p\u00ebrdorimi i nj\u00eb modeli t\u00eb brendsh\u00ebm t\u00eb sakt\u00eb.     <\/p>\n<p>Pavar\u00ebsisht se studimet n\u00eb k\u00ebt\u00eb fush\u00eb jan\u00eb duke u zhvilluar p\u00ebr rreth 30 vjet, dhe kan\u00eb \u00e7uar n\u00eb krijimin e disa produkteve komerciale pron\u00ebsore, k\u00ebto k\u00ebrkime deri n\u00eb koh\u00ebt e fundit nuk ishin shnd\u00ebrruar n\u00eb produkte praktikisht t\u00eb aplikueshme me kod t\u00eb hapur. Shumica e zgjidhjeve t\u00eb softuerit t\u00eb lir\u00eb kan\u00eb filluar t\u00eb zhvillohen n\u00eb fillim t\u00eb viteve 2010, dhe ishin fokusuar kryesisht n\u00eb gjuh\u00ebn Java.    <\/p>\n<p>Implementimi m\u00eb i shquar i lir\u00eb i asaj periudhe, GumTree, u krijua nga nj\u00eb k\u00ebrkues me nj\u00eb sfond akademik, shkruar n\u00eb Java, ka nj\u00eb p\u00ebrfaq\u00ebsim t\u00eb brendsh\u00ebm abstrakt, q\u00eb i paraprin treesitter, ka backend-e si ato t\u00eb baza n\u00eb treesitter dhe ato t\u00eb tjera p\u00ebr analizimin e kodit burimor n\u00eb p\u00ebrfaq\u00ebsime abstrakte. Ky sistem di vet\u00ebm t\u00eb krijoj\u00eb (n\u00eb form\u00ebn e nj\u00eb logu tekstual t\u00eb ngjarjeve, gjithashtu ka nj\u00eb API, q\u00eb mund t\u00eb thirret leht\u00ebsisht nga \u00e7do Gjuh\u00eb Programimi me lidhje me Java) dhe t\u00eb vizualizoj\u00eb ndryshimet. Megjithat\u00eb, p\u00ebr bashkimin e ndryshimeve, si dhe p\u00ebr shkarkimin e skedar\u00ebve t\u00eb ndryshimeve t\u00eb gjeneruara prej saj, nuk \u00ebsht\u00eb p\u00ebrdorimi nga dola (megjithat\u00eb, ndoshta mund t\u00eb implementohet shkarkimi i ndryshimeve p\u00ebrmes API).    <\/p>\n<p>Nj\u00eb implementim m\u00eb i ri dhe m\u00eb praktik i aplikuesh\u00ebm i difftastic \u00ebsht\u00eb shkruar n\u00eb Rust, \u00ebsht\u00eb i bazuar n\u00eb treesitter, i fokusuar n\u00eb gjenerimin e ndryshimeve t\u00eb ndri\u00e7uara n\u00eb konsol\u00eb. Ky sistem gjithashtu \u00ebsht\u00eb i orientuar p\u00ebr t\u00eb vizualizuar ndryshimet dhe nuk e ka q\u00ebllim bashkimin e ndryshimeve ose aplikimin e patch-eve.    <\/p>\n<p>S\u00eb fundmi, ka dal\u00eb dhe po zhvillohet aktivisht projekti mergiraf. Ky mjet i shkruar n\u00eb Rust (z\u00eb 21 MiB!) gjithashtu \u00ebsht\u00eb i bazuar n\u00eb treesitter, i cili ka filluar t\u00eb b\u00ebhet standard p\u00ebr parserat e gramatikave kontekstualisht t\u00eb lira n\u00eb mjetet e zhvillimit, ashtu si\u00e7 \u00ebsht\u00eb b\u00ebr\u00eb LLVM p\u00ebr optimizimin e p\u00ebrfaq\u00ebsimeve t\u00eb ulta nivel. Ndryshe nga konkurrenca, mergiraf ofron funksione jo p\u00ebr gjenerimin e ndryshimeve, por p\u00ebr zgjidhjen automatike t\u00eb konflikteve t\u00eb bashkimeve. N\u00ebn kapak, mergiraf p\u00ebrdor p\u00ebr gjenerimin e patch-eve zbatimin e algoritmit q\u00eb p\u00ebrdoret n\u00eb GumTree, dhe p\u00ebr aplikimin - zbatimin e algoritmit q\u00eb p\u00ebrdoret n\u00eb spork, t\u00eb adaptuar p\u00ebr strukturat treesitter.     <\/p>\n<p>Serilizimi i patch-ave n\u00eb skedar\u00eb, t\u00eb cilat mund t\u00eb aplikohen m\u00eb von\u00eb, fatkeq\u00ebsisht nuk \u00ebsht\u00eb realizuar (por \u00ebsht\u00eb krejt\u00ebsisht e mundur q\u00eb t\u00eb realizohet p\u00ebrmes analizimit t\u00eb regjistrave t\u00eb ngjarjeve t\u00eb gjeneruara nga GumTree). Nj\u00eb metod\u00eb tjet\u00ebr premtuese p\u00ebr aplikimin e dallimeve mund t\u00eb jet\u00eb p\u00ebrdorimi i ndryshimeve jo p\u00ebrmes patch-ave, por p\u00ebrmes funksionalitetit t\u00eb ristrukturimit t\u00eb LSP-server\u00ebve, \u00e7ka mund t\u00eb ndihmoj\u00eb n\u00eb zbardhjen e konflikteve n\u00eb nivelin e t\u00ebr\u00eb projektit. Vizualizimi mb\u00ebshtetet vet\u00ebm p\u00ebr konfliktet.    <\/p>\n<p>Shembuj punimi: paraardh\u00ebsi i p\u00ebrbashk\u00ebt \"base.py\" (me hapjet e tabave, nj\u00eb linj\u00eb e tep\u00ebrt n\u00eb fillim) foo = 1 def main(): print(foo + 2 + 3) \"a.py\" (me hapjet akoma tab, 2 linja t\u00eb tep\u00ebrta n\u00eb fillim n\u00eb vend t\u00eb nj\u00eb, p\u00ebr printimin e ndihm\u00ebs p\u00ebrdoret biblioteka icecream, \u00ebsht\u00eb shtuar klasa \"baz\": from icecream import ic foo = 1 def main(): ic(foo + 2 + 3) class baz: def __init__(self): \"\"\"baz\"\"\" \"\"\"b.py\"\"\" (variab\u00ebl \"foo\" \u00ebsht\u00eb rinovuar n\u00eb \"bar\", e p\u00ebrpunuar me \"black\" pas ndryshimeve, si rezultat hapjet jan\u00eb me hap\u00ebsira dhe linjat e tep\u00ebrta jan\u00eb eleminuar): bar = 1 def main(): print(bar + 2 + 3) Thirrja .\/mergiraf merge .\/base.py .\/a.py .\/b.py -x a.py -y b.py -s base.py -o .\/res.py jep k\u00ebt\u00eb rezultat from icecream import ic bar = 1 def main(): ic(bar + 2 + 3) class baz: def __init__(self): \"\"\"baz\"\"\" (p\u00ebr printimin e ndihm\u00ebs p\u00ebrdoret biblioteka \"icecream\", variab\u00ebl \"foo\" \u00ebsht\u00eb rinovuar n\u00eb \"bar\", e p\u00ebrpunuar me \"black\" pas ndryshimeve, si rezultat hapjet jan\u00eb me hap\u00ebsira dhe linjat e tep\u00ebrta jan\u00eb eleminuar, nj\u00eb miks i tabave dhe hap\u00ebsirave p\u00ebr hapje, por pamja e lejuar).    <\/p>\n<p>K\u00ebtu dallohet dob\u00ebsia e mjetit. Stili i dokumentit zakonisht konfigurrohet n\u00eb skedar\u00ebt \".editorconfig\", dhe ndryshimet globale t\u00eb stilit, si\u00e7 jan\u00eb kalimi nga tabat n\u00eb hap\u00ebsira dhe pranuar stili i black, si\u00e7 \u00ebsht\u00eb b\u00ebr\u00eb n\u00eb \"b.py\", zakonisht shoq\u00ebrohen me ndryshime n\u00eb \".editorconfig\". Prandaj, p\u00ebr aplikimin m\u00eb t\u00eb sakt\u00eb t\u00eb k\u00ebtyre ndryshimeve, mjeti duhet t\u00eb ket\u00eb nj\u00eb koncept p\u00ebr stilin global \"n\u00eb default\", dhe t\u00eb jet\u00eb n\u00eb gjendje t\u00eb t\u00ebrheq\u00eb konfigurimet nga \".editorconfig\".<br \/>\n<br \/>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/www.opennet.ru\/opennews\/art.shtml?num=62402\">opennet.ru<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u0440\u0435\u043b\u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 mergiraf 0.4, \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f Git \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0451\u0445\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0441\u043b\u0438\u044f\u043d\u0438\u044f. Mergiraf \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u043f\u0440\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0438 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 mergiraf \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0448\u0442\u0430\u0442\u043d\u044b\u043c Git, \u0442\u0430\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430 \u0432 Git \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-120981","post","type-post","status-publish","format-standard","hentry","category-novosti-interneta"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u0440\u0435\u043b\u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 mergiraf 0.4, \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f Git \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0451\u0445\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0441\u043b\u0438\u044f\u043d\u0438\u044f. Mergiraf \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u043f\u0440\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0438 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 mergiraf \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0448\u0442\u0430\u0442\u043d\u044b\u043c Git, \u0442\u0430\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430 \u0432 Git \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/novosti-interneta\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47mergiraf \u2014 AST-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0442\u0440\u0451\u0445\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0432 Git | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u0440\u0435\u043b\u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 mergiraf 0.4, \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f Git \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0451\u0445\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0441\u043b\u0438\u044f\u043d\u0438\u044f. Mergiraf \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u043f\u0440\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0438 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 mergiraf \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0448\u0442\u0430\u0442\u043d\u044b\u043c Git, \u0442\u0430\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430 \u0432 Git \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/novosti-interneta\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2024-12-14T07:45:59+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2024-12-14T07:45:59+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47mergiraf \u2014 nj\u00eb mjet i orientuar drejt AST p\u00ebr bashkimin n\u00eb tre an\u00eb n\u00eb Git | ProHoster","description":"L\u00ebshimi i projektit mergiraf 0.4 \u00ebsht\u00eb publikuar, duke zhvilluar nj\u00eb driver p\u00ebr Git me implementimin e mund\u00ebsis\u00eb p\u00ebr bashkimin n\u00eb tre an\u00eb. Mergiraf mb\u00ebshtet zgjidhjen e llojeve t\u00eb ndryshme t\u00eb konflikteve gjat\u00eb bashkimit dhe mund t\u00eb p\u00ebrdoret p\u00ebr gjuh\u00eb t\u00eb ndryshme programimi dhe formate skedar\u00ebsh. Mund t\u00eb b\u00ebhet nj\u00eb thirrje e ve\u00e7ant\u00eb mergiraf p\u00ebr t\u00eb trajtuar konfliktet q\u00eb ndodhin gjat\u00eb pun\u00ebs me Git-in standard, ashtu si dhe z\u00ebvend\u00ebsimi n\u00eb Git i trajtuesit t\u00eb bashkimeve p\u00ebr zgjerim.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/novosti-interneta\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47mergiraf \u2014 AST-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0442\u0440\u0451\u0445\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0441\u043b\u0438\u044f\u043d\u0438\u044f \u0432 Git | ProHoster","og:description":"\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d \u0440\u0435\u043b\u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 mergiraf 0.4, \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0434\u043b\u044f Git \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0451\u0445\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0433\u043e \u0441\u043b\u0438\u044f\u043d\u0438\u044f. Mergiraf \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u043f\u0440\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0438 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 mergiraf \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u043e \u0448\u0442\u0430\u0442\u043d\u044b\u043c Git, \u0442\u0430\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430 \u0432 Git \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f","og:url":"https:\/\/prohoster.info\/sq\/blog\/novosti-interneta\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2024-12-14T07:45:59+00:00","article:modified_time":"2024-12-14T07:45:59+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"120981","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 08:54:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2026-01-23 08:54:19","updated":"2026-01-23 08:54:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/120981","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=120981"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/120981\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=120981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=120981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=120981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}