J'ai deux branches (A et B) et je souhaite fusionner un seul fichier de la branche A avec un seul fichier correspondant de la branche B.
Je suis tombé sur le même problème. Pour être précis, j'ai deux branches A
et B
avec les mêmes fichiers mais une interface de programmation différente dans certains fichiers. Maintenant, les méthodes de file f
, qui est indépendante des différences d’interface entre les deux branches, ont été modifiées dans branch B
, mais la modification est importante pour les deux branches. Donc, je dois fusionner le fichier f
de la branche B
dans le fichier f
de la branche A
.
Une simple commande a déjà résolu le problème pour moi si je suppose que toutes les modifications sont validées dans les deux branches A
et B
:
git checkout A
git checkout --patch B f
La première commande bascule dans branche A
, dans lequel je veux fusionner la version du fichier B
du fichier f
. La deuxième commande corrige le fichier f
avec f
de HEAD
de B
. Vous pouvez même accepter/ignorer une partie du correctif. Au lieu de B
, vous pouvez spécifier n'importe quel commit ici, il n'est pas nécessaire que ce soit HEAD
.
Community Edit : Si le fichier f
sur B
n'existe pas encore sur A
, omettez l'option --patch
. Sinon, vous obtiendrez un "Pas de changement". message.
Voici ce que je fais dans ces situations. C'est un kludge mais ça fonctionne très bien pour moi.
J'ai essayé de réparer et ma situation était trop laide pour cela. En bref, cela ressemblerait à ceci:
Branche de travail: A Branche expérimentale: B (contient le fichier.txt qui contient les modifications que je souhaite intégrer.)
git checkout A
Créer une nouvelle branche basée sur A:
git checkout -b tempAB
Fusionner B dans tempAB
git merge B
Copiez le sha1 de la fusion:
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <[email protected]>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch 'B' into tempAB
Commander votre branche de travail:
git checkout A
Commander votre fichier corrigé:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
Et là vous devriez l'avoir. Commettez votre résultat.
Vous pouvez utiliser:
git merge-file
Astuce: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
Cela utilise le difftool interne ..__ de git .. Peut-être un peu de travail à faire mais tout de suite.
#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file>
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file>
#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool
#Save the file in difftool and you should be done.
La commande suivante va (1) comparer le fichier de la branche correcte à maîtriser (2) vous demande de manière interactive les modifications à appliquer.
git checkout --patch master
En supposant que B est la branche actuelle:
$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
Notez que cela s'applique uniquement aux modifications apportées au fichier local. Vous devrez vous engager après.
J'ai trouvé cette approche simple et utile: Comment "fusionner" des fichiers spécifiques d'une autre branche
En fin de compte, nous essayons trop fort. Notre bon ami, Git Checkout, est le bon outil pour ce travail.
git checkout source_branch <paths>...
Nous pouvons simplement donner à git checkout le nom de la branche de fonctionnalité A et les chemins des fichiers spécifiques que nous voulons ajouter à notre branche principale.
Veuillez lire l'article en entier pour plus de compréhension
Mon édition a été rejetée, donc je joins comment gérer la fusion des modifications d'une branche distante ici.
Si vous devez le faire après une fusion incorrecte, vous pouvez faire quelque chose comme ceci:
# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>
# Get remote updates but DONT auto merge it
git fetch github
# Checkout to your mainline so your branch is correct.
git checkout develop
# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop
# Apply your patches
git checkout --patch github/develop path/to/file
...
# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff
# You'll probably have to
git Push -f # make sure you know what you're doing.
Vous pouvez extraire l'ancienne version du fichier à fusionner, en l'enregistrant sous un nom différent, puis exécuter l'outil que votre outil de fusion contient sur les deux fichiers.
par exemple.
git show B:src/common/store.ts > /tmp/store.ts
(où B est le nom de la branche/commit/tag)
meld src/common/store.ts /tmp/store.ts
git format-patch branch_old..branch_new fichier
git am blahblah.patch