{"id":70809,"date":"2023-06-29T11:22:47","date_gmt":"2023-06-29T10:22:47","guid":{"rendered":"https:\/\/kinsta.com\/it\/?p=70809&#038;preview=true&#038;preview_id=70809"},"modified":"2023-07-11T11:45:50","modified_gmt":"2023-07-11T10:45:50","slug":"git-merge","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/git-merge\/","title":{"rendered":"Come Eseguire Operazioni Git Merge Complesse"},"content":{"rendered":"<p>Con tutto il lavoro necessario in un progetto di sviluppo, <a href=\"https:\/\/git-scm.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git<\/a> \u00e8 una manna dal cielo. Tuttavia, con cos\u00ec tanti ballerini sulla pista da ballo, inevitabilmente uno o due finiranno per pestarsi i piedi. Per il vostro progetto, questo significa che due sviluppatori potrebbero lavorare sulla stessa suite di codice ed effettuare il commit nello stesso momento. In queste situazioni, \u00e8 necessario adottare alcune strategie di fusione Git per risolvere il conflitto.<\/p>\n<p>Sebbene a volte effetuare un Git merge pu\u00f2 essere un&#8217;operazione lineare, ci sono molte altre occasioni in cui \u00e8 necessario un approccio avanzato. In questo caso, dovrete utilizzare strategie come merge ricorsivo, merge a tre vie e molte altre ancora. Potreste anche aver bisogno di annullare una fusione Git a un certo punto.<\/p>\n<p>In questo tutorial verranno illustrate alcune tecniche di fusione Git complesse da aggiungere agli strumenti a vostra disposizione. Cominciamo subito! <div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Introduzione alle strategie di fusione di Git<\/h2>\n<p>Il concetto di base di un merge \u00e8 semplice: unire due branch per trasformare pi\u00f9 commit in uno solo. Tuttavia, ci sono diverse tecniche che si possono utilizzare per assicurarsi di eseguire il commit e il merge del codice giusto.<\/p>\n<p>Vediamo alcune strategie importanti da capire. Sono in ordine sparso e, a un certo punto della vostra <a href=\"https:\/\/kinsta.com\/it\/blog\/diventare-sviluppatore-web\/\" rel=\"noopener\">carriera di sviluppatori<\/a>, potrebbero servirvi tutte. Inoltre, dovrete avere una solida conoscenza dei concetti di base di Git, come puntatori, branch e commit. <\/p>\n<h3>La differenza tra merge a due e a tre vie<\/h3>\n<p>\u00c8 utile capire la differenza tra un merge a due vie e il suo compagno a tre vie. La maggior parte delle strategie di fusione che tratteremo in seguito riguardano situazioni a tre vie. In effetti, \u00e8 pi\u00f9 semplice parlare di una fusione a tre vie. Consideriamo il seguente esempio:<\/p>\n<ul>\n<li>Avete un branch <strong>main<\/strong> con diversi commit e un branch di feature che ha anch&#8217;esso dei commit.<\/li>\n<li>Tuttavia, se il <strong>branch main<\/strong> esegue ulteriori commit, entrambi i branch divergeranno.<\/li>\n<li>In parole povere, sia il branch <strong>main<\/strong> che quello feature hanno dei commit che l&#8217;altro non ha. Se li uniste utilizzando un approccio bidirezionale, perdereste un commit (probabilmente su <strong>main<\/strong>).<\/li>\n<li>Invece, Git creer\u00e0 un nuovo commit di fusione sia dal branch <strong>main<\/strong> che da quello feature.<\/li>\n<\/ul>\n<p>In poche parole, Git prender\u00e0 in considerazione tre diverse istantanee per unire le modifiche: la testa del branch <strong>main<\/strong>, la testa del branch feature e l&#8217;antenato comune. Questo sar\u00e0 il commit finale comune sia al branch <strong>main<\/strong> che a quello feature.<\/p>\n<p>In pratica, non dovrete preoccuparvi di sapere se una determinata strategia di fusione \u00e8 bidirezionale o tridirezionale. Spesso \u00e8 necessario utilizzare una strategia a prescindere. In ogni caso, \u00e8 utile sapere come Git &#8220;pensa&#8221; quando si tratta di effettuare il merge di <a href=\"https:\/\/docs.sevalla.com\/applications\/git\/github#import-a-repository-to-github\" rel=\"noopener\">branch e repo<\/a>.<\/p>\n<h3>Fusione rapida<\/h3>\n<p>La prima strategia potrebbe non richiedere alcuna azione per essere eseguita. Un merge rapido sposta il puntatore all&#8217;ultimo commit su <strong>main<\/strong>, senza creare un commit aggiuntivo (che potrebbe creare confusione).<\/p>\n<p>La tecnica inizia con un branch main che pu\u00f2 avere o meno dei commit. In questo caso, aprite un nuovo branch, lavorate sul codice ed eseguite i commit. A questo punto, dovete anche unire le modifiche al <strong>branch main<\/strong>. Un merge rapido ha un solo requisito da soddisfare:<\/p>\n<ul>\n<li style=\"font-weight: 400\">Dovete assicurarvi che non avvengano altri commit su <strong>main<\/strong> mentre lavorate sul nuovo branch.<\/li>\n<\/ul>\n<p>Questo non sar\u00e0 sempre possibile, soprattutto se lavorate in un team numeroso. Tuttavia, se scegliete di unire i vostri commit con un branch main corrente e senza commit propri, effettuerete una fusione rapida. Potete farlo in un paio di modi diversi:<\/p>\n<pre><code class=\"language-bash\">git merge &lt;branch&gt;\n\ngit merge --ff-only\n<\/code><\/pre>\n<p>Spesso non \u00e8 necessario specificare che si vuole eseguire una fusione rapida. Questo tipo di fusione avviene in <a href=\"https:\/\/kinsta.com\/it\/blog\/git-per-lo-sviluppo-web\/\" rel=\"noopener\">progetti singoli<\/a> o con piccoli team. In un ambiente frenetico \u00e8 una fusione che avviene raramente. Per questo motivo, gli altri tipi di merge saranno pi\u00f9 comuni.<\/p>\n<h3>Merge ricorsivo<\/h3>\n<p>La fusione ricorsiva \u00e8 spesso l&#8217;opzione predefinita, poich\u00e9 si presenta in situazioni pi\u00f9 comuni rispetto ad altri tipi di fusione. Un merge ricorsivo consiste nell&#8217;effettuare commit su un branch, ma anche ulteriori commit sul <strong>branch main<\/strong>.<\/p>\n<p>Quando sar\u00e0 il momento di fare il merge, Git ripercorrer\u00e0 il branch per eseguire il commit definitivo. Ci\u00f2 significa che un commit di fusione avr\u00e0 due branch &#8220;genitori&#8221; una volta completato.<\/p>\n<p>Come nel caso di un merge rapido, normalmente non \u00e8 necessario specificare un merge ricorsivo. Tuttavia, potete assicurarvi che Git non scelga qualcosa di simile a un merge rapido utilizzando i seguenti comandi e flag:<\/p>\n<pre><code class=\"language-bash\">git merge --no-ff\n\ngit merge -s recursive &lt;branch1&gt; &lt;branch2&gt;\n<\/code><\/pre>\n<p>La seconda riga utilizza l&#8217;opzione di strategia <code>-s<\/code> e la denominazione esplicita per effettuare una fusione. A differenza di una fusione rapida, una fusione ricorsiva <em>crea<\/em> un commit di fusione dedicato. Per le fusioni a due vie, la strategia ricorsiva \u00e8 solida e funziona bene.<\/p>\n<h3>Ours e Theirs<\/h3>\n<p>Una situazione comune durante lo sviluppo \u00e8 quella in cui create una nuova funzionalit\u00e0 all&#8217;interno del progetto che alla fine non otterr\u00e0 il via libera. In molti casi, avrete molto codice di cui effettuare il merge che sar\u00e0 anche co-dipendente. Una fusione &#8220;ours&#8221; \u00e8 il modo migliore per risolvere questi conflitti.<\/p>\n<p>Questo tipo di fusione pu\u00f2 gestire tutti i branch di cui avete bisogno e ignora tutte le modifiche apportate agli altri branch. \u00c8 l&#8217;ideale se volete fare piazza pulita di vecchie funzionalit\u00e0 o di sviluppi indesiderati. Ecco il comando di cui avete bisogno:<\/p>\n<pre><code class=\"language-bash\">git merge -s ours &lt;branch1&gt; &lt;branch2&gt;<\/code><\/pre>\n<p>Un merge ours significa essenzialmente che il branch corrente contiene il codice <em>de jure<\/em>. Questo si collega alle fusioni &#8220;theirs&#8221;, che trattano l&#8217;altro branch come corretto. Tuttavia, \u00e8 necessario passare un&#8217;altra opzione di strategia:<\/p>\n<pre><code class=\"language-bash\">git merge -X theirs &lt;branch2&gt;\n<\/code><\/pre>\n<p>L&#8217;uso delle fusioni &#8220;ours&#8221; e &#8220;theirs&#8221; pu\u00f2 creare confusione, ma in genere \u00e8 preferibile attenersi ai casi d&#8217;uso tipici (mantenere tutto ci\u00f2 che si trova nel branch corrente e scartare il resto).<\/p>\n<h3>Octopus<\/h3>\n<p>La gestione di pi\u00f9 teste, cio\u00e8 la fusione di pi\u00f9 branch in un altro, pu\u00f2 essere uno scenario complicato per un merge git. <em>Potreste<\/em> quasi dire che avete bisogno di pi\u00f9 di due mani per risolvere i conflitti. Questa \u00e8 la situazione perfetta per un merge octopus.<\/p>\n<p>Le fusioni octopus sono l&#8217;opposto delle fusioni ours e theis. Il caso d&#8217;uso tipico \u00e8 quello in cui volete includere pi\u00f9 commit per funzioni simili e fonderli in uno solo. Ecco come si passa:<\/p>\n<pre><code class=\"language-bash\">git merge -s octopus &lt;branch1&gt; &lt;branch2&gt;\n<\/code><\/pre>\n<p>Tuttavia, Git rifiuter\u00e0 una fusione octopus se dovrete effettuare una risoluzione manuale. Per quanto riguarda le risoluzioni automatiche, la fusione octopus sar\u00e0 l&#8217;opzione predefinita se dovrete unire pi\u00f9 rami in uno solo.<\/p>\n<h3>Resolve<\/h3>\n<p>Uno dei metodi pi\u00f9 sicuri per unire i commit, il resolve merge \u00e8 l&#8217;ideale se avete una situazione che comporta <a href=\"https:\/\/tonyg.github.io\/revctrl.org\/CrissCrossMerge.html\" target=\"_blank\" rel=\"noopener noreferrer\">fusioni incrociate<\/a>. \u00c8 anche un metodo di risoluzione veloce da implementare. Potete usarlo anche per le cronologie di fusione pi\u00f9 complesse, ma solo per quelle con due teste.<\/p>\n<pre><code class=\"language-bash\">git merge -s resolve &lt;branch1&gt; &lt;branch2&gt;\n<\/code><\/pre>\n<p>Poich\u00e9 un resolve merge utilizza un algoritmo a tre vie per lavorare sia con il branch corrente che con quello da cui state attingendo, potrebbe non essere flessibile come altri metodi di fusione. Tuttavia, per il lavoro che vi serve, il resolve merge \u00e8 quasi perfetto.<\/p>\n<h3>Subtree<\/h3>\n<p>Questo metodo di fusione ricorsiva potrebbe rischiare di confondervi. Cercheremo di spiegarlo con un esempio chiaro:<\/p>\n<ul>\n<li>Per prima cosa, considerate due alberi diversi &#8211; X e Y. Spesso si tratta di due repo.<\/li>\n<li>Il vostro scopo \u00e8 unire entrambi gli alberi in uno solo.<\/li>\n<li>Se l&#8217;albero Y corrisponde a uno dei sottoalberi di X, l&#8217;albero Y viene modificato per adattarsi alla struttura di X.<\/li>\n<\/ul>\n<p>Questo significa che la fusione subtree \u00e8 fantastica se volete <a href=\"https:\/\/kinsta.com\/it\/blog\/monorepo-vs-multi-repo\/\" rel=\"noopener\">unire pi\u00f9 repo<\/a> in un unico articolo definitivo. Inoltre, apporta le modifiche necessarie all&#8217;albero &#8220;antenato&#8221; comune di entrambi i branch.<\/p>\n<pre><code class=\"language-bash\">git merge -s subtree &lt;branch1&gt; &lt;branch2&gt;\n<\/code><\/pre>\n<p>In breve, un subtree merge \u00e8 quello che cercate se dovete unire due repository. In effetti, potreste avere difficolt\u00e0 a capire quale sia la strategia di fusione pi\u00f9 adatta a voi. Pi\u00f9 avanti parleremo di alcuni strumenti che potrebbero aiutarvi.<\/p>\n<p>Prima per\u00f2, parliamo di alcuni conflitti di fusione avanzati che dovete sapere come risolvere.<\/p>\n<h2>Come gestire i conflitti di fusione Git pi\u00f9 complessi<\/h2>\n<p>Unire i branch in Git significa gestire i conflitti e risolverli. Maggiore \u00e8 la <a href=\"https:\/\/kinsta.com\/it\/blog\/agenzia-wordpress\/\" rel=\"noopener\">dimensione del team<\/a> e del progetto, maggiore \u00e8 la possibilit\u00e0 di riscontrare conflitti. Alcuni di questi possono essere complessi e difficili da risolvere.<\/p>\n<p>Dato che i conflitti possono consumare tempo, denaro e risorse, dovete trovare il modo di stroncarli sul nascere. Nella maggior parte dei casi, due sviluppatori lavorano alla stessa suite di codice ed entrambi decidono di effettuare il commit.<\/p>\n<p>Questo potrebbe significare che potreste non essere in grado di avviare il merge a causa di modifiche in sospeso o che si verifichi un errore durante il merge che richiede un intervento manuale. Una volta che la vostra directory di lavoro \u00e8 &#8220;pulita&#8221;, potrete iniziare. Spesso Git vi segnala la presenza di un conflitto quando iniziate la fusione:<\/p>\n<figure id=\"attachment_155619\" aria-describedby=\"caption-attachment-155619\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155619\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-conflict.png\" alt=\"Una finestra del Terminale mostra i comandi Git per mostrare tutti i branch, quindi eseguire il merge delle modifiche. Viene visualizzato un errore come conflitto di fusione, con le istruzioni per correggere e fare il commit dei risultati dei conflitti.\" width=\"1000\" height=\"412\"><figcaption id=\"caption-attachment-155619\" class=\"wp-caption-text\">Una finestra del terminale che mostra un conflitto di fusione in Git.<\/figcaption><\/figure>\n<p>Tuttavia, per maggiori informazioni, potete eseguire un <code>git status<\/code> e vedere i dettagli:<\/p>\n<figure id=\"attachment_155623\" aria-describedby=\"caption-attachment-155623\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155623\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-status.png\" alt=\"Una finestra del terminale che mostra il risultato di un comando git status. Mostra un elenco di file in verde, con le istruzioni per risolvere i percorsi di cui non \u00e8 stato eseguito il merge.\" width=\"1000\" height=\"342\"><figcaption id=\"caption-attachment-155623\" class=\"wp-caption-text\">Una finestra del Terminale che mostra i risultati di un comando git status.<\/figcaption><\/figure>\n<p>Da qui potete iniziare a lavorare sui vari file che causano il conflitto. Alcuni degli strumenti e delle tecniche di cui parleremo in seguito vi saranno utili.<\/p>\n<h3>Interrompere e resettare i merge<\/h3>\n<p>A volte \u00e8 necessario interrompere del tutto un merge e ripartire da zero. Infatti, entrambi i comandi che abbiamo citato si adattano a situazioni in cui non sapete ancora cosa fare con un conflitto.<\/p>\n<p>Potete scegliere di interrompere o resettare una fusione in corso con i seguenti comandi:<\/p>\n<pre><code class=\"language-bash\">git merge --abort\n\ngit reset\n<\/code><\/pre>\n<p>I due comandi sono simili, ma si usano in circostanze diverse. Ad esempio, interrompere una fusione significa riportare il branch allo stato precedente alla fusione. In alcuni casi, questo non funziona. Se la vostra directory di lavoro contiene modifiche di cui non \u00e8 stato eseguito il commit o lo stash, non potrete eseguire l&#8217;interruzione.<\/p>\n<p>Tuttavia, resettare un merge significa riportare i file a uno stato &#8220;good&#8221; conosciuto. Quest&#8217;ultimo \u00e8 un aspetto da considerare se Git non riesce ad avviare la fusione. Notate che questo comando <a href=\"https:\/\/kinsta.com\/it\/blog\/git-delete-branch-locale\/\" rel=\"noopener\">canceller\u00e0 tutte le modifiche<\/a> di cui non sar\u00e0 stato eseguito il commit, il che significa che si tratta pi\u00f9 che altro di un&#8217;azione consapevole che richiede molta attenzione.<\/p>\n<h3>Eseguire il checkout dei conflitti<\/h3>\n<p>La maggior parte dei conflitti di fusione \u00e8 semplice da accertare e risolvere. Tuttavia, in alcuni casi, potrebbe essere necessario scavare pi\u00f9 a fondo per capire perch\u00e9 si verifica un conflitto e come iniziare a risolverlo.<\/p>\n<p>Per ottenere un contesto pi\u00f9 ampio dopo un <code>git merge<\/code> si pu\u00f2 utilizzare un checkout:<\/p>\n<pre><code class=\"language-bash\">git checkout --conflict=diff3 &lt;filename&gt;\n<\/code><\/pre>\n<p>Questa funzione prende la tipica navigazione che fornisce un checkout e crea un confronto tra i due file che mostra il conflitto di fusione:<\/p>\n<figure id=\"attachment_155618\" aria-describedby=\"caption-attachment-155618\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155618\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/checkout-merge-conflict.png\" alt=\"Un editor di codice che mostra i risultati dell'esecuzione del comando git checkout --conflict. Evidenzia le aree di codice in rosso e usa dei simboli per indicare dove c'\u00e8 una modifica che impedisce un commit.\" width=\"1000\" height=\"486\"><figcaption id=\"caption-attachment-155618\" class=\"wp-caption-text\">Verifica di un conflitto all&#8217;interno di uno specifico file di progetto.<\/figcaption><\/figure>\n<p>In senso tecnico, questa operazione controlla nuovamente il file e sostituisce i marcatori di conflitto. Questa operazione pu\u00f2 essere eseguita pi\u00f9 volte nel corso della risoluzione. In questo caso, se inserite l&#8217;argomento <code>diff3 <\/code>, vi fornir\u00e0 la versione di base e le alternative nelle versioni &#8220;ours&#8221; e &#8220;theirs&#8221;.<\/p>\n<p>Notate che l&#8217;argomento predefinito \u00e8 <code>merge<\/code>, che non dovrete specificare a meno che non modifichiate lo stile del conflitto di fusione rispetto a quello predefinito.<\/p>\n<h3>Ignorare lo spazio negativo<\/h3>\n<p>Lo <a href=\"https:\/\/kinsta.com\/it\/blog\/migliori-pratiche-di-web-design\/\" rel=\"noopener\">spazio negativo<\/a> e il suo utilizzo sono un punto di discussione comune. Alcuni <a href=\"https:\/\/kinsta.com\/it\/blog\/miglior-linguaggio-di-programmazione\/\" rel=\"noopener\">linguaggi di programmazione<\/a> utilizzano diversi tipi di spaziatura e anche i singoli sviluppatori utilizzano formattazioni diverse.<\/p>\n<p>&#8220;Spazi vs tabulazioni&#8221; \u00e8 una battaglia a cui non prenderemo parte. Tuttavia, se si verificano situazioni in cui la formattazione cambia da uno all&#8217;altro a seconda del file e della pratica di codifica, potreste imbattervi in questo problema di Git merge.<\/p>\n<p>Saprete che il merge fallisce perch\u00e9 ci saranno linee rimosse e aggiunte osservando il conflitto:<\/p>\n<figure id=\"attachment_155627\" aria-describedby=\"caption-attachment-155627\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155627\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/negative-space-conflict.png\" alt=\"Un editor di codice che mostra le differenze tra due file con conflitti di fusione. Per ogni area di differenza vengono utilizzati dei simboli per indicare la modifica, insieme a un'evidenziazione in rosso.\" width=\"1000\" height=\"692\"><figcaption id=\"caption-attachment-155627\" class=\"wp-caption-text\">Un file che mostra le differenze di conflitto in un editor.<\/figcaption><\/figure>\n<p>Questo perch\u00e9 Git osserva le linee e considera lo spazio negativo come una modifica.<\/p>\n<p>Tuttavia, \u00e8 possibile aggiungere argomenti specifici al comando <code>git merge<\/code> per ignorare gli spazi negativi nei file interessati:<\/p>\n<pre><code class=\"language-bash\">git merge -Xignore-all-space\n\ngit merge -Xignore-space-change\n<\/code><\/pre>\n<p>Anche se questi due argomenti sembrano simili, hanno una differenza unica. Se scegliete di ignorare tutti gli spazi negativi, Git lo far\u00e0. Si tratta di un approccio ampio, ma al contrario, <code>-Xignore-space-change<\/code> considera equivalenti solo le sequenze di uno o pi\u00f9 caratteri negativi. Per questo motivo, ignorer\u00e0 gli spazi singoli alla fine delle righe.<\/p>\n<p>Per maggiore sicurezza, potete anche rivedere la fusione utilizzando il comando <code>--no-commit<\/code>, per verificare che gli spazi negativi siano stati ignorati e contati nel modo giusto.<\/p>\n<h3>Eseguire il merge dei log<\/h3>\n<p>La <a href=\"https:\/\/kinsta.com\/docs\/devkinsta\/logging\/\" rel=\"noopener\">creazione di log \u00e8 fondamentale<\/a> per quasi tutti i software che trasmettono dati. Nel caso di Git, potete utilizzare i log per conoscere pi\u00f9 dettagliatamente un conflitto di fusione. Potete accedere a queste informazioni utilizzando <code>git log<\/code>:<\/p>\n<figure id=\"attachment_155621\" aria-describedby=\"caption-attachment-155621\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155621\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-log-file.png\" alt=\"Una finestra del Terminale che mostra il log Git di un repository. Ci sono due commit con titolo giallo, insieme a dettagli sull'autore, la data e il messaggio di commit.\" width=\"1000\" height=\"537\"><figcaption id=\"caption-attachment-155621\" class=\"wp-caption-text\">Eseguire e visualizzare il log di Git nel terminale.<\/figcaption><\/figure>\n<p>Si tratta essenzialmente di un file di testo che scarica ogni azione all&#8217;interno di un repo. Tuttavia, potete aggiungere altri argomenti per affinare la visualizzazione e vedere solo i commit che desiderate:<\/p>\n<pre><code class=\"language-bash\">git log --oneline --left-right &lt;branch1&gt;...&lt;branch2&gt;\n<\/code><\/pre>\n<p>Utilizzate un <a href=\"https:\/\/git-scm.com\/book\/en\/v2\/Git-Tools-Revision-Selection#_triple_dot\" target=\"_blank\" rel=\"noopener noreferrer\">&#8220;punto triplo&#8221;<\/a> per fornire un elenco di commit coinvolti in due branch durante una fusione. Filtrate tutti i commit che i due branch condividono, lasciando una selezione di commit da analizzare ulteriormente.<\/p>\n<p>Potete anche utilizzare <code>git log --oneline --left-right --merge<\/code> per mostrare solo i commit di entrambi i branch che &#8220;toccano&#8221; un file in conflitto. L&#8217;opzione <code>-p<\/code> mostrer\u00e0 le modifiche esatte di uno specifico &#8220;diff&#8221;, ma tenete presente che questo vale solo per i commit di cui non \u00e8 stato eseguito il merge. Esiste una soluzione a questo problema, di cui parliamo qui di seguito.<\/p>\n<h3>Usare il formato Diff combinato per indagare su un conflitto di fusione in Git<\/h3>\n<p>Potete approfondire la ricerca ottenuta con <code>git log<\/code> per indagare sui conflitti di fusione. In circostanze tipiche, Git eseguir\u00e0 il merge del codice e render\u00e0 visibile tutto ci\u00f2 che riesce. In questo modo rimarranno solo le linee in conflitto, che potrete vedere utilizzando il comando <code>git diff<\/code>:<\/p>\n<figure id=\"attachment_155620\" aria-describedby=\"caption-attachment-155620\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155620\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-diff.png\" alt=\"Una finestra del Terminale che mostra l'output di un comando git diff. Mostra i dettagli delle modifiche in testo verde e rosso, oltre a maggiori dettagli sulle differenze con i nomi dei file all'interno del repository..\" width=\"1000\" height=\"714\"><figcaption id=\"caption-attachment-155620\" class=\"wp-caption-text\">Eseguire un comando git diff nel terminale.<\/figcaption><\/figure>\n<p>Questo formato &#8220;diff combinato&#8221; aggiunge due colonne di informazioni supplementari. La prima dice se una riga \u00e8 diversa tra il vostro branch (&#8220;ours&#8221;) e la copia di lavoro; la seconda d\u00e0 le stesse informazioni per il branch &#8220;theirs&#8221;.<\/p>\n<p>Per quanto riguarda i segni, il segno pi\u00f9 indica se una riga \u00e8 stata aggiunta alla copia di lavoro ma non in quel lato specifico della fusione, mentre il segno meno indica se la riga \u00e8 stata rimossa.<\/p>\n<p>\u00c8 possibile vedere questo formato di diff combinato anche all&#8217;interno del log di Git utilizzando un paio di comandi:<\/p>\n<pre><code class=\"language-bash\">git show\n\ngit log --cc -p\n<\/code><\/pre>\n<p>Il primo \u00e8 un comando che si usa su un commit di fusione per vedere la sua cronologia. Il secondo comando utilizza la funzionalit\u00e0 di <code>-p<\/code> per mostrare le modifiche a un commit non unito insieme al formato diff combinato. <\/p>\n<h2>Come annullare una fusione Git<\/h2>\n<p>Pu\u00f2 capitare di commettere degli errori e di effettuare delle fusioni su cui \u00e8 necessario tornare indietro. In alcuni casi, potete semplicemente modificare il commit pi\u00f9 recente usando <code>git commit --amend<\/code>. Questo aprir\u00e0 l&#8217;editor per permettervi di modificare l&#8217;ultimo messaggio di commit.<\/p>\n<p>Sebbene <em>sia possibile<\/em> annullare conflitti di fusione pi\u00f9 complessi e le modifiche che ne derivano, pu\u00f2 essere difficile perch\u00e9 i commit sono spesso permanenti.<\/p>\n<p>Per questo motivo, \u00e8 necessario seguire molti passaggi:<\/p>\n<ul>\n<li>Innanzitutto, dovete esaminare i commit e trovare i riferimenti alle fusioni di cui avete bisogno.<\/li>\n<li>Poi, controllare i branch per esaminare le cronologie dei commit.<\/li>\n<li>Una volta a conoscenza dei branch e dei commit di cui avete bisogno, ci sono dei comandi Git specifici in base all&#8217;azione che desiderate.<\/li>\n<\/ul>\n<p>Vediamo questi comandi in modo pi\u00f9 dettagliato e iniziamo con il processo di revisione. Da l\u00ec, vi mostreremo un modo rapido per annullare un merge in Git, per poi esaminare comandi specifici per casi d&#8217;uso pi\u00f9 avanzati.<\/p>\n<h3>Revisione dei commit<\/h3>\n<p>Il comando <code>git log --oneline<\/code> \u00e8 ottimo se volete vedere gli ID di revisione e i messaggi di commit relativi al branch corrente:<\/p>\n<figure id=\"attachment_155622\" aria-describedby=\"caption-attachment-155622\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155622\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/git-log-oneline.png\" alt=\"Una parte della finestra del Terminale che mostra l'output di un comando Git diff a una riga. Mostra un numero minimo di dettagli: l'hash del commit, i rami e il messaggio per ciascuno prima di mostrare il prompt del Terminale.\" width=\"1000\" height=\"356\"><figcaption id=\"caption-attachment-155622\" class=\"wp-caption-text\">Eseguire un comando git diff di una sola riga nel terminale.<\/figcaption><\/figure>\n<p>Il comando <code>git log --branches=*<\/code> mostrer\u00e0 le stesse informazioni ma per tutti i branch. In ogni caso, potete utilizzare gli ID di riferimento insieme a <code>git checkout<\/code> per creare uno stato &#8220;distaccato <code>HEAD<\/code>&#8220;. Ci\u00f2 significa che non lavorerete su nessun branch da un punto di vista tecnico e che, una volta tornati a un branch stabilito, sarete &#8220;orfano&#8221; delle modifiche.<\/p>\n<p>In questo modo, potete utilizzare il checkout quasi come una sandbox priva di rischi. Tuttavia, se volete conservare le modifiche, potete fare il checkout del branch e <a href=\"https:\/\/kinsta.com\/it\/blog\/git-rename-branch\/\" target=\"_blank\" rel=\"noopener noreferrer\">dargli un nuovo nome<\/a> usando <code>git checkout -b &lt;branch-name&gt;<\/code>. Questo \u00e8 un modo valido per annullare un merge in Git, ma ci sono modi pi\u00f9 complessi per farlo per casi d&#8217;uso avanzati.<\/p>\n<h3>Usare git reset<\/h3>\n<p>Molti conflitti di fusione potrebbero verificarsi su un repo locale. In questi casi, <code>git reset<\/code> \u00e8 il comando che vi serve. Tuttavia, questo comando ha pi\u00f9 parametri e argomenti da analizzare. Ecco come utilizzare il comando nella pratica:<\/p>\n<pre><code class=\"language-bash\">git reset --hard &lt;reference&gt;\n<\/code><\/pre>\n<p>La prima parte di questo comando &#8211; <code>git reset --hard<\/code> &#8211; prevede tre fasi:<\/p>\n<ul>\n<li style=\"font-weight: 400\">Sposta il branch di riferimento nella posizione precedente al commit di fusione.<\/li>\n<li style=\"font-weight: 400\">L&#8217;hard reset fa s\u00ec che l'&#8221;indice&#8221; (cio\u00e8 l&#8217;istantanea del prossimo commit proposto) assomigli al branch di riferimento.<\/li>\n<li style=\"font-weight: 400\">Fa in modo che la directory di lavoro assomigli all&#8217;indice.<\/li>\n<\/ul>\n<p>Una volta invocato questo comando, la cronologia dei commit rimuove i commit successivi e ripristina la cronologia all&#8217;ID di riferimento. \u00c8 un modo pulito per annullare una fusione Git, ma non \u00e8 adatto a tutti i casi.<\/p>\n<p>Ad esempio, si verificher\u00e0 un errore se si tenta di eseguire il push di un commit locale resettato su un <a href=\"https:\/\/kinsta.com\/it\/blog\/gitlab-vs-github\/\" rel=\"noopener\">repo remoto<\/a> che contiene quel commit. In questo caso, c&#8217;\u00e8 un altro comando che si pu\u00f2 utilizzare.<\/p>\n<h3>Usare git revert<\/h3>\n<p>Anche se <code>git reset<\/code> e <code>git revert<\/code> sembrano simili, ci sono alcune importanti differenze. Negli esempi fatti finora, il processo di annullamento comporta lo spostamento dei puntatori di riferimento e dell&#8217;HEAD a un commit specifico. \u00c8 come mischiare le carte da gioco per creare un nuovo ordine.<\/p>\n<p>Al contrario, <code>git revert<\/code> crea un nuovo commit basato sulle modifiche di backtracking, quindi aggiorna i puntatori di riferimento e rende il branch la nuova &#8220;punta&#8221;. \u00c8 anche il motivo per cui dovreste usare questo comando per i conflitti di fusione dei repo remoti.<\/p>\n<p>Potete usare <code>git revert &lt;reference&gt;<\/code> per annullare una fusione Git. \u00c8 necessario specificare sempre un riferimento di commit, altrimenti il comando non verr\u00e0 eseguito. Potete anche passare <code>HEAD<\/code> al comando per tornare all&#8217;ultimo commit.<\/p>\n<p>Tuttavia, potete dare a Git una maggiore chiarezza su ci\u00f2 che volete fare:<\/p>\n<pre><code class=\"language-bash\">git revert -m 1 &lt;reference&gt;\n<\/code><\/pre>\n<p>Quando invocate il merge, il nuovo commit avr\u00e0 due &#8220;genitori&#8221;. Uno si riferisce al riferimento che avete specificato e l&#8217;altro \u00e8 la punta del branch che volete unire. In questo caso, <code>-m 1<\/code> dice a Git di mantenere il primo genitore, cio\u00e8 il riferimento specificato, come &#8220;linea principale&#8221;.<\/p>\n<p>L&#8217;opzione predefinita per <code>git revert<\/code> \u00e8 <code>-e<\/code> o <code>--edit<\/code>. Questo aprir\u00e0 l&#8217;editor per modificare il messaggio di commit prima del revert. Tuttavia, potete anche passare <code>--no-edit<\/code>, che non aprir\u00e0 l&#8217;editor. Potete anche passare <code>-n<\/code> o <code>--no-commit<\/code>.<\/p>\n<p>Questo indica a <code>git revert<\/code> di <em>non<\/em> creare un nuovo commit, ma di &#8220;invertire&#8221; le modifiche e aggiungerle all&#8217;indice di staging e alla directory di lavoro.<\/p>\n<h2>La differenza tra la fusione e il rebase in Git<\/h2>\n<p>Invece di usare il comando <code>git merge<\/code>, si pu\u00f2 anche usare <code>git rebase<\/code>. Anche questo \u00e8 un modo per integrare le modifiche in un&#8217;unica directory, ma con una differenza:<\/p>\n<ul>\n<li>Un merge a tre vie \u00e8 l&#8217;impostazione predefinita quando si utilizza <code>git merge<\/code>. Unisce le istantanee di due branch correnti e le fonde con un antenato comune di entrambi per creare un nuovo commit.<\/li>\n<li>Il rebasing consiste nel prendere una modifica patchata da un branch divergente e applicarla a un altro, senza bisogno dell&#8217;antenato. Questo significa che non ci sar\u00e0 un nuovo commit.<\/li>\n<\/ul>\n<p>Per utilizzare questo comando, fate il checkout al branch in cui desiderate effettuare il rebase. Da l\u00ec, potete usare il seguente comando:<\/p>\n<pre><code class=\"language-bash\">git rebase -i &lt;reference&gt;\n<\/code><\/pre>\n<p>In molte situazioni, il vostro riferimento sar\u00e0 il branch main. L&#8217;opzione <code>-i<\/code> avvia il &#8220;rebase interattivo&#8221;. Questo vi d\u00e0 la possibilit\u00e0 di modificare i commit man mano che si spostano. Potete usarla per ripulire la cronologia dei commit, che \u00e8 uno dei grandi vantaggi dell&#8217;uso di <code>git rebase<\/code>.<\/p>\n<p>Eseguendo il comando, nell&#8217;editor verr\u00e0 visualizzato un elenco di potenziali commit da spostare. In questo modo potete modificare completamente l&#8217;aspetto della cronologia dei commit. Potete anche unire i commit se cambiate il comando <code>pick<\/code> in <code>fixup<\/code>. Una volta salvate le modifiche, Git eseguir\u00e0 il rebase.<\/p>\n<p>In generale, si usa Git merge per molti conflitti. Tuttavia, il rebase ha anche molti vantaggi. Ad esempio, mentre l&#8217;operazione di fusione \u00e8 semplice da usare e permette di preservare il contesto che circonda la vostra cronologia di fusione, il rebase pu\u00f2 essere pi\u00f9 pulito in quanto permette di semplificare la cronologia dei commit in un unico documento.<\/p>\n<p>Ciononostante, dovete fare pi\u00f9 attenzione con il rebasing, perch\u00e9 le possibilit\u00e0 di commettere un errore sono tante. Inoltre, non dovreste utilizzare questa tecnica sui branch pubblici, poich\u00e9 il rebasing interesser\u00e0 solo il vostro repo. Per risolvere i problemi che ne derivano, dovrete fare ancora pi\u00f9 fusioni e vedrete pi\u00f9 commit.<\/p>\n<h2>Strumenti che aiutano a gestire meglio una fusione Git<\/h2>\n<p>Data la complessit\u00e0 dei conflitti di fusione di Git, potreste volere un aiuto. Ci sono molti strumenti disponibili per aiutarvi a realizzare una fusione efficace e utilizzando <a href=\"https:\/\/kinsta.com\/it\/blog\/editor-php\/\" rel=\"noopener\">Intellij IDEA<\/a>, avrete un metodo integrato grazie al menu <strong>Branches<\/strong>:<\/p>\n<figure id=\"attachment_155624\" aria-describedby=\"caption-attachment-155624\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155624\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/intellij-branches.png\" alt=\"L'angolo inferiore dell'editor di codice Intellij IDEA, che mostra il pannello del widget Git. Il menu contestuale del clic con il tasto destro del mouse mostra l'opzione Checkout per rivedere le modifiche al branch.\" width=\"1000\" height=\"378\"><figcaption id=\"caption-attachment-155624\" class=\"wp-caption-text\">Verifica di un branch all&#8217;interno di Intellij IDEA.<\/figcaption><\/figure>\n<p>Anche <a href=\"https:\/\/code.visualstudio.com\/#built-in-git\" target=\"_blank\" rel=\"noopener noreferrer\">VSCode<\/a> include una funzionalit\u00e0 simile all&#8217;interno della sua interfaccia utente (UI). I vecchi utenti di Atom scopriranno che Microsoft ha portato avanti la sua fantastica <a href=\"https:\/\/kinsta.com\/it\/blog\/git-contro-github\/\" target=\"_blank\" rel=\"noopener noreferrer\">integrazione con Git<\/a>, con la possibilit\u00e0 di <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-github\/\" rel=\"noopener\">connettersi a GitHub<\/a> senza ulteriori estensioni o componenti aggiuntivi.<\/p>\n<p>Inoltre, potrete disporre di ulteriori opzioni grazie alla <strong>palette dei comandi<\/strong>. Questo vale anche per gli editor che si basano sul framework open-source di VSCode, come <a href=\"https:\/\/www.onivim.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">Onivim2<\/a>:<\/p>\n<figure id=\"attachment_155628\" aria-describedby=\"caption-attachment-155628\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155628\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/onivim-git-merge.png\" alt=\"Una parte della schermata di Onivim2 che mostra la palette dei comandi e il comando Git: Merge Branch.\" width=\"1000\" height=\"396\"><figcaption id=\"caption-attachment-155628\" class=\"wp-caption-text\">Accedere al comando Git: Merge Branch dalla palette dei comandi in Onivim2.<\/figcaption><\/figure>\n<p>Il vantaggio, come nel caso di tutti gli strumenti di questo elenco, \u00e8 che non avete bisogno della riga di comando per effettuare le fusioni. Di solito \u00e8 necessario selezionare un branch di origine e uno di destinazione da un menu a tendina e poi lasciare che l&#8217;editor esegua la fusione. Anche in questo caso, non \u00e8 necessario un approccio passivo. Potrete rivedere le modifiche dopo, quindi effettuare il commit che vi serve.<\/p>\n<p>Un editor che offre un&#8217;interfaccia grafica separata (GUI) per lavorare con Git \u00e8 <a href=\"https:\/\/kinsta.com\/it\/blog\/come-usare-sublime-text\/\" rel=\"noopener\">Sublime Text<\/a>. Se utilizzate questo editor, <a href=\"https:\/\/www.sublimemerge.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Sublime Merge<\/a> potrebbe essere l&#8217;aggiunta ideale al vostro flusso di lavoro:<\/p>\n<figure id=\"attachment_155629\" aria-describedby=\"caption-attachment-155629\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155629\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/sublime-merge.png\" alt=\"L'interfaccia di Submline Merge, che mostra un elenco di commit sul lato sinistro dello schermo, insieme a un riepilogo delle modifiche e dei conflitti con un commit specifico sul lato destro..\" width=\"1000\" height=\"498\"><figcaption id=\"caption-attachment-155629\" class=\"wp-caption-text\">L&#8217;applicazione Sublime Merge.<\/figcaption><\/figure>\n<p>Indipendentemente dall&#8217;editor di codice, spesso avrete la possibilit\u00e0 di lavorare con Git senza utilizzare la riga di comando. Questo avviene anche con Vim e Neovim, grazie al plugin <a href=\"https:\/\/github.com\/tpope\/vim-fugitive\" target=\"_blank\" rel=\"noopener noreferrer\">Git Fugitive di Tim Pope<\/a>, fantastico e semplice da usare.<\/p>\n<p>Tuttavia, esistono alcuni strumenti di fusione di terze parti che si concentrano esclusivamente su questo compito. <\/p>\n<h3>Applicazioni dedicate a Git merge<\/h3>\n<p>Ad esempio, <a href=\"https:\/\/mergify.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Mergify<\/a> \u00e8 un metodo di livello aziendale per eseguire la fusione del codice che si integra nella pipeline e nel flusso di lavoro di continuous integration\/continuous delivery (CI\/CD):<\/p>\n<figure id=\"attachment_155626\" aria-describedby=\"caption-attachment-155626\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155626\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/mergify-app.png\" alt=\"Una sezione del sito web di Mergify che mostra una serie di grafici delineati in bianco su sfondo nero. Sono presenti elenchi di branch Git, timer, editor di codice e grafici.\" width=\"1000\" height=\"640\"><figcaption id=\"caption-attachment-155626\" class=\"wp-caption-text\">Il sito web di Mergify.<\/figcaption><\/figure>\n<p>Alcune funzioni aiutano ad automatizzare l&#8217;aggiornamento delle richieste di pull prima della fusione, a riordinarle in base alla priorit\u00e0 e a raggrupparle in batch. Per una soluzione open source, <a href=\"http:\/\/meldmerge.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Meld<\/a> potrebbe essere utile:<\/p>\n<figure id=\"attachment_155625\" aria-describedby=\"caption-attachment-155625\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-155625\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/06\/meld-app.png\" alt=\"L'interfaccia dell'applicazione Meld mostra il codice affiancato, completo di evidenziazione in blu e verde per indicare le modifiche tra i vari file.\" width=\"1000\" height=\"651\"><figcaption id=\"caption-attachment-155625\" class=\"wp-caption-text\">L&#8217;interfaccia dell&#8217;applicazione Meld.<\/figcaption><\/figure>\n<p>La sua versione stabile supporta Windows e <a href=\"https:\/\/kinsta.com\/it\/blog\/comandi-linux\/\" rel=\"noopener\">Linux<\/a> e funziona sotto <a href=\"https:\/\/kinsta.com\/it\/impara\/wordpress-gpl\/\" rel=\"noopener\">licenza GPL<\/a>. Offre le funzionalit\u00e0 di base per confrontare i branch, modificare le fusioni e altro ancora. Potete anche ottenere confronti a due o tre vie e il supporto per altri <a href=\"https:\/\/kinsta.com\/it\/blog\/controllo-versioni\/\" rel=\"noopener\">sistemi di controllo di versione<\/a> come <a href=\"https:\/\/subversion.apache.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Subversion<\/a>.<\/p>\n<h2>Riepilogo<\/h2>\n<p>Git \u00e8 uno strumento essenziale per collaborare e gestire le modifiche al codice in modo efficiente. Tuttavia, se pi\u00f9 sviluppatori lavorano sullo stesso codice, possono sorgere dei conflitti. Le strategie di fusione di Git vi aiuteranno a risolvere questi conflitti, e ci sono molti modi con cui potrete farlo. Per strategie di fusione Git pi\u00f9 complesse, dovrete ricorrere a tattiche avanzate.<\/p>\n<p>Potrebbe bastare ignorare gli spazi negativi o spulciare i log di ricerca. Tuttavia, non \u00e8 sempre necessario utilizzare la riga di comando. Ci sono molte applicazioni che vi possono aiutare, e spesso anche il vostro editor di codice utilizza un&#8217;interfaccia integrata.<\/p>\n<p>Se volete assicurarvi di avere un <a href=\"https:\/\/sevalla.com\/application-hosting\/\">hosting per applicazioni<\/a> di alta qualit\u00e0, ci pensiamo noi. I nostri servizi di Hosting di Applicazioni basati sul cloud assicurano che la vostra applicazione full-stack sia pronta per andare online in pochissimo tempo.<\/p>\n<p>Quale di queste strategie di Git merge vi aiuter\u00e0 a uscire da una situazione difficile? Fatecelo sapere nella sezione commenti qui sotto!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Con tutto il lavoro necessario in un progetto di sviluppo, Git \u00e8 una manna dal cielo. Tuttavia, con cos\u00ec tanti ballerini sulla pista da ballo, inevitabilmente &#8230;<\/p>\n","protected":false},"author":199,"featured_media":70810,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[26233],"class_list":["post-70809","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-git"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Come Eseguire Operazioni Git Merge Complesse - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Se hai molti commit da elaborare, alcuni si scontreranno con altri e richiederanno un merge. Ecco come eseguire operazioni Git Merge complesse!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/it\/blog\/git-merge\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Come Eseguire Operazioni Git Merge Complesse\" \/>\n<meta property=\"og:description\" content=\"Se hai molti commit da elaborare, alcuni si scontreranno con altri e richiederanno un merge. Ecco come eseguire operazioni Git Merge complesse!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/git-merge\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-29T10:22:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-11T10:45:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/git-merge.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jeremy Holcombe\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Se hai molti commit da elaborare, alcuni si scontreranno con altri e richiederanno un merge. Ecco come eseguire operazioni Git Merge complesse!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/git-merge.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeremy Holcombe\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-merge\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-merge\/\"},\"author\":{\"name\":\"Jeremy Holcombe\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\"},\"headline\":\"Come Eseguire Operazioni Git Merge Complesse\",\"datePublished\":\"2023-06-29T10:22:47+00:00\",\"dateModified\":\"2023-07-11T10:45:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-merge\/\"},\"wordCount\":4103,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-merge\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/git-merge.jpg\",\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/git-merge\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-merge\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/git-merge\/\",\"name\":\"Come Eseguire Operazioni Git Merge Complesse - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-merge\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-merge\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/git-merge.jpg\",\"datePublished\":\"2023-06-29T10:22:47+00:00\",\"dateModified\":\"2023-07-11T10:45:50+00:00\",\"description\":\"Se hai molti commit da elaborare, alcuni si scontreranno con altri e richiederanno un merge. Ecco come eseguire operazioni Git Merge complesse!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-merge\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/git-merge\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-merge\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/git-merge.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/git-merge.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/git-merge\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Git\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/git\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Come Eseguire Operazioni Git Merge Complesse\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\",\"name\":\"Jeremy Holcombe\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"caption\":\"Jeremy Holcombe\"},\"description\":\"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/jeremyholcombe\/\"],\"url\":\"https:\/\/kinsta.com\/it\/blog\/author\/jeremyholcombe\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Come Eseguire Operazioni Git Merge Complesse - Kinsta\u00ae","description":"Se hai molti commit da elaborare, alcuni si scontreranno con altri e richiederanno un merge. Ecco come eseguire operazioni Git Merge complesse!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/it\/blog\/git-merge\/","og_locale":"it_IT","og_type":"article","og_title":"Come Eseguire Operazioni Git Merge Complesse","og_description":"Se hai molti commit da elaborare, alcuni si scontreranno con altri e richiederanno un merge. Ecco come eseguire operazioni Git Merge complesse!","og_url":"https:\/\/kinsta.com\/it\/blog\/git-merge\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2023-06-29T10:22:47+00:00","article_modified_time":"2023-07-11T10:45:50+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/git-merge.jpg","type":"image\/jpeg"}],"author":"Jeremy Holcombe","twitter_card":"summary_large_image","twitter_description":"Se hai molti commit da elaborare, alcuni si scontreranno con altri e richiederanno un merge. Ecco come eseguire operazioni Git Merge complesse!","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/git-merge.jpg","twitter_creator":"@Kinsta_IT","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Jeremy Holcombe","Tempo di lettura stimato":"21 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/git-merge\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-merge\/"},"author":{"name":"Jeremy Holcombe","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21"},"headline":"Come Eseguire Operazioni Git Merge Complesse","datePublished":"2023-06-29T10:22:47+00:00","dateModified":"2023-07-11T10:45:50+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-merge\/"},"wordCount":4103,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-merge\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/git-merge.jpg","inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/git-merge\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/git-merge\/","url":"https:\/\/kinsta.com\/it\/blog\/git-merge\/","name":"Come Eseguire Operazioni Git Merge Complesse - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-merge\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-merge\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/git-merge.jpg","datePublished":"2023-06-29T10:22:47+00:00","dateModified":"2023-07-11T10:45:50+00:00","description":"Se hai molti commit da elaborare, alcuni si scontreranno con altri e richiederanno un merge. Ecco come eseguire operazioni Git Merge complesse!","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/git-merge\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/git-merge\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/git-merge\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/git-merge.jpg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/06\/git-merge.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/git-merge\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Git","item":"https:\/\/kinsta.com\/it\/argomenti\/git\/"},{"@type":"ListItem","position":3,"name":"Come Eseguire Operazioni Git Merge Complesse"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21","name":"Jeremy Holcombe","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","caption":"Jeremy Holcombe"},"description":"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.","sameAs":["https:\/\/www.linkedin.com\/in\/jeremyholcombe\/"],"url":"https:\/\/kinsta.com\/it\/blog\/author\/jeremyholcombe\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/70809","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/199"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=70809"}],"version-history":[{"count":7,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/70809\/revisions"}],"predecessor-version":[{"id":71156,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/70809\/revisions\/71156"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70809\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70809\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70809\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70809\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70809\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70809\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70809\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70809\/translations\/es"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/70809\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/70810"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=70809"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=70809"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=70809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}