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 ?

279voto

pdp Points 1733

Lorsque le contenu est en file.py de branche 2 qui ne s'applique plus à branche 1 il faut choisir certains changements et en laisser d'autres. Pour un contrôle total, faites une fusion interactive en utilisant la commande --patch interrupteur :

$ git checkout --patch branch2 file.py

La section sur le mode interactif dans la page de manuel de git-add(1) explique les clés qui doivent être utilisées :

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk nor any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk nor any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

La commande split est particulièrement utile.

149voto

matty T pain Points 762

Bien qu'il ne s'agisse pas d'un fusionner en soi, parfois le contenu entier d'un autre fichier sur une autre branche est nécessaire. Jason Rudolph article de blog offre un moyen simple de copier des fichiers d'une branche à l'autre. Appliquez la technique comme suit :

$ git checkout branch1 # ensure in branch1 is checked out and active
$ git checkout branch2 file.py

Ahora file.py est maintenant dans branche 1 .

37voto

R.M. Points 1371

Aucune des autres réponses actuelles ne permet de "fusionner" réellement les fichiers, comme si vous utilisiez la commande merge. (Au mieux, elles vous demanderont de sélectionner manuellement les différences.) Si vous souhaitez réellement tirer parti de la fusion en utilisant les informations d'un ancêtre commun, vous pouvez suivre une procédure basée sur celle trouvée dans le fichier Section "Fusion avancée". du manuel de référence de git.

Pour ce protocole, je suppose que vous voulez fusionner le fichier 'path/to/file.txt' de origin/master dans HEAD - modifiez comme il convient. (Il n'est pas nécessaire d'être dans le répertoire supérieur de votre référentiel, mais cela aide).

# Find the merge base SHA1 (the common ancestor) for the two commits:
git merge-base HEAD origin/master

# Get the contents of the files at each stage
git show <merge-base SHA1>:path/to/file.txt > ./file.common.txt
git show HEAD:path/to/file.txt > ./file.ours.txt
git show origin/master:path/to/file.txt > ./file.theirs.txt

# You can pre-edit any of the files (e.g. run a formatter on it), if you want.

# Merge the files
git merge-file -p ./file.ours.txt ./file.common.txt ./file.theirs.txt > ./file.merged.txt

# Resolve merge conflicts in ./file.merged.txt
# Copy the merged version to the destination
# Clean up the intermediate files

git fusion-fichier doit utiliser tous les paramètres de fusion par défaut pour le formatage et autres.

Notez également que si votre "nôtre" est la version de travail et que vous ne voulez pas être trop prudent, vous pouvez opérer directement sur le fichier :

git merge-base HEAD origin/master
git show <merge-base SHA1>:path/to/file.txt > ./file.common.txt
git show origin/master:path/to/file.txt > ./file.theirs.txt
git merge-file path/to/file.txt ./file.common.txt ./file.theirs.txt

19voto

Est-ce que toutes les modifications apportées à file.py en branch2 dans leurs propres commits, séparément des modifications apportées aux autres fichiers ? Si oui, vous pouvez simplement cherry-pick les changements sont terminés :

git checkout branch1
git cherry-pick <commit-with-changes-to-file.py>

Autrement, merge ne fonctionne pas sur les chemins individuels... vous pourriez tout aussi bien créer une git diff parcelle de file.py les changements de branch2 y git apply de les branch1 :

git checkout branch2
git diff <base-commit-before-changes-to-file.py> -- file.py > my.patch
git checkout branch1
git apply my.patch

10voto

Martin Points 481

Vous pouvez stash y stash pop le dossier :

git checkout branch1
git checkout branch2 file.py
git stash
git checkout branch1
git stash pop

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