{"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\/et\/blog\/news\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git","title":{"rendered":"mergiraf \u2014 AST-p\u00f5hine t\u00f6\u00f6riist Git'i kolme k\u00fclje \u00fchendamiseks","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>On v\u00e4lja antud mergiraf projekti versioon 0.4, mis arendab Git'i draiverit, v\u00f5imaldades kolme k\u00fclje \u00fchendamist. Mergiraf toetab erinevate konfliktit\u00fc\u00fcpide lahendamist \u00fchendamisel ning v\u00f5ib olla kasutusel erinevate programmeerimiskeelte ja failivormingute jaoks. On v\u00f5imalik, et mergiraf kutsub eraldi esile konfliktide t\u00f6\u00f6tlemiseks, mis tekivad tavalise Git'iga t\u00f6\u00f6tades, samuti asendab Git'i \u00fchendamise k\u00e4itlejat, et laiendada selliste k\u00e4su nagu merge, revert, rebase ja cherry-pick v\u00f5imalusi. Kood on saadaval GPLv3 litsentsi alusel. Uues versioonis on lisatud tugi keelte Python, TOML, Scala ja TypeScript jaoks ning viidatud on j\u00f5udluse optimeerimisele.    <\/p>\n<p>Allpool on toodud \u00fcksikasjalik kirjeldus probleemidest, mida mergiraf aitab lahendada:    <\/p>\n<p>Tarkvara on s\u00e4rav n\u00e4ide \u00e4\u00e4rmiselt keerulisest s\u00fcsteemist. Keerulistel s\u00fcsteemidel on \u00fcks \u00fchine omadus \u2014 need on KEERULISED \u2014 ja te ei saa oodata, et vajalik keeruline k\u00e4itumine tekib iseenesest, juhuslikult. Selle asemel areneb see s\u00fcsteem ajas, samm-sammult, ja iga mutatsioon kontrollitakse hoolikalt igal sammul. Selle saavutamiseks on vajalik h\u00e4sti m\u00e4\u00e4ratletud struktuur ja vastavad t\u00f6\u00f6riistad. Iga keerulise s\u00fcsteemi evolutsioon on visualiseeritav suunatud puuna, kus juur esindab t\u00fchjalt funktsioonide kogumit, ja iga s\u00f5lm \u2014 v\u00e4lja arvatud juur \u2014 on tulemus mutatsiooni rakendamisest oma vanemale.     <\/p>\n<p>Toodete kontekstis nimetatakse iga s\u00f5lme 'versiooniks', mis esindab kindlat funktsioonide ja antifunktsioonide kogumit. Iga selle kogumi muudatus loetakse mutatsiooniks, mis loob serva meie suunatud suletud graafikus. Need funktsioonid on oma olemuselt abstraktsed; need ei kajasta otseselt f\u00fc\u00fcsiliste s\u00fcsteemide toimimise viise, vaid n\u00e4itavad, kuidas m\u00f5istlikud agendid tajuvad nende s\u00fcsteemide kasulikkust. Ideede t\u00f5lkimiseks olemasolevatesse reaalses maailmas rakendustesse on vajalik k\u00e4\u00e4rid \u00fcles rullida ja sukelduda *piisavalt* madalatesse detailidesse, milles saab v\u00e4ljendada ja selgitada, kuidas k\u00f5ik t\u00e4pselt t\u00f6\u00f6tab. Tarkvaraarenduses on need madala taseme detailid tavaliselt esindatud l\u00e4htekoodiga.    <\/p>\n<p>Ettepanekute j\u00e4rkj\u00e4rgulise parandamise saavutamiseks ja selle dokumenteerimiseks, kuidas nad sinna j\u00f5udsid, esitavad programmeerijad oma t\u00f6\u00f6d snapshot'ide ja changeset'ide terminoloogias. Snapshot esindab toote kindlat olekut koos k\u00f5igi madalatelt tasemetelt detailidega, samas kui changeset t\u00e4histab \u00fcleminekut snapshot'ide vahel. T\u00fc\u00fcpiliselt tekivad snapshot'id \u00fcksikute changeset'ide kaudu nende vanematele, seet\u00f5ttu on need snapshot'id enamasti t\u00e4histatud muutustega, mis need l\u00f5id, mist\u00f5ttu kasutatakse neid termineid tihti vaheldumisi.     <\/p>\n<p>M\u00f5nikord eksisteerivad pildid, mis on saadud mitme \u00fclemineku tulemusena \u2014 commitide \u00fchendamine. Nendega on keeruline t\u00f6\u00f6tada, seet\u00f5ttu neid tavaliselt v\u00e4ltida. Kaasaegsed avatud l\u00e4htekoodiga versioonihalduss\u00fcsteemid, nagu Git, pakuvad \u00fcsna p\u00f5hilisi v\u00f5imalusi arendusprotsesside haldamiseks. Need v\u00f5imaldavad arendajatel korraldada pilte suunatud suletud graafikutena, m\u00e4rkida need kommentaaridega ja vajadusel muuta nende j\u00e4rjekorda.     <\/p>\n<p>See funktsionaalsus v\u00f5imaldab arendajatel kirjutada semantiliselt olulist projekti lugu, mis on kriitilise t\u00e4htsusega t\u00f5rgete t\u00f5rkeotsimiseks ja k\u00fcsimustele vastamiseks, nagu n\u00e4iteks: \u201eMiks see madala taseme detail (nt muutuja) sisse viidi?\u201d, \u201eKui suur on minu panus sellesse projekti?\u201d, \u201eKeda on tagakiusatud, kui ja millal?\u201d ja \u201eMilline madala taseme muudatus katkestas selle funktsiooni (kuigi tunned, et see ei pidanud, me kontrollisime k\u00f5ike!?)\u201d    <\/p>\n<p>Versioonihalduss\u00fcsteemid t\u00e4iendavad seda haru m\u00f5istega \u2014 madala taseme m\u00f5isted, mis lihtsalt t\u00e4histavad pidevat madala taseme projekti ajalugu, semantiliselt olulised arendajale. Harud kasutatakse tavaliselt funktsioonide konkreetse rakenduse jaoks, m\u00f5nikord luuakse mitmeid harusid erinevate kandidaatide jaoks sama funktsiooni rakendamiseks. Kasutades harude t\u00f6\u00f6vooge (mis on tegelikult peavool ja arendamise standard, mida kasutatakse igal pool), saab iga individuaalne arendaja t\u00f5husalt hallata mitmeid konflikteeruvaid projektiharusid, millest iga\u00fcks erineb valmiduse v\u00f5i kvaliteedi astme poolest. See v\u00f5imaldab arendajatel omavahel kombineerida oma ja teiste t\u00f6\u00f6d, ilma et nad peaksid iga kord kogu protsessi uuesti k\u00e4sitsi l\u00e4bi tegema.     <\/p>\n<p>Tavaliselt luuakse peamine haru, mis esindab \u201eametlikku\u201d toodet, millest hargnevad k\u00fclgharud iga funktsiooni jaoks, mis regulaarselt (ideaalis \u2014 p\u00e4rast iga commit'i) s\u00fcnkroniseeritakse peamise haruga, v\u00f5imaldades arendajatel t\u00f6\u00f6tada k\u00f5ige v\u00e4rskema toote versiooniga ja samal ajal rakendada funktsioone, mida nad hetkel arendavad, tuvastades probleeme, mis tulenevad teiste arendajate tegevusest, nii vara kui v\u00f5imalik.    <\/p>\n<p>Erinevate snapshot-ide funktsioonide kombineerimine (mis on lihtsalt \u00fchise vanema leidmine ja muutuste kogumite rakendamine j\u00e4rjekindlalt teise kohal, seda operatsiooni nimetatakse rebase'iks; sulandumine on peaaegu nagu rebase, lihtsalt struktureerib commitide graafi teistmoodi, mist\u00f5ttu on sellega keeruline manipuleerida, seet\u00f5ttu p\u00fc\u00fctakse sulandumisest loobuda rebase'i kasuks) tekitab probleeme. Kaasaegsed versioonihalduss\u00fcsteemid (VCS) kasutavad sisemisi muudatuste \u00fchendamise algoritme, mis lihtsalt jagavad failid eraldi ridadeks, k\u00e4sitlevad iga rea s\u00fcmbolina ja faile kui nende j\u00e4rjestusi ning seej\u00e4rel rakendavad algoritme nende \u00fchendamiseks, mis on p\u00e4rit bioinformaatikast.     <\/p>\n<p>Kahjuks pole selline ridade kaupa esitus koodist midagi \u00fchist selle sisuga. Tema ainus eelis on see, et see on lihtne ja universaalne. Ebak\u00f5la toob kaasa konflikte, mis on pidev peavalu arendajatele. Konfliktide lahendamine n\u00f5uab arendajalt p\u00f5hjalikku uurimist m\u00f5lema koodiversiooni, sealhulgas mitte ainult ridade osade, mida read v\u00f5rreldes muutustena v\u00f5i konfliktidena m\u00e4\u00e4ratlevad, vaid v\u00f5ib-olla ka kogu projekti \u00fcle.     <\/p>\n<p>Arendaja peab muutuseid m\u00f5istma, k\u00e4sitsi kirjutama \u00fchendatud koodi ja lahendama k\u00f5ik ebak\u00f5lad. Probleemide arv suureneb, kui ridade kaupa t\u00f6\u00f6riist tuvastab muutused valesti, mis juhtub sageli ulatuslike muudatuste puhul, sealhulgas triviaalsete, nagu koodi \u00fcmberformateerimine. Kui edasised muudatused ei \u00f5nnestu k\u00e4sitsi \u00fchendatud koodile rakendada, muutub olukord t\u00e4ielikuks \u00f5uduseks. Hirmu\u00e4ratavatest juhtumitest hoolimata t\u00f6\u00f6tab ridade kaupa algoritm enamikul juhtudel, eriti kui arendajad aktiivselt p\u00fc\u00fcavad v\u00e4ltida probleemide tekitamist. \u00dcks viis selliste probleemide minimeerimiseks on n\u00f5uda, et l\u00e4htekoodid t\u00f6\u00f6deldaks kanoniseerimise t\u00f6\u00f6riistadega, nagu black.    <\/p>\n<p>Muidugi on \u00f5ige lahendus kohutavate olukordade jaoks (ja mitte ainult nende jaoks, rida-rida algoritm - see on heuristika, mis v\u00f5ib triviaalsete viiside kaudu viia mittet\u00f6\u00f6tava koodini, n\u00e4iteks nimetas \u00fcks arendaja muutuja \u00fcmber, samas kui teine kirjutas uut koodi, mis kasutas seda muutujat; sulandumise\/taaspaigutamise konflikti siin ei tule, kuid tulemusest saab mittet\u00f6\u00f6tav) - see on \u00f5ige sisemise mudeli kasutamine.     <\/p>\n<p>Hoolimata asjaolust, et selle valdkonna uurimist\u00f6\u00f6d on tehtud juba ligi 30 aastat ja need on viinud mitmete patenteeritud kaubanduslike toodete loomise, ei ole neid uuringute tulemusi viimase ajani muundatud praktiliseks rakenduseks avatud l\u00e4htekoodiga toodetes. Enamus avatud l\u00e4htekoodiga lahendusi hakkasid arenema 2010. aastate alguses ja keskendusid peamiselt Java keelele.    <\/p>\n<p>Selle perioodi k\u00f5ige silmapaistvam avatud rakendus, GumTree, on loodud akadeemilise taustaga teadlase poolt, kirjutatud Java keeles, omab oma abstraktset sisemist representatsiooni, mis eelneb treesitter'ile, ning tal on nii treesitter'ile kui ka teistele t\u00f6\u00f6riistadele p\u00f5hinevad tagaplaanid, mis teisendavad allika koodi abstraktseteks representatsioonideks. See s\u00fcsteem suudab ainult genereerida (s\u00fcndmustest tekstilise logina, samuti on olemas API, mida saab lihtsalt kutsuda mis tahes programmeerimiskeelest, mis omab Java binde) ja visualiseerida muudatusi. Siiski ei sobi see s\u00fcsteem muudatuste \u00fchinemiseks ega genereeritud diff-failide vaatamiseks, kuigi t\u00f5en\u00e4oliselt saab diff'e API kaudu \u00fcles laadida.    <\/p>\n<p>Noorem ja praktiliselt rakendatav versioon difftastic on kirjutatud Rust keeles, p\u00f5hineb treesitter'il ja keskendub v\u00e4rviliste diff'ide genereerimisele konsoolis. See s\u00fcsteem on samuti suunatud diff'ide visualiseerimisele ja ei p\u00fc\u00fcdle muudatuste integreerimise v\u00f5i patch'ide rakendamise poole.    <\/p>\n<p>Hiljuti ilmus ja aktiivselt areneb projekt mergiraf. See Rustis kirjutatud t\u00f6\u00f6riist (mahub 21 MiB!) p\u00f5hineb samuti treesitteril, mis on saanud sama standardiks kontekstivabade grammatikate parseritele arendust\u00f6\u00f6riistades, nagu LLVM on madala taseme k\u00e4suj\u00f5udude optimeerimiseks. Erinevalt konkurentidest pakub mergiraf funktsioone mitte diff-ide genereerimiseks, vaid sulandumiskonfliktide automaatseks lahendamiseks. Mergiraf kasutab allpool pat\u0161ide genereerimiseks GumTree algoritmi rakendust ja rakendamiseks sporki algoritmi rakendust, mis on kohandatud treesitteri struktuuride jaoks.     <\/p>\n<p>Kahjuks ei ole patch'ide serialiseerimine failidesse, mida saaks hiljem rakendada, teostatud (kuid on t\u00f5en\u00e4oline, et seda v\u00f5iks teostada GumTree genereeritud s\u00fcndmuslogide anal\u00fc\u00fcsi kaudu). Teine perspektiivikas viis erinevuste rakendamiseks v\u00f5iks olla nende rakendamine mitte patch'ide kaudu, vaid LSP-serverite refaktoreerimisfunktsionaalsuse kaudu, mis v\u00f5iks aidata konflikte tuvastada kogu projekti tasandil. Visualiseerimine toetatakse ainult konfliktide korral.    <\/p>\n<p>T\u00f6\u00f6 n\u00e4ide: \u00fchine esiisa \u00abbase.py\u00bb (tabidega sisestamine, \u00fcleliigne rida alguses) foo = 1 def main(): print(foo + 2 + 3) \u00aba.py\u00bb (sisestamine on endiselt tabidega, 2 \u00fcleliigset rida alguses, silumiste printimiseks on kasutatud j\u00e4\u00e4kme raamatut, lisatud klass \u00abbaz\u00bb: from icecream import ic foo = 1 def main(): ic(foo + 2 + 3) class baz: def __init__(self): \u00ab\u00bbbaz\u00ab\u00bb \u00ab\u00ab \u00abb.py\u00bb (muutuja \u00abfoo\u00bb on \u00fcmber nimetatud \u00abbar\u00bb-iks, t\u00f6\u00f6deldud kasutades \u00abblack\u00bb p\u00e4rast muudatusi, tulemuseks on sisestamine - t\u00fchikud ja \u00fcleliigsed read on eemaldatud): bar = 1 def main(): print(bar + 2 + 3) Kutsumine .\/mergiraf merge .\/base.py .\/a.py .\/b.py -x a.py -y b.py -s base.py -o .\/res.py annab j\u00e4rgmise tulemuse from icecream import ic bar = 1 def main(): ic(bar + 2 + 3) class baz: def __init__(self): \u00ab\u00bbbaz\u00ab\u00bb (silumiste printimiseks on kasutatud j\u00e4\u00e4kme raamatut, muutuja \u00abfoo\u00bb on \u00fcmber nimetatud \u00abbar\u00bb-iks, t\u00f6\u00f6deldud kasutades \u00abblack\u00bb p\u00e4rast muutusi, tulemuseks on sisestamine - t\u00fchikud ja \u00fcleliigsed read on eemaldatud, tabide ja t\u00fchikute segu sisestamiseks, kuid lubatud vorm).    <\/p>\n<p>Siin on kohe n\u00e4htav t\u00f6\u00f6riista puudus. Dokumendi stiil konfigureeritakse tavaliselt failides .editorconfig, ning globaalsed stiili muudatused, nagu tabsid ruumide vastu vahetamine ja black stiili kasutuselev\u00f5tt, nagu s\u00f5ltuvalt failist b.py, kaasnevad tavaliselt muudatustega .editorconfig. Seet\u00f5ttu peaks t\u00f6\u00f6riist, et neid muudatusi t\u00e4psemalt rakendada, omama kontseptsiooni globaalsete vaikeaviisi jaoks ja suutma seadeid .editorconfig'ist automaatselt t\u00f5mmata.<br \/>\n<br \/>Allikas: <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-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - 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.\" \/>\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\/et\/blog\/news\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/news\/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 AST-orienteeritud t\u00f6\u00f6riist kolmikliitmiseks Git'is | ProHoster","description":"On v\u00e4lja antud projekti mergiraf versioon 0.4, mis arendab Git draiverit kolmikliitmise v\u00f5imaluse rakendamisega.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/news\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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.","og:url":"https:\/\/prohoster.info\/et\/blog\/news\/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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/120981","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=120981"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/120981\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=120981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=120981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=120981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}