J'ai deux branches (A et B) et je veux fusionner un seul fichier de la branche A avec un seul fichier correspondant de la branche B.
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
J'ai deux branches (A et B) et je veux fusionner un seul fichier de la branche A avec un seul fichier correspondant de la branche B.
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
Réponses:
J'ai rencontré 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 fichier f
, qui sont indépendantes des différences d'interface dans les deux branches, ont été modifiées en branche B
, mais la modification est importante pour les deux branches. Ainsi, je dois fusionner simplement le fichier f
de branche B
en fichier f
de 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 en branche A
, là où je veux fusionner B
la version du fichier f
. La deuxième commande corrige le fichier f
avec f
of HEAD
of B
. Vous pouvez même accepter / supprimer des parties uniques du patch. Au lieu de cela, B
vous pouvez spécifier un commit ici, ce n'est pas obligatoire HEAD
.
Modification de la communauté : si le fichier f
sur B
n'existe pas A
encore, omettez l' --patch
option. Sinon, vous obtiendrez un "No Change". message.
git checkout --patch B -- f
pour que cela fonctionne.
a
pendant la phase interactive, au lieu d'appuyer à y
chaque fois. Ou utilisez git checkout B -- f
plutôt la commande.
Voici ce que je fais dans ces situations. C'est un coup de coude mais cela fonctionne très bien pour moi.
J'ai essayé de patcher et ma situation était trop laide pour ça. Donc, en bref, cela ressemblerait à ceci:
Branche de travail: A Branche expérimentale: B (contient file.txt qui contient les modifications que je souhaite intégrer.)
git checkout A
Créez une nouvelle branche basée sur A:
git checkout -b tempAB
Fusionner B dans tempAB
git merge B
Copiez le hachage sha1 de la fusion:
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <matthewe@matthewe.com>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch 'B' into tempAB
Vérifiez votre branche de travail:
git checkout A
Récupérez votre fichier corrigé:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
Et là, vous devriez l'avoir. Validez votre résultat.
A
s'est détourné B
pour commencer, par d'autres moyens. La copie remplacera ces différences.
Cela utilise l'outil de diff interne de git. Peut-être un peu de travail à faire, mais simple.
#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.
--
(libellé d'argument vide), git checkout docs: ARGUMENT DISAMBIGUATION say: "à utiliser git checkout -- <pathspec>
si vous souhaitez extraire ces chemins de l'index". En effet, vous pouvez avoir à la fois une branche et un fichier / chemin d'accès du même nom. Dans de tels cas, plutôt que de vous demander de lever l'ambiguïté si la branche ou le chemin doit être extrait quand les deux existent, git choisira de retirer la branche par défaut. Cependant, si --
git précède, le fichier / chemin sera extrait à la place.
J'ai trouvé cette approche simple et utile: comment «fusionner» des fichiers spécifiques d'une autre branche
Il s'avère que nous essayons trop fort. Notre bon ami git checkout est le bon outil pour le travail.
git checkout source_branch <paths>...
Nous pouvons simplement donner à git checkout le nom de la branche de fonctionnalité A et les chemins d'accès aux fichiers spécifiques que nous voulons ajouter à notre branche principale.
Veuillez lire l'article entier pour plus de compréhension
-p
option dans cette commande. Ce qui écrase alors toutes les parties de votre fichier Worktree qui ont déjà détourné de la branche de votre extraction, avant les modifications du correctif, malheureusement.
Vous pouvez utiliser:
git merge-file
Astuce: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
git merge-file
La commande suivante comparera (1) le fichier de la branche correcte, à master (2) vous demandera de manière interactive quelles modifications appliquer.
git checkout --patch master
Ma modification a été rejetée, donc j'attache ici comment gérer les modifications de fusion 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.
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 par la suite.
error: <file-path>: already exists in working directory
git diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
Vous pouvez extraire l'ancienne version du fichier à fusionner, l'enregistrer sous un nom différent, puis exécuter quel que soit votre outil de fusion 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
Je le ferai comme
git format-patch branch_old..branch_new file
cela produira un patch pour le fichier.
Appliquer le correctif à la branche branch_old
git am blahblah.patch