11.1 Rami in git
Lavorare con i rami (branches) in Git — è uno degli aspetti chiave della gestione delle versioni, che permette di condurre contemporaneamente diverse linee di sviluppo in un unico repository. Il branching rende Git uno strumento potente per la collaborazione, gli esperimenti e la gestione di diverse versioni del progetto.
Puoi pensare ai rami in git come a delle cartelle, dove git copia il tuo progetto. Hai la cartella principale del tuo progetto nel tuo repository locale — master, e git può creare copie di questa cartella, così puoi sperimentare qualcosa senza rompere il codice principale che funziona bene. Queste cartelle-copie si chiamano rami — branches.
I rami sono versioni alternative del codice. Supponiamo che tu voglia modificare qualcosa in un grande progetto, fare un esperimento di cui non sei completamente sicuro. Come faresti senza git?
Potresti copiare il progetto in una nuova cartella e provare a cambiare tutto lì. Se ti piace il risultato, puoi copiarlo nella cartella principale. Se non ti piace, puoi dimenticarlo o addirittura eliminarlo.
Oppure prendiamo un esempio dalla vita reale. Diciamo, la scrittura di un libro:
- Hai il manoscritto del libro (ramo principale).
- Vuoi provare a cambiare il finale (creazione di un nuovo ramo).
- Scrivi il nuovo finale in un documento separato (lavoro nel nuovo ramo).
- Se il nuovo finale è migliore, sostituisci il vecchio nel manoscritto (fusione dei rami).
- Elimini il documento separato con il nuovo finale (eliminazione del ramo).
11.2 Creazione di rami
Creare un ramo in IntelliJ IDEA è molto semplice:
Inserisci il nome del ramo:
Intellij IDEA mostrerà subito il nome del tuo ramo corrente in alto nel menu:
Ma cosa c'era prima lì?
C'era il nome del tuo primo e principale ramo — master.
Ora mostra test, il che significa che Git (sotto la guida di IntelliJ IDEA) non solo ha creato un nuovo ramo, ma si è anche subito spostato su di esso.
Aggiungiamo un po' di codice nel file main.html nel ramo corrente (test) e facciamone il commit:
11.3 Passare tra i rami
Passo 1. Scegli il ramo.
Ora cambiamo sul nostro vecchio ramo. Clicca sul menu in alto, e cosa vediamo lì?
Non spaventarti — è tutto semplice qui:
Local — questa è la lista dei rami del tuo repository git locale. Ce ne sono due:
- test
- master
Remote — questo è il tuo repository remoto, che si trova sul server GitHub. Lì abbiamo pushato le tue modifiche, ma il nuovo ramo non c'è, il che è logico. Il repository remoto si chiama origin, e lì c'è solo il ramo master.
Recent — è semplicemente una lista di nomi degli ultimi rami con cui hai lavorato: questo elemento IntelliJ IDEA lo aggiunge per comodità e velocità.
Il nome origin/master a destra del nome del repository locale è il nome del repository remoto con cui è attualmente sincronizzato, e dove verranno pushate le modifiche.
Passo 2. Carichiamo il codice del ramo nella cartella corrente.
Passo 3. Verifica.
Mi appare il ramo «master» e il vecchio codice:
11.4 Fusione dei rami
Ora proviamo a unire il codice dei nostri due rami.
Passo 1. Per iniziare aggiungiamo un altro file al nostro progetto — index.html e scriviamo in esso del codice:
- Creiamo il file index.html
- Scriviamo del codice <h1>Hello</h1>
- Facciamo il commit del file
Ecco come appaiono i miei due file nel ramo master:
Passo 2. Fusione dei rami.
Versiamo nel nostro ramo corrente (master) le modifiche che sono state fatte nel ramo test.
Usiamo anche qui il menu in alto e il comando «Merge ‘test’ into ‘master’»:
Passo 3. Controlla il risultato.
Controlliamo:
- In alto appare ancora il ramo master
- Abbiamo 2 file: index.html e main.html
- Il file main.html contiene il codice aggiunto nel ramo test
11.5 Conflitti di fusione
A volte ci sono conflitti durante la fusione dei rami.
Se apporti modifiche a un file in rami diversi e provi a unirli, può sorgere un conflitto.
Conflitto di file di testo
Git è un sistema molto intelligente — comprende i tipi di file. Se apporti modifiche in parti diverse di file che considera testuali, trasferirà semplicemente le modifiche da un file all'altro nel posto giusto (così come farebbe una persona).
Conflitto di file binari
Ma se modifichi un'immagine o un documento, Git non cercherà di unire le loro parti in una sola: ti chiederà semplicemente di scegliere quale versione del file vuoi mantenere nel ramo corrente.
Risoluzione manuale dei conflitti
Se apporti modifiche nella stessa posizione di un file di testo, Git non sarà in grado di unire correttamente le diverse versioni e ti chiederà di farlo:
Ecco come potrebbe apparire:
Cosa vedi qui:
- A sinistra — il contenuto del file main.html del ramo master
- A destra — il contenuto del file main.html del ramo test
- In mezzo IntelliJ IDEA ti propone di scrivere la versione finale del codice (puoi cliccare sui pulsanti «>>» e «<<» per inserire automaticamente le modifiche da un file specifico)
Ho accettato la versione master e ho completato il codice a mano. Ecco cosa ho ottenuto:
11.6 Storia delle modifiche
Ancora qualcosa di utile e interessante. Puoi vedere la storia delle modifiche di qualsiasi file cliccando sul pulsante Show History. Ci sono due posti dove può trovarsi. Trovala.
Ecco come appare la storia delle modifiche per me per il file main.html:
Spiegazioni:
-
A sinistra vedi la storia delle modifiche di un file specifico:
- Più la modifica è recente, più è in alto, più è vecchia, più è in basso
- Qui viene anche visualizzata la storia delle fusioni dei rami
- A destra — le modifiche che sono state apportate in un commit specifico
GO TO FULL VERSION