262 votes

Comment fusionner des fichiers spécifiques à partir de branches Git ?

J'ai 2 branches git branch1 et branch2 et je veux fusionner file.py dans branch2 en file.py dans branch1 et seulement ce fichier.

En fait, je veux juste travailler sur le fichier.py de la branche 1 mais je veux profiter de la commande de fusion. Quelle est la meilleure façon de procéder ?

6voto

Makogan Points 1993

La solution que j'ai trouvée et qui m'a causé le moins de maux de tête :

git checkout <b1>
git checkout -b dummy
git merge <b2>
git checkout <b1>
git checkout dummy <path to file>

Après avoir fait cela, le fichier dans path to file en b2 est ce qu'il serait après une fusion complète avec b1 .

4voto

Jackkobec Points 110

La solution la plus simple est :

git checkout le nom de la branche source et les chemins d'accès aux fichiers spécifiques que nous voulons ajouter à notre branche actuelle.

git checkout sourceBranchName pathToFile

2voto

jthill Points 10384

Pour fusionner uniquement les changements de la branche 2 file.py pour que les autres changements disparaissent.

git checkout -B wip branch2
git read-tree branch1
git checkout branch2 file.py
git commit -m'merging only file.py history from branch2 into branch1'
git checkout branch1
git merge wip

La fusion ne regardera même pas les autres fichiers. Vous pouvez avoir besoin de '-f' les vérifications si les arbres sont assez différents.

Notez que cela laissera la branche 1 comme si tout ce qui se trouvait dans l'historique de la branche 2 jusqu'à ce point avait été fusionné, ce qui peut ne pas être ce que vous voulez. Une meilleure version du premier checkout ci-dessus est probablement

git checkout -B wip `git merge-base branch1 branch2`

dans ce cas, le message de validation devrait probablement aussi être

git commit -m"merging only $(git rev-parse branch2):file.py into branch1"

2voto

Claire. D Points 21

La solution de Matthew Turner est la plus simple mais donne une erreur si branch1 et file ont le même nom. Dans ce cas, remplacez la deuxième ligne par

git checkout branch2 -- file.py

1voto

Mohamed Laradji Points 99

Si vous ne vous souciez que de la résolution des conflits et non de la conservation de l'historique des livraisons, la méthode suivante devrait fonctionner. Disons que vous voulez fusionner a.py b.py de BRANCHA sur BRANCHB . Tout d'abord, assurez-vous que tout changement dans BRANCHB sont soit livrés, soit rangés, et qu'il n'y a pas de fichiers non suivis. Ensuite :

git checkout BRANCHB
git merge BRANCHA
# 'Accept' all changes
git add .
# Clear staging area
git reset HEAD -- .
# Stash only the files you want to keep
git stash push a.py b.py
# Remove all other changes
git add .
git reset --hard
# Now, pull the changes
git stash pop

git ne reconnaissent pas qu'il y a des conflits dans a.py b.py mais les marqueurs de conflit de fusion sont là s'il y avait effectivement des conflits. En utilisant un outil de fusion tiers, tel que VSCode, on pourra résoudre les conflits plus facilement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X