web-dev-qa-db-fra.com

Comment fusionner les modifications dans un seul fichier plutôt que de fusionner des commits?

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.

296
Isuru

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.

493
loup

Voici ce que je fais dans ces situations. C'est un kludge mais ça fonctionne très bien pour moi. 

  1. Créez une autre branche basée sur votre branche de travail.
  2. git pull/git fusionner la révision (SHA1) qui contient le fichier que vous souhaitez copier. Cela va donc fusionner toutes vos modifications, mais nous n'utilisons cette branche que pour récupérer le fichier.
  3. Résolvez les conflits, etc., étudiez votre fichier. 
  4. vérifier votre branche de travail
  5. Extraire le fichier validé de votre fusion.
  6. Engagez-le.

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. 

13
eggmatters
8
geralOE

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.
8
Mikael Kellgren

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 

2
user1854182

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.

1
jbirkel

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

1
Pawel Cioch

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.
0
Soup

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

0
Salami

Je vais le faire comme

git format-patch branch_old..branch_new fichier

cela produira un patch pour le fichier.

Appliquer le correctif à la cible branch_old

git am blahblah.patch

0
Noob