22 Dicembre 2021
Expand search form

Cos’è una fusione di polpi?

Il codice per il merge di Git è uno dei pezzi di software più sofisticati mai scritti. C’è così tanta roba che va dentro durante un merge che è semplicemente sbalorditivo. Solo per questo, Linus potrebbe essere considerato un genio della programmazione. Peccato per gli altri geni, ha anche “Linux kernel” sul suo curriculum :-D.

Come suggerisce il titolo, questo articolo riguarda Octopus Merge in Git. Per questo, spero che sappiate cos’è un merge Git di base e cosa significa unire. Se siete completamente estranei a Git, allora non ho idea di cosa stiate facendo qui. Fareste meglio a leggere un po’ di Git 101 prima di saltare in questo articolo.

Comunque, giusto per ripassare, ecco come va un semplice/familiare merge di Git.

Abbiamo un ramo chiamato feature che si è discostato da master al secondo commit ed è andato ad avere due commit propri.

Rami master e feature in Git

Nota: Per le immagini dei rami in questo articolo sto usando uno strumento Git GUI chiamato Git Kraken. Lo sto provando da qualche giorno e sembra abbastanza promettente. Sono un fan della sua UI pulita e minimalista e lo sto usando ampiamente per la bella visualizzazione dei rami. E soprattutto, è gratuito per uso personale e non commerciale. Quindi, potete provarlo gratuitamente.

Ora volete aggiungere quelle nuove modifiche sul ramo delle funzionalità al master. Il modo in cui lo si fa è la fusione (non parliamo di Rebasing per ora, lo vedremo un’altra volta). Quindi, quando si fa il merge è così che appare.

Git merge master feature

Queste sono tutte le solite cose con cui abbiamo familiarità.

Ora c’è un altro tipo di merge chiamato Il merge di Octopus. Almeno alcuni di voi devono averne sentito parlare o da un video online o da un collega in ufficio che sembra sapere tutto. In ogni caso l’Octopus merge è un modo davvero divertente di unire. Probabilmente non riuscirete a farlo al vostro lavoro perché molte aziende pensano che questo complichi le cose e sappiamo tutti quanto le aziende odino la complessità. Comunque, vediamo cosa sembra. Ho un repository git locale con tre rami ramo1, ramo2, ramo3 insieme a master. Tutti e quattro questi rami hanno due commit extra dal punto in cui hanno divergenza.

Git octopus pre immagine

Ora, se volete unirli, il modo usuale sarebbe quello di unire due rami alla volta per arrivare finalmente alla combinazione finale dopo tre fusioni come questa.

Il solito modo di unire rami in Git

Questo può sembrare corretto e potrebbe effettivamente essere l’unico modo in cui pensereste a questo se non fosse per il merge di Octopus. Avete tre merge commits qui e come sappiamo i merge commits sono rumore. Inquinano la storia del vostro repository e interrompono la storia raccontata dalla vostra storia Git. Quindi, che ne dite di mantenere basso il rumore avendo solo un Merge commit invece di tre. Come chiedete? Octopus, amico mio. Tutti acclamano il grande e potente Octopus. Quindi, il modo in cui si esegue un Octopus è quello di unire tutti i rami in una volta al master. Per farlo si dà un comando come questo

Git merge octopus

Questo unirà tutti e tre i rami al master. I rami avranno un aspetto simile a questo. Vedete il riferimento a Octopus ora?

Git merge octopus

Ora, se sapete qualcosa sui polpi, potreste chiedervi che qui abbiamo solo quattro gambe mentre una piovra ne ha 8. Beh, avete ragione. I polpi hanno 8 gambe (tecnicamente 6, dato che due di esse sono usate come mani), ma 4 è abbastanza buono. In realtà ogni merge può essere chiamato Octopus se stai unendo tre o più rami.

Se stai usando Git da un po’ di tempo, potresti chiederti, se Octopus è così dannatamente figo, perché non ne hanno sentito parlare più persone e perché più persone non lo usano. Beh, hai ragione, amico mio. Octopus è fantastico di sicuro, ma come ho detto certamente complica molto le cose, specialmente quando si ha a che fare con i conflitti di fusione. Il merge è già abbastanza difficile quando si ha a che fare con due soli rami. Ma se stai fondendo 5 o 10 rami insieme sembra che tu stia facendo un’operazione complessa. Devi stare molto attento in quel caso e non sono nemmeno sicuro che i moderni strumenti GUI supportino il diffing a 10 vie. Inoltre molte persone tendono ad esagerare con Octopus.

Guardate questo messaggio dove Linus Torvalds urla (piacevolmente) ad un tizio per aver creato un Octopus con 66 rami. Immaginatelo per un secondo. 66 rami! Non vorrei essere il tizio che gestisce i conflitti di fusione su quello! Linux dice giustamente

che non è una piovra, è un Cthulhu merge

Cthulu Immagine

Quindi, molte aziende non lo usano davvero. Molte persone non lo considerano nemmeno per le loro strategie di fusione.

Una regola empirica da seguire con Octopus è di non esagerare mai. Una fusione Octopus a 8 vie, anche se confina con la pazzia e la durezza, va bene, ma più di così è un’esagerazione. Le situazioni in cui è necessario unire più di 5 o 6 rami tendono ad essere molto rare e in quei casi si può andare per un Octopus su un sottoinsieme di rami alla volta e fare un Octopus per quelli. Oppure puoi ripensare la tua strategia di fusione.

In ogni caso, spero che questo articolo vi abbia aiutato a capire qualcosa di nuovo e vi abbia dato alcune idee per affrontare fusioni complesse. Spero che istruirete i vostri pari e colleghi su questa nuova fusione e condividerete questo articolo con loro

Bene, questo è tutto per questo articolo gente. Ci rivediamo nel prossimo. Fino ad allora, arrivederci.

Un ringraziamento speciale a Git Kraken team di Axosoft per aver sviluppato un grande strumento come Kraken.

Potreste anche essere interessati agli argomenti

Cos’è git octopus?

git octopus ti permette di unire tutti i tuoi rami di feature insieme in qualsiasi momento in modo da poter avere un assemblaggio di tutto il lavoro che sta andando avanti e infine fare un lavoro di integrazione continua su quel merge. ecco come funziona: uno sviluppatore spinge un cambiamento sul suo ramo di feature.

Cosa fa git merge?

Il merge è il modo di Git di rimettere insieme una storia biforcata. Il comando git merge ti permette di prendere le linee di sviluppo indipendenti create da git branch e integrarle in un singolo ramo. … Il ramo corrente sarà aggiornato per riflettere la fusione, ma il ramo di destinazione sarà completamente inalterato.

Non si dovrebbe fare un Octopus?

Non dovrebbe fare un Octopus. Il merge con strategia octopus è fallito. Cioè, interrompe il merge completamente. Se lo “risolvi” e fai il commit è semplicemente un commit che fai.

Qual è la strategia di merge squash?

Squash ( –squash ): Combina tutti i commit in un nuovo commit non-merge sul ramo di destinazione. Squash, solo fast-forward ( –squash –ff-only ): Se il ramo sorgente non è aggiornato con il ramo di destinazione, rifiuta la richiesta di fusione. Altrimenti, combina tutti i commit in un nuovo commit non-merge sul ramo di destinazione.

Cosa succede dopo git merge?

2 Risposte. Quando si fonde un ramo in un altro git merge applicherà tutti i commit dal ramo da cui si sta fondendo al ramo in cui si sta fondendo da quando i due divergono. Puoi considerarlo come formare una nuova testa che contiene l’ultimo stato di entrambi i rami messi insieme.

Ho bisogno di fare il commit dopo il merge?

Con –no-commit esegui il merge ma fai finta che il merge sia fallito e non autocommetti, per dare all’utente la possibilità di ispezionare e modificare ulteriormente il risultato del merge prima di commettere. Se il merge riesce senza conflitti, git farà automaticamente il commit (cosa che dovreste essere in grado di verificare semplicemente controllando il git log).

Cos’è la strategia di merge di git?

Git Merge Strategies. Un merge avviene quando si combinano due rami. Git prenderà due (o più) puntatori di commit e cercherà di trovare un commit di base comune tra loro. … Ai comandi git merge e git pull può essere passata un’opzione -s (strategia). L’opzione -s può essere aggiunta al nome della strategia di unione desiderata.

Cos’è un merge a 3 vie?

Un merge a tre vie viene eseguito dopo un’analisi automatica delle differenze tra un file “A” e un file “B” considerando anche l’origine, o antenato comune, di entrambi i file “C”. … Il merge a tre vie cerca sezioni che sono le stesse solo in due dei tre file.

Cos’è git merge — no FF?

Il flag –no-ff impedisce a git merge di eseguire un “fast-forward” se rileva che la tua HEAD corrente è un antenato del commit che stai cercando di unire. Un fast-forward è quando, invece di costruire un commit di fusione, git semplicemente sposta il tuo puntatore al ramo per puntare al commit in arrivo.

Git fetch e git pull sono la stessa cosa?

Il comando git fetch scarica commit, file e refs da un repository remoto nel tuo repo locale. … git pull è l’alternativa più aggressiva; scaricherà il contenuto remoto per il ramo locale attivo ed eseguirà immediatamente git merge per creare un merge commit per il nuovo contenuto remoto.

Cosa succede ad un ramo dopo il merge?

Quando esegui un merge, effettivamente unisci un ramo in un altro – tipicamente un ramo di funzionalità o di correzione di bug in un ramo principale come master o develop. Non solo le modifiche al codice vengono unite, ma anche tutti i commit che sono andati nel ramo delle funzionalità.

Dovrei schiacciare o unire?

Come regola generale, quando si fonde una richiesta di pull da un ramo con una storia di commit disordinata, si dovrebbe schiacciare i propri commit. Ci sono eccezioni, ma nella maggior parte dei casi, lo squashing risulta in una storia Git più pulita che è più facile da leggere per il team.

Cos’è lo squashing di un commit?

Lo squashing è un modo per riscrivere la tua storia di commit; questa azione aiuta a pulire e semplificare la tua storia di commit prima di condividere il tuo lavoro con i membri del team. Squashare un commit in Git significa che stai prendendo i cambiamenti da un commit e li stai aggiungendo al Parent Commit.

Qual è la migliore strategia di merge?

Le strategie più comunemente usate sono Fast Forward Merge e Recursive Merge. In questa strategia di merge più comunemente usata, la storia è solo una linea retta. Quando crei un ramo, fai alcuni commit in quel ramo, quando sei pronto per il merge, non c’è un nuovo merge sul master.

Cos’è un merge commit?

A differenza degli altri commit, il merge commit è un commit che ha più genitori (generalmente due). Per esempio, quando un ramo chiamato feature viene fuso con master, viene creato un nuovo commit sul ramo master che ha due genitori, il precedente capo di master e il capo di feature.

Articolo precedente

Come faccio a trovare il numero identificativo del mio ufficio contabile?

Articolo successivo

Il Roomba può raccogliere la lettiera del gatto?

You might be interested in …