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(+)