Comment fusionner des fichiers spécifiques à partir de twigs Git

J’ai 2 twigs git twigs1 et twig2 et je veux fusionner fichier.py dans twig2 dans fichier.py dans twig1 et seulement ce fichier.

Essentiellement, je veux juste travailler sur le fichier.py dans branch1 mais que vous voulez tirer parti de la commande de fusion. Quelle est la meilleure façon de procéder?

La réponse acceptée mentionne déjà l’utilisation de git checkout . Maintenant, il pourrait y avoir du contenu dans file.py de branch2 qui n’est plus applicable dans branch1 . Une telle situation nécessitera de choisir certains changements et d’en laisser d’autres. Par conséquent, pour obtenir un contrôle total, effectuez une fusion interactive à l’aide du commutateur --patch :

 $ git checkout --patch branch2 file.py 

La section du mode interactif de la page de manuel relative à git-add(1) explique les clés à utiliser:

 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.

Comme indiqué dans les commentaires, il ne s’agit pas d’une fusion, ce qui explique pourquoi le lien ci-dessous utilise des guillemets. Cependant, j’ai rarement besoin de quelque chose d’aussi compliqué que d’autres affiches décrivent, alors je pense que c’est utile, sinon une solution appropriée, à la question du PO.

Consultez cette page: Astuce Git: Comment “fusionner” des fichiers spécifiques à partir d’une autre twig Elle fournit le moyen le plus simple d’y parvenir, à mon humble avis.

Fondamentalement, pour l’appliquer à votre situation:

 $ git checkout branch1 # ie make sure you're in branch1 $ git checkout branch2 file.py 

Easy Peasy, file.py est maintenant dans branch1.

Toutes les modifications apscopes à file.py dans branch2 dans leurs propres commits sont-elles distinctes des modifications apscopes aux autres fichiers? Si tel est le cas, vous pouvez simplement cherry-pick les changements:

 git checkout branch1 git cherry-pick  

Sinon, la merge ne fonctionne pas sur des chemins individuels … vous pourriez aussi bien créer un correctif git diff de file.py partir de branch2 et git apply à branch1 :

 git checkout branch2 git diff  -- file.py > my.patch git checkout branch1 git apply my.patch 

Aucune des autres réponses actuelles ne “fusionnera” réellement les fichiers, comme si vous utilisiez la commande de fusion. (Au mieux, ils vous demanderont de choisir manuellement les différences.) Si vous voulez 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 la section “Fusion avancée” de git. Manuel de référence.

Pour ce protocole, je suppose que vous souhaitez fusionner le fichier “path / to / file.txt” d’origine / maître dans HEAD – modifier le cas échéant. (Vous n’avez pas besoin 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 :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 (eg 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 merge-file devrait utiliser tous vos parameters de fusion par défaut pour le formatage et autres.

Notez également que si vous utilisez la version de travail et que vous ne voulez pas être trop prudent, vous pouvez utiliser directement le fichier:

 git merge-base HEAD origin/master git show :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 

Vous pouvez stash et stash pop le fichier:

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

Pour fusionner uniquement les modifications du fichier.py de file.py , faites disparaître les autres modifications.

 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 

Fusionner ne regardera jamais aucun autre fichier. Vous pourriez avoir besoin de “-f” les checkouts si les arbres sont assez différents.

Notez que cela laissera branch1 comme si tout ce qui se trouvait dans l’historique de branch2 à ce point avait été fusionné, ce qui peut ne pas être ce que vous voulez. Une meilleure version de la première caisse 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"