Git, come eseguire il merge di un file specifico da un branch all'altro

Unire modifiche parziali da un branch qualsiasi ad un altro branch è una pratica che spesso può esserci utile durante lo sviluppo delle nostre applicazioni.

Pubblicato da ,
Ultima modifica

Spesso durante lo sviluppo delle nostre applicazioni che usano il sistema di versionamento Git per il controllo della versione, si presenta la necessità di effettuare un "merge parziale" cioè unire determinati branch solo con delle modifiche parziali, senza effettuare un git-merge vero e proprio, vediamo come procedere con un semplice esempio.

Il repository di esempio è composto da due branch, master e develop, quest'ultimo è il branch in cui stiamo lavorando

$ git branch 
* develop    
  master              

in particolare il branch master ha un unico file index.html

$ ls       
index.html 

creiamo nel branch develop due file foo.html e bar.html, se lanciamo il comando git-status vedremo un risultato simile a questo

$ git status
On branch develop

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        bar.html
        foo.html

nothing added to commit but untracked files present (use "git add" to track)

quindi eseguiamo il git-commit di questi due file

$ git add . && git commit -m "First commit"        
[develop (root-commit) ae520ce] First commit       
 2 files changed, 22 insertions(+)                 
 create mode 100644 bar.html                       
 create mode 100644 foo.html                       
                                                   

se ritorniamo al branch master i due file che abbiamo creato nel branch develop ovviamente non ci sono, vedremo solo l'unico file index.html

$ git checkout master && ls      
Switched to branch 'master'      
index.html                       

se vogliamo importare nel branch master dal branch develop soltanto il file foo.html possiamo farlo con il seguente comando

$ git checkout develop -- foo.html

prima di eseguire questo comando assicuriamoci di essere nel branch master, se lanciamo il comando ls per visualizzare i file presenti avremo il seguente risultato

$ ls
foo.html  index.html

inoltre se lanciamo il comando git-status vedremo un messaggio che ci indica che è presente un nuovo file non salvato

$ git status                                                 
On branch master                                             
Changes to be committed:                                     
  (use "git restore --staged <file>..." to unstage)          
        new file:   foo.html                                 
                                                             

quindi a questo punto non ci resta altro che effettuare il git-commit di queste modifiche

$ git add . && git commit -m "Second commit"
[master 82fb92c] Second Commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 foo.html

quindi abbiamo importato dal branch develop al master un solo file (foo.html) senza effettuare il merge di tutte le modifiche presenti nel branch develop, quest'ultimo ha un file in più bar.html non presente nel branch master

$ git checkout develop && ls       
Switched to branch 'develop'       
bar.html  foo.html  index.html     
                                   

Infine un ultima osservazione, se modifichiamo il file foo.html dal branch develop ed eseguiamo il git-commit, e vogliamo importarci le modifiche nel branch master, la procedura è sempre la stessa, dal branch master eseguiamo lo stesso comando di prima

$ git checkout develop -- foo.html

successivamente se eseguiamo il comando git-status vedremo il seguente risultato

$ git status                                             
On branch master                                         
Changes to be committed:                                 
  (use "git restore --staged <file>..." to unstage)      
        modified:   foo.html                             
                                                         
                                                         

il che ci indica che ci sono delle modifiche non salvate, e quindi non ci resta altro che eseguire il comando git-commit

$ git add . && git commit -m "Third commit"
[master 7241c1c] Third commit
 1 file changed, 1 insertion(+)