{"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\/it\/blog\/novosti-interneta\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git","title":{"rendered":"mergiraf \u2014 uno strumento orientato ad AST per il merge a tre vie in Git","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00c8 stato rilasciato il progetto mergiraf 0.4, che sviluppa un driver per Git con implementazione della funzionalit\u00e0 di merge a tre vie. Mergiraf supporta la risoluzione di vari tipi di conflitti durante il merge e pu\u00f2 essere utilizzato per diversi linguaggi di programmazione e formati di file. \u00c8 possibile utilizzare mergiraf come richiamo separato per gestire i conflitti che sorgono nell'uso di Git standard, nonch\u00e9 sostituirlo in Git come gestore di merge per ampliare le funzionalit\u00e0 di comandi come merge, revert, rebase e cherry-pick. Il codice \u00e8 distribuito sotto licenza GPLv3. Nella nuova versione \u00e8 stata aggiunta la supporto per i linguaggi Python, TOML, Scala e Typescript, e sono state effettuate ottimizzazioni delle prestazioni.    <\/p>\n<p>Di seguito \u00e8 fornita una descrizione dettagliata dei problemi risolti con mergiraf:    <\/p>\n<p>Il software \u00e8 un esempio eccellente di un sistema estremamente complesso. I sistemi complessi hanno una caratteristica comune: sono COMPLESSI e non ci si pu\u00f2 aspettare che un comportamento complesso emerga da solo, casualmente. Al contrario, questi sistemi evolvono nel tempo, passo dopo passo, e ogni mutazione viene accuratamente verificata a ciascun passaggio. Per raggiungere ci\u00f2, \u00e8 necessaria una struttura ben definita e gli strumenti appropriati. L'evoluzione di qualsiasi sistema complesso pu\u00f2 essere visualizzata come un albero orientato, dove la radice rappresenta un insieme vuoto di funzioni e ogni nodo, eccetto la radice, \u00e8 il risultato dell'applicazione di una mutazione al suo genitore.     <\/p>\n<p>Nel contesto dei prodotti, ogni nodo \u00e8 chiamato \"versione\", rappresentando un insieme specifico di funzioni e antifunzioni. Qualsiasi modifica a questo insieme \u00e8 considerata una mutazione, che forma un arco nel nostro grafo orientato e aciclico. Queste funzioni sono per loro natura astratte; non riflettono direttamente i modi in cui funzionano i sistemi fisici, ma piuttosto dimostrano come agenti razionali percepiscono l'utilit\u00e0 di questi sistemi. Per tradurre le idee in attuazioni reali nel mondo, \u00e8 necessario rimboccarsi le maniche e immergersi nei dettagli *abbastanza* a basso livello, nel linguaggio attraverso il quale si pu\u00f2 esprimere e spiegare come tutto funzioni concretamente. Nello sviluppo software, questi bassi livelli sono generalmente rappresentati dal codice sorgente.    <\/p>\n<p>Per portare gradualmente il codice sorgente in uno stato che manifesti il comportamento richiesto e documentare come ci siano arrivati, i programmatori presentano il loro lavoro in termini di snapshot e changeset. Uno snapshot rappresenta uno stato specifico del prodotto con tutti i dettagli di basso livello, mentre un changeset indica la transizione tra gli snapshot. Di solito, gli snapshot sono generati da singoli changeset ai loro genitori, quindi questi snapshot vengono quasi sempre etichettati con ci\u00f2 che i changeset hanno creato, ed \u00e8 per questo che questi termini vengono spesso usati in modo intercambiabile.     <\/p>\n<p>A volte esistono snapshot ottenuti a seguito di diversi passaggi \u2014 fusioni di commit. Sono difficili da gestire, pertanto di solito si evita di usarli. I moderni sistemi di controllo versione open source, come Git, offrono capacit\u00e0 di base per gestire i flussi di lavoro di sviluppo. Consentono agli sviluppatori di organizzare snapshot in grafi orientati e aciclici, annotarli con commenti e, se necessario, cambiarne l'ordine.     <\/p>\n<p>Questa funzionalit\u00e0 consente agli sviluppatori di scrivere una storia semantica del progetto, fondamentale per il debug e per rispondere a domande come: \"Perch\u00e9 \u00e8 stato introdotto questo dettaglio a basso livello (ad es., una variabile)?\", \"Qual \u00e8 stata approssimativamente la mia percentuale di contributo a questo progetto?\", \"Chi ha compromesso gli exploit e quando?\", \"Quale modifica a basso livello ha rotto questa funzione (anche se non dovrebbe, abbiamo controllato tutto!?)\".    <\/p>\n<p>I sistemi di controllo versione completano questo concetto con quello di ramo \u2014 un concetto a basso livello che significa semplicemente un frammento continuo della storia a basso livello del progetto, semanticamente significativo per lo sviluppatore. I rami sono generalmente utilizzati per implementazioni specifiche di funzionalit\u00e0, e a volte vengono creati diversi rami per diversi candidati all'implementazione della stessa funzionalit\u00e0. Utilizzando flussi di lavoro con ramificazioni (che sono di fatto lo standard e la prassi di sviluppo, utilizzati ovunque), ogni singolo sviluppatore pu\u00f2 gestire in modo efficace molti rami conflittuali del progetto, ognuno dei quali varia in termini di prontezza o qualit\u00e0. Questo consente agli sviluppatori di combinare i risultati del proprio lavoro e di altri senza dover reinserire manualmente tutto ogni volta.     <\/p>\n<p>Di solito si crea un ramo principale, rappresentante il prodotto \"ufficiale\", da cui si ramificano rami secondari per ogni funzione, che si sincronizzano regolarmente (ideale dopo ogni commit) con il ramo principale, permettendo agli sviluppatori di lavorare con la versione pi\u00f9 recente del prodotto e contemporaneamente implementare le funzionalit\u00e0 che stanno attualmente sviluppando, rilevando problemi derivanti dalle azioni di altri sviluppatori il prima possibile.    <\/p>\n<p>Quando si cerca di combinare funzionalit\u00e0 di vari snapshot (che \u00e8 semplicemente trovare un antenato comune e applicare i changeset che li generano successivamente sopra l'altro, questa operazione \u00e8 chiamata rebase; la fusione, d'altra parte, \u00e8 quasi come un rebase, ma struttura il grafo dei commit in modo diverso, rendendolo scomodo da manipolare, quindi si tende a evitare le fusioni a favore dei rebase), sorgono problemi. I moderni sistemi di controllo versione (VCS) utilizzano algoritmi interni di fusione delle modifiche, che semplicemente suddividono i file in singole linee, trattano ogni linea come un simbolo e i file come le loro sequenze, applicando quindi algoritmi per la loro fusione, che provengono dalla bioinformatica.     <\/p>\n<p>Sfortunatamente, una rappresentazione riga per riga del codice sorgente non ha nulla a che fare con il suo contenuto. L'unico suo pregio \u00e8 che \u00e8 semplice e universale. La discrepanza porta a conflitti, risultando in una costante fonte di mal di testa per gli sviluppatori. Risolvere i conflitti richiede che lo sviluppatore esamini attentamente entrambe le versioni del codice, non solo le sezioni contrassegnate dall'algoritmo di confronto come \"modificate\" o \"in conflitto\", ma forse anche l'intero progetto.     <\/p>\n<p>Lo sviluppatore deve comprendere le modifiche, scrivere manualmente il codice di unione e risolvere eventuali discrepanze. I problemi aumentano quando lo strumento riga per riga identifica erroneamente le modifiche, il che accade frequentemente durante grandi cambiamenti, comprese le modifiche banali come il riformattazione del codice. Se i successivi cambiamenti non possono essere applicati al codice unito manualmente, la situazione diventa un incubo totale. Nonostante questi casi allarmanti, nella maggior parte dei casi l'algoritmo riga per riga funziona, soprattutto se gli sviluppatori si impegnano attivamente a non creargli problemi. Uno dei modi per ridurre al minimo tali problemi \u00e8 l'obbligo di elaborare le sorgenti tramite strumenti di canonicalizzazione, come black.    <\/p>\n<p>\u00c8 evidente che la soluzione corretta per i casi allarmanti (e non solo per quelli, poich\u00e9 l'algoritmo riga per riga \u00e8 un'euristica, e pu\u00f2 in modo banale portare a codice non funzionante, ad esempio se un sviluppatore rinomina una variabile mentre un altro sta scrivendo un nuovo pezzo di codice che utilizza quella variabile, non ci sar\u00e0 conflitto di unione\/ribase, ma il risultato diventer\u00e0 non funzionante) \u00e8 l'uso di un modello interno corretto.     <\/p>\n<p>Nonostante siano in corso ricerche in questo campo da circa 30 anni, che hanno portato alla creazione di diversi prodotti commerciali proprietari, fino a tempi recenti queste ricerche non erano ancora state trasformate in prodotti praticamente applicabili con codice sorgente aperto. La maggior parte delle soluzioni open source ha iniziato a svilupparsi all'inizio degli anni 2010 ed \u00e8 stata principalmente focalizzata sul linguaggio Java.    <\/p>\n<p>La realizzazione open source pi\u00f9 notevole di quel periodo, GumTree, \u00e8 stata creata da un ricercatore con una formazione accademica, \u00e8 scritta in Java e ha una sua rappresentazione interna astratta, precedente a treesitter. Ha backend sia basati su treesitter che su altri strumenti per il parsing del codice sorgente in rappresentazioni astratte. Questo sistema \u00e8 in grado di generare (sotto forma di log testuale degli eventi, \u00e8 disponibile anche un'API che pu\u00f2 essere facilmente richiamata da qualsiasi linguaggio di programmazione che abbia binding per Java) e visualizzare le modifiche. Tuttavia, per unire le modifiche e per visualizzare i file diff generati, non \u00e8 applicabile di default (tuttavia, \u00e8 probabile che il caricamento dei diff possa essere implementato tramite API).    <\/p>\n<p>Una realizzazione pi\u00f9 giovane e praticabile di difftastic \u00e8 scritta in Rust, \u00e8 basata su treesitter e si concentra sulla generazione di diff evidenziati nella console. Questo sistema \u00e8 anche orientato alla visualizzazione dei diff e non ha come obiettivo la fusione delle modifiche o l'applicazione di patch.    <\/p>\n<p>Di recente \u00e8 emerso e si sta sviluppando attivamente il progetto mergiraf. Questo strumento scritto in Rust (occupa 21 MiB!) \u00e8 anche basato su treesitter, che \u00e8 gi\u00e0 diventato uno standard per i parser di grammatiche libere nel contesto degli strumenti di sviluppo, proprio come LLVM lo \u00e8 per l'ottimizzazione delle rappresentazioni di basso livello delle istruzioni. A differenza dei concorrenti, mergiraf offre funzionalit\u00e0 non per generare diff, ma per risolvere automaticamente i conflitti di unione. Sotto il cofano, mergiraf utilizza per la generazione di patch un'implementazione dell'algoritmo usato in GumTree, e per l'applicazione - un'implementazione dell'algoritmo usato in spork, adattato per le strutture treesitter.     <\/p>\n<p>La serializzazione delle patch in file che possono essere applicati successivamente non \u00e8 attualmente implementata (ma \u00e8 molto probabile che possa essere realizzata attraverso il parsing dei log eventi generati da GumTree). Un altro modo promettente per applicare le differenze potrebbe essere l'uso delle differenze non tramite patch, ma attraverso la funzionalit\u00e0 di refactoring dei server LSP, il che potrebbe aiutare nella rilevazione dei conflitti a livello di progetto. La visualizzazione \u00e8 supportata solo per i conflitti.    <\/p>\n<p>Esempio di funzionamento: un antenato comune \"base.py\" (righe con tabulazioni, riga vuota all'inizio) foo = 1 def main(): print(foo + 2 + 3) \"a.py\" (righe con tabulazioni, 2 righe vuote all'inizio invece di una, per la stampa di debug si utilizza la libreria icecream, \u00e8 stata aggiunta la classe \"baz\": from icecream import ic foo = 1 def main(): ic(foo + 2 + 3) class baz: def __init__(self): \"\"\"baz\"\"\" \"b.py\" (la variabile \"foo\" \u00e8 stata rinominata in \"bar\", elaborata con \"black\" dopo le modifiche, risultando in righe con spazi bianchi e righe vuote rimosse): bar = 1 def main(): print(bar + 2 + 3) La chiamata .\/mergiraf merge .\/base.py .\/a.py .\/b.py -x a.py -y b.py -s base.py -o .\/res.py d\u00e0 il seguente risultato from icecream import ic bar = 1 def main(): ic(bar + 2 + 3) class baz: def __init__(self): \"\"\"baz\"\"\" (per la stampa di debug si utilizza la libreria \"icecream\", la variabile \"foo\" \u00e8 stata rinominata in \"bar\", elaborata con \"black\" dopo le modifiche, risultando in righe con spazi e righe vuote rimosse, un misto di tabulazioni e spazi per l'indentazione, ma nel formato autorizzato).    <\/p>\n<p>Qui si vede immediatamente il difetto dello strumento. Lo stile del documento \u00e8 solitamente configurato nei file \".editorconfig\", e le modifiche globali allo stile, come il passaggio da tabulazioni a spazi e l'adozione dello stile di black, come fatto in \"b.py\", di solito accompagnano modifiche in \".editorconfig\". Pertanto, per applicare in modo pi\u00f9 preciso tali modifiche, lo strumento dovrebbe avere un concetto di stile globale \"di default\" e sapere come attingere alle impostazioni da \".editorconfig\".<br \/>\n<br \/>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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 strumento orientato ad AST per fusione a tre vie in Git | ProHoster","description":"Pubblicato il rilascio del progetto mergiraf 0.4, che sviluppa un driver per Git con implementazione della possibilit\u00e0 di fusione a tre vie. Mergiraf supporta la risoluzione di vari tipi di conflitti durante la fusione e pu\u00f2 essere utilizzato per diversi linguaggi di programmazione e formati di file. \u00c8 possibile sia una chiamata separata a mergiraf per gestire i conflitti che si verificano lavorando con il Git standard, sia la sostituzione dell'handler di fusione in Git per estensioni.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/novosti-interneta\/mergiraf-ast-orientirovannyj-instrument-dlya-tryohstoronnego-sliyaniya-v-git","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/120981","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=120981"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/120981\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=120981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=120981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=120981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}