Pour fusionner sélectivement les fichiers d'une branche dans une autre branche, exécutez
git merge --no-ff --no-commit branchX
donde branchX
est la branche à partir de laquelle vous voulez fusionner dans la branche courante.
El --no-commit
permet de mettre en scène les fichiers qui ont été fusionnés par Git sans pour autant les commiter. Cela vous donnera la possibilité de modifier les fichiers fusionnés comme vous le souhaitez, puis de les valider vous-même.
Selon la façon dont vous souhaitez fusionner des fichiers, il existe quatre cas de figure :
1) Vous voulez une véritable fusion.
Dans ce cas, vous acceptez les fichiers fusionnés de la manière dont Git les a fusionnés automatiquement, puis vous les livrez.
2) Il y a certains fichiers que vous ne voulez pas fusionner.
Par exemple, vous voulez conserver la version de la branche actuelle et ignorer la version de la branche à partir de laquelle vous fusionnez.
Pour sélectionner la version dans la branche actuelle, exécutez :
git checkout HEAD file1
Cela permettra de récupérer la version de file1
dans la branche courante et écraser le file1
automatisé par Git.
3) Si vous voulez la version dans la brancheX (et non une vraie fusion).
Cours :
git checkout branchX file1
Cela permettra de récupérer la version de file1
en branchX
et écraser file1
auto-fusionné par Git.
4) Le dernier cas est si vous voulez sélectionner seulement des fusions spécifiques dans file1
.
Dans ce cas, vous pouvez modifier le file1
directement, mettez-le à jour en fonction de la version que vous souhaitez pour la version de file1
à devenir, puis à s'engager.
Si Git ne peut pas fusionner un fichier automatiquement, il signalera le fichier comme étant " non immergé " et produire une copie où vous devrez résoudre les conflits manuellement.
Pour expliquer davantage avec un exemple, disons que vous voulez fusionner branchX
dans la branche actuelle :
git merge --no-ff --no-commit branchX
Vous exécutez ensuite le git status
pour visualiser l'état des fichiers modifiés.
Par exemple :
git status
# On branch master
# Changes to be committed:
#
# modified: file1
# modified: file2
# modified: file3
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: file4
#
Où file1
, file2
et file3
sont les fichiers que git a réussi à fusionner automatiquement.
Ce que cela signifie, c'est que les changements dans le master
y branchX
pour ces trois dossiers ont été combinés ensemble sans aucun conflit.
Vous pouvez vérifier comment la fusion a été effectuée en exécutant la commande git diff --cached
;
git diff --cached file1
git diff --cached file2
git diff --cached file3
Si vous trouvez une fusion indésirable, vous pouvez
- modifier directement le fichier
- sauver
git commit
Si vous ne voulez pas fusionner file1
et que vous voulez conserver la version de la branche actuelle
Exécuter
git checkout HEAD file1
Si vous ne voulez pas fusionner file2
et ne veulent que la version dans branchX
Exécuter
git checkout branchX file2
Si vous voulez file3
pour être fusionné automatiquement, ne faites rien.
Git l'a déjà fusionné à ce stade.
file4
ci-dessus est une fusion ratée par Git. Cela signifie qu'il y a des changements dans les deux branches qui se produisent sur la même ligne. C'est là que vous devrez résoudre les conflits manuellement. Vous pouvez écarter la fusion réalisée en éditant directement le fichier ou en exécutant la commande checkout pour la version dans la branche que vous souhaitez file4
pour devenir.
Enfin, n'oubliez pas de git commit
.
8 votes
Si les changements dans vos branches expérimentales sont bien organisés dans des commits séparés, il est préférable de penser en termes de fusion sélective. commet au lieu de fichiers sélectifs. La plupart des réponses ci-dessous supposent que c'est le cas.
2 votes
Est-ce qu'une combinaison de
git merge -s ours --no-commit
suivi de quelquesgit read-tree
serait une bonne solution pour cela ? Voir stackoverflow.com/questions/1214906/41 votes
Une question plus récente a une réponse d'une ligne, bien rédigée : stackoverflow.com/questions/10784523/
0 votes
Consultez ce blog pour la fusion de fichiers spécifiques uniquement jasonrudolph.com/blog/2009/02/25/