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
merge
git-branch
Isuru
la source
la source
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853Réponses:
J'ai rencontré le même problème. Pour être précis, j'ai deux branches
A
etB
avec les mêmes fichiers mais une interface de programmation différente dans certains fichiers. Maintenant, les méthodes de fichierf
, qui sont indépendantes des différences d'interface dans les deux branches, ont été modifiées en brancheB
, mais la modification est importante pour les deux branches. Ainsi, je dois fusionner simplement le fichierf
de brancheB
en fichierf
de brancheA
.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
etB
:La première commande bascule en branche
A
, là où je veux fusionnerB
la version du fichierf
. La deuxième commande corrige le fichierf
avecf
ofHEAD
ofB
. 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 obligatoireHEAD
.Modification de la communauté : si le fichier
f
surB
n'existe pasA
encore, omettez l'--patch
option. Sinon, vous obtiendrez un "No Change". message.la source
git checkout --patch B -- f
pour que cela fonctionne.a
pendant la phase interactive, au lieu d'appuyer ày
chaque fois. Ou utilisezgit 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.)
Créez une nouvelle branche basée sur A:
Fusionner B dans tempAB
Copiez le hachage sha1 de la fusion:
Vérifiez votre branche de travail:
Récupérez votre fichier corrigé:
Et là, vous devriez l'avoir. Validez votre résultat.
la source
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.
la source
--
(libellé d'argument vide), git checkout docs: ARGUMENT DISAMBIGUATION say: "à utilisergit 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
Veuillez lire l'article entier pour plus de compréhension
la source
-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:
Astuce: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
la source
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
la source
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:
la source
En supposant que B est la branche actuelle:
Notez que cela s'applique uniquement aux modifications apportées au fichier local. Vous devrez vous engager par la suite.
la source
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
la source
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
la source