{"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\/hu\/blog\/news\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git","title":{"rendered":"mergiraf \u2014 AST-orient\u00e1lt eszk\u00f6z a Git h\u00e1romoldal\u00fa egyes\u00edt\u00e9s\u00e9hez.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Megjelent a mergiraf 0.4 verzi\u00f3, amely egy Git meghajt\u00f3 fejleszt\u00e9s\u00e9t c\u00e9lozza, \u00e9s lehet\u0151v\u00e9 teszi a h\u00e1romszoros egyes\u00edt\u00e9st. A mergiraf t\u00e1mogatja a k\u00fcl\u00f6nb\u00f6z\u0151 t\u00edpus\u00fa konfliktusok felold\u00e1s\u00e1t az egyes\u00edt\u00e9s sor\u00e1n, \u00e9s k\u00fcl\u00f6nb\u00f6z\u0151 programoz\u00e1si nyelvekhez \u00e9s f\u00e1jlform\u00e1tumokhoz haszn\u00e1lhat\u00f3. Lehet\u0151s\u00e9g van a mergiraf k\u00fcl\u00f6n\u00e1ll\u00f3 megh\u00edv\u00e1s\u00e1ra a konfliktusok kezel\u00e9s\u00e9re, amelyek a norm\u00e1l Git haszn\u00e1lata sor\u00e1n mer\u00fclnek fel, valamint a Git egyes\u00edt\u00e9si kezel\u0151j\u00e9nek helyettes\u00edt\u00e9s\u00e9re, b\u0151v\u00edtve ezzel olyan parancsok funkcionalit\u00e1s\u00e1t, mint a merge, revert, rebase \u00e9s cherry-pick. A k\u00f3d GPLv3 licenc alatt \u00e9rhet\u0151 el. Az \u00faj verzi\u00f3ban t\u00e1mogat\u00e1st kapott a Python, TOML, Scala \u00e9s Typescript nyelvekhez, valamint teljes\u00edtm\u00e9nyoptimaliz\u00e1l\u00e1sok is t\u00f6rt\u00e9ntek.    <\/p>\n<p>Az al\u00e1bbiakban r\u00e9szletes le\u00edr\u00e1st tal\u00e1l a mergiraf \u00e1ltal megoldott probl\u00e9m\u00e1kr\u00f3l:    <\/p>\n<p>A szoftver egy kiv\u00e1l\u00f3 p\u00e9lda egy rendk\u00edv\u00fcl \u00f6sszetett rendszerre. Az \u00f6sszetett rendszereknek egy k\u00f6z\u00f6s tulajdons\u00e1ga van - az \u00d6SSZETETTS\u00c9G - \u00e9s nem lehet elv\u00e1rni, hogy a sz\u00fcks\u00e9ges, komplex viselked\u00e9s mag\u00e1t\u00f3l, v\u00e9letlenszer\u0171en alakuljon ki. Ehelyett ezek a rendszerek id\u0151vel, l\u00e9p\u00e9sr\u0151l l\u00e9p\u00e9sre fejl\u0151dnek, \u00e9s minden mut\u00e1ci\u00f3t alaposan ellen\u0151riznek minden szakaszban. Ehhez j\u00f3l meghat\u00e1rozott strukt\u00far\u00e1ra \u00e9s megfelel\u0151 eszk\u00f6z\u00f6kre van sz\u00fcks\u00e9g. B\u00e1rmely \u00f6sszetett rendszer evol\u00faci\u00f3j\u00e1t ir\u00e1ny\u00edtott fak\u00e9nt lehet vizualiz\u00e1lni, ahol a gy\u00f6k\u00e9r egy \u00fcres funkci\u00f3halmazt k\u00e9pvisel, \u00e9s minden csom\u00f3pont - a gy\u00f6k\u00e9r kiv\u00e9tel\u00e9vel - a mut\u00e1ci\u00f3 alkalmaz\u00e1s\u00e1nak eredm\u00e9nye a sz\u00fcl\u0151j\u00e9n.     <\/p>\n<p>A term\u00e9kek vonatkoz\u00e1s\u00e1ban minden csom\u00f3pontot \"verzi\u00f3nak\" h\u00edvunk, ami egy adott funkci\u00f3k \u00e9s ellent\u00e9tes funkci\u00f3k halmaz\u00e1t jelenti. E halmaz b\u00e1rmilyen megv\u00e1ltoztat\u00e1sa mut\u00e1ci\u00f3nak sz\u00e1m\u00edt, amely \u00e9lt k\u00e9pez a mi ir\u00e1ny\u00edtott, ciklusmentes grafikonunkban. Ezek a funkci\u00f3k alapvet\u0151en absztraktak; nem t\u00fckr\u00f6zik k\u00f6zvetlen\u00fcl a fizikai rendszerek m\u0171k\u00f6d\u00e9s\u00e9t, hanem ink\u00e1bb azt mutatj\u00e1k be, hogyan \u00e9rz\u00e9kelik a racion\u00e1lis \u00fcgyn\u00f6k\u00f6k e rendszerek hasznoss\u00e1g\u00e1t. Az \u00f6tletek val\u00f3s megval\u00f3s\u00edt\u00e1sokra val\u00f3 \u00e1t\u00fcltet\u00e9s\u00e9hez fel kell g\u00f6rd\u00edteni az ingujjakat, \u00e9s be kell mer\u00fclni *el\u00e9g* alacsony szint\u0171 r\u00e9szletekbe, olyan nyelven, amely lehet\u0151v\u00e9 teszi a konkr\u00e9t m\u0171k\u00f6d\u00e9s\u00fck kifejez\u00e9s\u00e9t \u00e9s magyar\u00e1zat\u00e1t. A szoftverfejleszt\u00e9sben ezek az alacsony szint\u0171 r\u00e9szletek \u00e1ltal\u00e1ban a forr\u00e1sk\u00f3dot k\u00e9pviselik.    <\/p>\n<p>Ahhoz, hogy fokozatosan a k\u00edv\u00e1nt viselked\u00e9st megval\u00f3s\u00edts\u00e1k a forr\u00e1sk\u00f3dban, \u00e9s dokument\u00e1lj\u00e1k, hogyan jutottak el oda, a programoz\u00f3k a munk\u00e1jukat snapshotok \u00e9s changesetek form\u00e1j\u00e1ban mutatj\u00e1k be. A snapshot a term\u00e9k egy adott \u00e1llapota, minden alacsony szint\u0171 r\u00e9szlettel, m\u00edg a changeset az \u00e1tmenetet jel\u00f6li a snapshotok k\u00f6z\u00f6tt. A snapshotokat \u00e1ltal\u00e1ban az egyes changesetek gener\u00e1lj\u00e1k a sz\u00fcl\u0151ikhez k\u00e9pest, ez\u00e9rt ezek a snapshotok szinte mindig azokat a changeseteket jel\u00f6lik, amelyek l\u00e9trehozt\u00e1k \u0151ket, \u00edgy ezeket a kifejez\u00e9seket gyakran felcser\u00e9lhet\u0151en haszn\u00e1lj\u00e1k.     <\/p>\n<p>N\u00e9ha l\u00e9teznek f\u00e9nyk\u00e9pek, amelyeket t\u00f6bb \u00e1tvitel eredm\u00e9nyek\u00e9nt k\u00e9sz\u00edtettek - a commitok egyes\u00edt\u00e9sek\u00e9nt. Ezekkel neh\u00e9z dolgozni, ez\u00e9rt \u00e1ltal\u00e1ban elker\u00fclik \u0151ket. A modern, ny\u00edlt forr\u00e1sk\u00f3d\u00fa verzi\u00f3kezel\u0151 rendszerek, mint p\u00e9ld\u00e1ul a Git, meglehet\u0151sen alapvet\u0151 lehet\u0151s\u00e9geket ny\u00fajtanak a fejleszt\u00e9si munkafolyamatok kezel\u00e9s\u00e9re. Lehet\u0151v\u00e9 teszik a fejleszt\u0151k sz\u00e1m\u00e1ra, hogy a f\u00e9nyk\u00e9peket ir\u00e1ny\u00edtott, ciklusmentes grafikonok form\u00e1j\u00e1ban szervezz\u00e9k, kommentekkel l\u00e1ss\u00e1k el \u0151ket, \u00e9s sz\u00fcks\u00e9g eset\u00e9n megv\u00e1ltoztathass\u00e1k a sorrendj\u00fcket.     <\/p>\n<p>Ez a funkcionalit\u00e1s lehet\u0151v\u00e9 teszi a fejleszt\u0151k sz\u00e1m\u00e1ra, hogy egy szemantikailag jelent\u0151s projekt t\u00f6rt\u00e9netet \u00edrjanak, ami alapvet\u0151 fontoss\u00e1g\u00fa a hibakeres\u00e9shez \u00e9s olyan k\u00e9rd\u00e9sek megv\u00e1laszol\u00e1s\u00e1hoz, mint p\u00e9ld\u00e1ul: \u201eMi\u00e9rt ker\u00fclt be ez a low-level r\u00e9sz (pl. v\u00e1ltoz\u00f3)?\u201d; \u201eH\u00e1ny sz\u00e1zal\u00e9kban k\u00f6zvetlen\u00fcl az \u00e9n hozz\u00e1j\u00e1rul\u00e1som a projektbe?\u201d; \u201eKit t\u00f6rt\u00e9k fel a backdoor bevezet\u00e9sekor, \u00e9s mikor?\u201d; \u201eMilyen low-level v\u00e1ltoz\u00e1s t\u00f6rte el ezt a funkci\u00f3t (b\u00e1r nem kellett volna, mindent ellen\u0151rizt\u00fcnk!?)\u201d    <\/p>\n<p>A verzi\u00f3kezel\u0151 rendszerek kieg\u00e9sz\u00edtik ezt az \u00e1gazat fogalm\u00e1val \u2014 egy low-level fogalom, amely egyszer\u0171en egy folyamatos r\u00e9sz\u00e9t jelenti a projekt low-level t\u00f6rt\u00e9net\u00e9nek, amely szemantikailag jelent\u0151s a fejleszt\u0151 sz\u00e1m\u00e1ra. Az \u00e1gakat \u00e1ltal\u00e1ban specifikus funkci\u00f3k megval\u00f3s\u00edt\u00e1s\u00e1ra haszn\u00e1lj\u00e1k, n\u00e9ha t\u00f6bb \u00e1gat hoznak l\u00e9tre ugyanannak a funkci\u00f3nak k\u00fcl\u00f6nb\u00f6z\u0151 megval\u00f3s\u00edt\u00e1saihoz. A branch-lel val\u00f3 munkafolyamatok haszn\u00e1lat\u00e1val (amelyek val\u00f3j\u00e1ban mainstream \u00e9s a fejleszt\u00e9si szabv\u00e1nyok, mindenhol haszn\u00e1lj\u00e1k) minden egyes fejleszt\u0151 hat\u00e9konyan kezelheti a projekt sok konflikt\u00e1l\u00f3 \u00e1g\u00e1t, amelyek k\u00fcl\u00f6nb\u00f6znek \u00e9retts\u00e9g\u00fckben vagy min\u0151s\u00e9g\u00fckben. Ez lehet\u0151v\u00e9 teszi a fejleszt\u0151k sz\u00e1m\u00e1ra, hogy kombin\u00e1lj\u00e1k saj\u00e1t \u00e9s m\u00e1sok munk\u00e1j\u00e1nak eredm\u00e9nyeit an\u00e9lk\u00fcl, hogy minden alkalommal \u00fajra kellene \u00edrniuk az eg\u00e9szet.     <\/p>\n<p>\u00c1ltal\u00e1ban egy f\u0151 \u00e1gat hoznak l\u00e9tre, amely az \u201eofficial\u201d term\u00e9ket k\u00e9pviseli, ebb\u0151l oldals\u00f3 \u00e1gak \u00e1gaznak el, amelyek minden alkalommal (ide\u00e1lis esetben \u2014 minden commit ut\u00e1n) szinkroniz\u00e1lva vannak a f\u0151 \u00e1ggal, lehet\u0151v\u00e9 t\u00e9ve a fejleszt\u0151k sz\u00e1m\u00e1ra, hogy a legfrissebb verzi\u00f3val dolgozzanak, mik\u00f6zben a fejleszt\u00e9s alatt \u00e1ll\u00f3 funkci\u00f3kat is integr\u00e1lj\u00e1k, m\u00e9g a t\u00f6bbi fejleszt\u0151 tev\u00e9kenys\u00e9geib\u0151l ad\u00f3d\u00f3 probl\u00e9m\u00e1k korai \u00e9szlel\u00e9se \u00e9rdek\u00e9ben.    <\/p>\n<p>Amikor k\u00fcl\u00f6nb\u00f6z\u0151 snapshotok funkci\u00f3inak kombin\u00e1l\u00e1s\u00e1ra pr\u00f3b\u00e1lunk, ami l\u00e9nyeg\u00e9ben egy k\u00f6z\u00f6s \u0151s megtal\u00e1l\u00e1s\u00e1t \u00e9s a l\u00e9trehoz\u00f3 changesetek ism\u00e9telt alkalmaz\u00e1s\u00e1t jelenti a m\u00e1sikra, ezt az elj\u00e1r\u00e1st rebase-nek h\u00edvj\u00e1k. A merge, vagyis az \u00f6sszevon\u00e1s egyfajta rebase, de a commit grafikon strukt\u00far\u00e1j\u00e1ban m\u00e1sk\u00e9pp szervez\u0151dik, ami miatt neh\u00e9z \u0151ket manipul\u00e1lni. Ez\u00e9rt az \u00f6sszevon\u00e1st\u00f3l a rebase fel\u00e9 pr\u00f3b\u00e1lnak \u00e1tv\u00e1ltani. A modern verzi\u00f3kezel\u0151 rendszerek (VCS) bels\u0151 v\u00e1ltoztat\u00e1s-\u00f6sszevon\u00e1si algoritmusokat haszn\u00e1lnak, amelyek egyszer\u0171en a f\u00e1jlokat k\u00fcl\u00f6n sorokra bontj\u00e1k, minden sort szimb\u00f3lumk\u00e9nt kezelnek, a f\u00e1jlokat pedig ezek sorozatak\u00e9nt, majd bioinformatikai sz\u00e1rmaz\u00e1s\u00fa algoritmusokat alkalmaznak a f\u00fazi\u00f3khoz.     <\/p>\n<p>Sajn\u00e1latos m\u00f3don az eredeti k\u00f3d soronk\u00e9nti reprezent\u00e1ci\u00f3ja nem sokat mond a tartalm\u00e1r\u00f3l. Az egyetlen el\u0151nye, hogy egyszer\u0171 \u00e9s univerz\u00e1lis. Az elt\u00e9r\u00e9s konfliktusokhoz vezet, ami \u00e1lland\u00f3 fejf\u00e1j\u00e1st jelent a fejleszt\u0151k sz\u00e1m\u00e1ra. A konfliktusok felold\u00e1sa megk\u00f6veteli a fejleszt\u0151t\u0151l, hogy alaposan tanulm\u00e1nyozza mindk\u00e9t k\u00f3dverzi\u00f3t, nemcsak azokat a r\u00e9szeket, amelyeket a soralap\u00fa \u00f6sszehasonl\u00edt\u00f3 algoritmus \"m\u00f3dos\u00edtott\" vagy \"konfliktusos\" jel\u00f6l, hanem lehet\u0151s\u00e9g szerint az eg\u00e9sz projektet is.     <\/p>\n<p>A fejleszt\u0151nek meg kell \u00e9rtenie a v\u00e1ltoz\u00e1sokat, manu\u00e1lisan meg kell \u00edrnia az \u00f6sszevont k\u00f3dot, \u00e9s el kell h\u00e1r\u00edtania a b\u00e1rmilyen elt\u00e9r\u00e9st. A probl\u00e9m\u00e1k sz\u00e1ma n\u00f6vekszik, amikor a soralap\u00fa eszk\u00f6z rosszul azonos\u00edtja a v\u00e1ltoz\u00e1sokat, ami gyakran el\u0151fordul nagyobb m\u00f3dos\u00edt\u00e1sokn\u00e1l, bele\u00e9rtve a trivi\u00e1lisakat, p\u00e9ld\u00e1ul a k\u00f3d \u00fajraform\u00e1z\u00e1s\u00e1t. Ha a k\u00e9s\u0151bbi m\u00f3dos\u00edt\u00e1sokat nem siker\u00fcl alkalmazni a manu\u00e1lisan \u00f6sszevont k\u00f3dra, a helyzet teljes r\u00e9m\u00e1lomm\u00e1 v\u00e1lik. A r\u00e9miszt\u0151 esetek ellen\u00e9re a legt\u00f6bb esetben a soralap\u00fa algoritmus m\u0171k\u00f6dik, k\u00fcl\u00f6n\u00f6sen ha a fejleszt\u0151k akt\u00edvan igyekeznek nem probl\u00e9m\u00e1t okozni. Az ilyen probl\u00e9m\u00e1k minimaliz\u00e1l\u00e1s\u00e1nak egyik m\u00f3dja a forr\u00e1sk\u00f3dok k\u00f6telez\u0151 feldolgoz\u00e1sa kanoniz\u00e1l\u00f3 eszk\u00f6z\u00f6kkel, mint p\u00e9ld\u00e1ul a black.    <\/p>\n<p>Term\u00e9szetes, hogy a r\u00e9miszt\u0151 esetek helyes megold\u00e1sa (\u00e9s \u00e1ltal\u00e1ban nem csak ezek eset\u00e9ben, a soronk\u00e9nti algoritmus \u2014 ez egy heurisztika, ami nyilv\u00e1nval\u00f3an hib\u00e1s k\u00f3dhoz vezethet, p\u00e9ld\u00e1ul ha az egyik fejleszt\u0151 \u00e1tnevezi a v\u00e1ltoz\u00f3t, m\u00edg a m\u00e1sik egy \u00faj k\u00f3dot \u00edr, ami haszn\u00e1lja ezt a v\u00e1ltoz\u00f3t, akkor itt nem lesz egyes\u00edt\u00e9si vagy \u00fajrab\u00e1zis konfliktus, de az eredm\u00e9ny nem m\u0171k\u00f6dik) \u2014 a helyes bels\u0151 modell haszn\u00e1lata.     <\/p>\n<p>B\u00e1r a kutat\u00e1sok ezen a ter\u00fcleten m\u00e1r k\u00f6r\u00fclbel\u00fcl 30 \u00e9ve zajlanak, \u00e9s t\u00f6bb szabadalmaztatott kereskedelmi term\u00e9k l\u00e9trehoz\u00e1s\u00e1hoz vezettek, ezek a kutat\u00e1sok a k\u00f6zelm\u00faltig nem alakultak \u00e1t gyakorlati alkalmaz\u00e1sra alkalmas ny\u00edlt forr\u00e1sk\u00f3d\u00fa term\u00e9kekk\u00e9. A t\u00f6bbs\u00e9g ny\u00edlt forr\u00e1sk\u00f3d\u00fa megold\u00e1sa az 2010-es \u00e9vek elej\u00e9n kezdett el fejl\u0151dni, \u00e9s f\u0151k\u00e9nt a Java nyelvre \u00f6sszpontos\u00edtott.    <\/p>\n<p>A legkiemelked\u0151bb szabad implement\u00e1ci\u00f3 a GumTree, amelyet egy akad\u00e9miai h\u00e1tt\u00e9rrel rendelkez\u0151 kutat\u00f3 k\u00e9sz\u00edtett, Java nyelven \u00edr\u00f3dott, saj\u00e1t absztrakt bels\u0151 reprezent\u00e1ci\u00f3val rendelkezik, amely megel\u0151zte a treesitter-t, backendjei pedig mind a treesitter alap\u00fa, mind m\u00e1s eszk\u00f6z\u00f6ket haszn\u00e1lnak a forr\u00e1sk\u00f3d absztrakt reprezent\u00e1ci\u00f3ba val\u00f3 parse-ol\u00e1s\u00e1ra. Ez a rendszer csak esem\u00e9nynapl\u00f3 form\u00e1j\u00e1ban k\u00e9pes gener\u00e1lni (tov\u00e1bb\u00e1 van egy API, amelyet b\u00e1rmely Java-hoz k\u00f6t\u00f6tt nyelvb\u0151l k\u00f6nnyed\u00e9n h\u00edvhatunk) \u00e9s vizualiz\u00e1lni a v\u00e1ltoz\u00e1sokat. Azonban a v\u00e1ltoz\u00e1sok \u00f6sszevon\u00e1s\u00e1ra, illetve az \u00e1ltala gener\u00e1lt diff f\u00e1jlok megtekint\u00e9s\u00e9re nem alkalmazhat\u00f3 alap\u00e9rtelmezetten (b\u00e1r val\u00f3sz\u00edn\u0171, hogy a diff-ok bet\u00f6lt\u00e9s\u00e9t az API-n kereszt\u00fcl meg lehet val\u00f3s\u00edtani).    <\/p>\n<p>Egy fiatalabb \u00e9s a gyakorlatban jobban alkalmazhat\u00f3 difftastic megval\u00f3s\u00edt\u00e1s Rust nyelven k\u00e9sz\u00fclt, treesitter alap\u00fa, \u00e9s a kiemelt diff-ok gener\u00e1l\u00e1s\u00e1ra \u00f6sszpontos\u00edt a konzolon. Ez a rendszer is a diff-ok vizualiz\u00e1l\u00e1s\u00e1ra ir\u00e1nyul, \u00e9s nem t\u0171zi ki c\u00e9lul a v\u00e1ltoz\u00e1sok \u00f6sszevon\u00e1s\u00e1t vagy a patch-ek alkalmaz\u00e1s\u00e1t.    <\/p>\n<p>Nemr\u00e9giben megjelent \u00e9s akt\u00edvan fejl\u0151dik a mergiraf projekt. Ez egy Rust-ban \u00edrt eszk\u00f6z (21 MiB-ot foglal el!), amely szint\u00e9n a treesitter-re \u00e9p\u00fcl, amely m\u00e1r olyan standardd\u00e9 v\u00e1lt a kontextusmentes grammatika parszerein\u00e9l, mint amilyen az LLVM az alacsony szint\u0171 utas\u00edt\u00e1sok optimaliz\u00e1l\u00e1s\u00e1ban. A versenyt\u00e1rsakkal ellent\u00e9tben a mergiraf nem diff-gener\u00e1l\u00f3 funkci\u00f3kat k\u00edn\u00e1l, hanem automatikus egyes\u00edt\u00e9si konfliktusok felold\u00e1s\u00e1ra szolg\u00e1l. A mergiraf a patch-ek gener\u00e1l\u00e1s\u00e1hoz a GumTree algoritmus\u00e1nak megval\u00f3s\u00edt\u00e1s\u00e1t, az alkalmaz\u00e1shoz pedig a spork algoritmus\u00e1nak megval\u00f3s\u00edt\u00e1s\u00e1t haszn\u00e1lja, amelyet a treesitter strukt\u00far\u00e1ira optimaliz\u00e1ltak.     <\/p>\n<p>A patch-ek f\u00e1jlokba val\u00f3 sorozatba \u00e1ll\u00edt\u00e1sa, amelyeket k\u00e9s\u0151bb lehetne alkalmazni, sajnos nincsen megval\u00f3s\u00edtva (de val\u00f3sz\u00edn\u0171, hogy a GumTree \u00e1ltal gener\u00e1lt esem\u00e9nynapl\u00f3k parse-ol\u00e1s\u00e1val meg lehet val\u00f3s\u00edtani). Egy m\u00e1sik \u00edg\u00e9retes m\u00f3dszer a k\u00fcl\u00f6nbs\u00e9gek alkalmaz\u00e1s\u00e1ra nem patch-ek r\u00e9v\u00e9n t\u00f6rt\u00e9nhet, hanem az LSP szerverek refaktor\u00e1l\u00f3 k\u00e9pess\u00e9g\u00e9n kereszt\u00fcl, ami seg\u00edthet a konfliktusok \u00e9szlel\u00e9s\u00e9ben az eg\u00e9sz projekten szinten. A vizualiz\u00e1ci\u00f3 csak a konfliktusok sz\u00e1m\u00e1ra t\u00e1mogatott.    <\/p>\n<p>M\u0171k\u00f6d\u00e9s p\u00e9ld\u00e1ja: a k\u00f6z\u00f6s \u0151s \u201ebase.py\u201d (tabul\u00e1torokkal val\u00f3 beh\u00faz\u00e1sok, felesleges sor a kezd\u00e9sn\u00e9l) foo = 1 def main(): print(foo + 2 + 3) \u201ea.py\u201d (m\u00e1sodlagos beh\u00faz\u00e1sokkal, 2 felesleges sor a kezd\u00e9sn\u00e9l egy helyett, a hibakeres\u00e9shez az icecream k\u00f6nyvt\u00e1rat haszn\u00e1lja, a \u201ebaz\u201d oszt\u00e1ly hozz\u00e1adva: from icecream import ic foo = 1 def main(): ic(foo + 2 + 3) class baz: def __init__(self): \u201e\u201d\u201dbaz\u201e\u201d\u201d\u201d \u201eb.py\u201d (a \u201efoo\u201d v\u00e1ltoz\u00f3 \u00e1tnevezve \u201ebar\u201d-ra, a black haszn\u00e1lat\u00e1val feldolgozva a v\u00e1ltoz\u00e1sok ut\u00e1n, ennek eredm\u00e9nyek\u00e9nt a beh\u00faz\u00e1sok sz\u00f3k\u00f6z\u00f6kkel \u00e9s a felesleges sorok elt\u00e1vol\u00edtva): bar = 1 def main(): print(bar + 2 + 3) A h\u00edv\u00e1s .\\\/mergiraf merge .\\\/base.py .\\\/a.py .\\\/b.py -x a.py -y b.py -s base.py -o .\\\/res.py a k\u00f6vetkez\u0151t adja vissza from icecream import ic bar = 1 def main(): ic(bar + 2 + 3) class baz: def __init__(self): \u201e\u201d\u201dbaz\u201e\u201d\u201d\u201d (a hibakeres\u00e9shez az icecream k\u00f6nyvt\u00e1rat haszn\u00e1lja, a \u201efoo\u201d v\u00e1ltoz\u00f3 \u00e1tnevezve \u201ebar\u201d-ra, a black seg\u00edts\u00e9g\u00e9vel feldolgozva a v\u00e1ltoz\u00e1sok ut\u00e1n, ennek eredm\u00e9nyek\u00e9nt a beh\u00faz\u00e1sok sz\u00f3k\u00f6z\u00f6kkel \u00e9s a felesleges sorok elt\u00e1vol\u00edtva, tabul\u00e1torok \u00e9s sz\u00f3k\u00f6z\u00f6k kever\u00e9ke a beh\u00faz\u00e1sn\u00e1l, de enged\u00e9lyezett forma).    <\/p>\n<p>Itt l\u00e1tszik az eszk\u00f6z h\u00e1tr\u00e1nya. A dokumentum st\u00edlus\u00e1t \u00e1ltal\u00e1ban az &#171;.editorconfig&#187; f\u00e1jlokban konfigur\u00e1lj\u00e1k, \u00e9s a glob\u00e1lis st\u00edlusv\u00e1ltoz\u00e1sok, mint p\u00e9ld\u00e1ul a tabul\u00e1torok sz\u00f3k\u00f6z\u00f6kre cser\u00e9l\u00e9se \u00e9s a black st\u00edlus alkalmaz\u00e1sa, mint ahogyan azt a &#171;b.py&#187;-ben tett\u00e9k, \u00e1ltal\u00e1ban v\u00e1ltoz\u00e1sokat vonnak maguk ut\u00e1n az &#171;.editorconfig&#187;-ban. Ez\u00e9rt a hasonl\u00f3 v\u00e1ltoz\u00e1sok pontosabb alkalmaz\u00e1s\u00e1hoz az eszk\u00f6znek rendelkeznie kell egy glob\u00e1lis &#171;alap\u00e9rtelmezett&#187; st\u00edlus koncepci\u00f3j\u00e1val, \u00e9s k\u00e9pesnek kell lennie be\u00e1ll\u00edt\u00e1sokat leh\u00fazni az &#171;.editorconfig&#187;-b\u00f3l.<br \/>\n<br \/>Forr\u00e1s: <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.3 - 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\/hu\/blog\/news\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\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\/hu\/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-ir\u00e1ny\u00edtott eszk\u00f6z a h\u00e1romir\u00e1ny\u00fa egyes\u00edt\u00e9shez a Git-ben | ProHoster","description":"Megjelent a mergiraf 0.4 projekt, amely a Git-hez kapcsol\u00f3d\u00f3 meghajt\u00f3t fejleszti, \u00e9s megval\u00f3s\u00edtja a h\u00e1romir\u00e1ny\u00fa egyes\u00edt\u00e9s lehet\u0151s\u00e9g\u00e9t.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/news\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/120981","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=120981"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/120981\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=120981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=120981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=120981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}