Quando Git e la gestione dei branch incontrano Avengers: Endgame

When I first saw Avengers: Endgame in theaters, I noticed that their time travel rule is quite similar to the Git branching model.

Quando ho visto per la prima volta Avengrs: Endgame al cinema, ho notato che la loro regola per i viaggi nel tempo è molto simile al modello di branching di Git

Può sembrare una comparazione completamente fuorviante, eppure, leggendo gli esempi che LJ Miranda fa in questo suo articolo dal titolo What can the Avengers: Endgame teach us about Git? viene facile capire che, in fondo, quello che hanno fatto gli Avengers in Endgame è stato creare dei branch.

Ed il plot, che ormai non consideriamo più uno spoiler, viene spiegato con cinque esempi ed altrettante spiegazioni sui relativi comandi git:

  • Fast-forward merge: la rappresentazione di un path lineare nella sequenza delle modifiche. Di fatto quindi cinque anni dopo la decapitazione di Thanos. Quindi il più classico dei workflow:
    git checkout -b five-years-later master
    git add <file>
    git commit -m "Add new events in history"
    git checkout master
    git merge five-years-later

  • Checkout a point in the past: identificare il momento in cui si vuole agire, ossia il momento precedente alla distruzione delle gemme da parte di Thanos. Ed a proposito di questo, sapevate di poter utilizzare questo comando per poter vedere tutta la storia delle modifiche applicate a un file?
    git log --all --full-history
    Fatto questo si può determinare quale sia l’hash della modifica interessata e fare “un viaggio nel tempo” per recuperarla:
    git checkout <SHA> -- <path/to/file>
  • Headless and stray branches: e qui le cose iniziano a complicarsi. Perché ogni volta che gli eroi tornano nel passato per procurarsi una gemma, sono in una headless branch, e quindi creano delle realtà alternative:
    git checkout <SHA>
    git checkout -b feat/get-time-stone

    A questo punto per includerla nella realtà attuale, il gioco è il solito, si fanno le modifiche:
    mv the_ancient_one/time_stone hulk
    git add .
    git commit -m "Retrieve time stone from Ancient One"
    git checkout master
    git merge feat/get-time-stone

    Molto semplice, ma con una nota: quando Captain America e Iron Man falliscono il primo tentativo e Loki fugge con la gemma dello spazio, viene creata una stray branch, ossia quella che potremmo definire una realtà alternativa della realtà alternativa. Semplice no?
  • Merge conflict: quando Thankos si presenta nella realtà “fixata” con le nuove gemme si crea una situazione di conflitto:
    $ git merge feat/get-power-stone
    Auto-merging plan_for_the_future_of_humanity.txt
    CONFLICT (content): Merge conflict in plan_for_the_future_of_humanity.txt
    Automatic merge failed; fix conflicts and then commit the result.

    Che può essere sanata solo dall’intervento (fix) di Iron MAn, che sistema il conflitto e completa il merge.
  • Rewriting history (?) with rebase: rimane da restituire le gemme, ci pensa Captain America… A colpi di rebase, con qualche colpo di scena (quindi un commit aggiuntivo), come il voler rimanere nella timeline passata con Peggy.

Al netto del divertissment offerto dal paragone di un film con la gestione dei branch di git, sono molti gli spunti che emergono, dall’articolo del quale consigliamo la lettura.

A volte imparare nuovi comandi Git può essere decisamente divertente e poi insomma, diciamolo chiaro al buon LJ Miranda: complimenti per la fantasia!

Da sempre appassionato del mondo open-source e di Linux nel 2009 ho fondato il portale Mia Mamma Usa Linux! per condividere articoli, notizie ed in generale tutto quello che riguarda il mondo del pinguino, con particolare attenzione alle tematiche di interoperabilità, HA e cloud.
E, sì, mia mamma usa Linux dal 2009.

Tags: , , ,