Lors de l'application d'un correctif, existe-t-il un moyen de résoudre les conflits?

124

Je suis aux fenêtres.

Pour diverses raisons, nous avons plusieurs instances git de différentes branches svn.

Plusieurs fois, je veux résoudre un problème dans le référentiel A, générer un correctif et l'appliquer au référentiel B. Cela fonctionne bien sauf s'il y a des conflits.

Lors du rebasage, je fais un clic droit sur le dossier et utilise tortioseGit et sélectionne l'option de résolution. Cela fait apparaître une belle interface graphique pour me permettre de résoudre mes conflits.

Existe-t-il un moyen d'accomplir cela avec des morceaux de patch rejetés?

Voici mon approche actuelle pour créer / appliquer les correctifs

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch
Kenoyer130
la source
3
Je le fais généralement à la main lorsque toutes les options de patch échouent ...
stdcall
Si la fusion échoue, c'est parce que le programme ne peut pas comprendre comment effectuer la fusion sans ambiguïté. Vous devriez obtenir un fichier avec des ensembles <<<<, ===, >>>> et vous devez entrer et les résoudre à la main.
tacaswell le
Ouais le faire à la main est un vrai pita quand tu parles de quelques 100 mecs.
Kenoyer130 le
C'est à ce moment que vous voudrez utiliser git mergetoolet faire une fusion à 3 avec l'interface graphique de votre choix (je suis partial pour kdiff sur Windows) ...
g19fanatic

Réponses:

254

Pour générer votre patch, procédez comme suit:

git format-patch --stdout first_commit^..last_commit > changes.patch

Maintenant, lorsque vous êtes prêt à appliquer les correctifs:

git am -3 < changes.patch

le -3fera une fusion à trois voies s'il y a des conflits. À ce stade , vous pouvez faire git mergetoolsi vous voulez aller à un ou tout simplement fusionner IUG manuellement les fichiers à l' aide vim (la norme <<<<<<, ||||||, la >>>>>>résolution des conflits).

g19fanatic
la source
3
Il peut être utile d'ajouter --ignore-whitespace --ignore-space-changeà git amtrop. J'ai eu des fusions insignifiantes qui ne se sont pas déroulées sans cela.
angularsen
12
git apply -3 changes.patchsemble fonctionner pour moi aussi
peterflynn
1
Même si le correctif ne s'applique pas proprement, j'obtiens toujours "Aucun fichier ne doit être fusionné" git mergetool. Au lieu de cela, j'ai dû trouver le commit de base du correctif original utilisé, appliquer en plus (heureusement, mon dépôt avait cela), puis rebase.
jozxyqk le
4
J'ai le même problème que @jozxyqk. Ni git am -3ni git apply -3ne déposera réellement de marqueurs de conflit dans mes fichiers, même si je reçois des messages comme Applied patch to 'configure.ac' with conflicts.et error: patch failed: .... C'est sur git 2.17.1. Peut-être que lorsque certains fichiers ne peuvent pas du tout être corrigés, git revient?
nh2
1
J'ai eu le même problème que @ nh2, avez-vous déjà trouvé le problème?
Eridanis
12

Si vous rencontrez fréquemment le même jeu de conflits lors de l'application de correctifs, du rebasage ou de la fusion, vous pouvez utiliser la fonction git rerere (réutiliser la résolution enregistrée). Cela vous permet de prédéfinir comment les conflits doivent être résolus en fonction de la manière dont vous les avez résolus dans le passé. Voir http://git-scm.com/blog/2010/03/08/rerere.html pour plus de détails sur la façon dont cela fonctionne.

mplf
la source
5

TortoiseGit a une fonction de fusion qui peut ouvrir les fichiers de correctifs.

Il y en a une photo ici .

ams
la source
En fait, l'option de fusion pourrait être ce que je recherche.
Kenoyer130 le
Vraiment? Je n'ai pas utilisé tortoise depuis longtemps, mais la page liée a le texte "TortoiseMerge peut ouvrir le fichier de patch Git directement, vous le passez en revue et le patch en copie de travail.", Donc il semble que ça devrait!
ams le
il ouvre les fichiers de patch ... cependant, parfois le format de fichier de patch rompt tortoisegitmerge. Je n'ai jamais réussi avec diff -u, mais plutôt avec la sortie diff -c.
thistleknot
Vous pouvez également faire glisser les correctifs avec le bouton droit sur un dossier de l'arborescence de travail et sélectionner "Appliquer le correctif en série" (pour les correctifs comme 0001-xxx.patch, ... 0002-xxy.patch) ou "Appliquer un fichier de correctif unique".
MrTux
2

Mon approche est:

  • Créer une -Branch «Intégration» où les fichiers sont identiques
  • Appliquer le correctif à cette branche d'intégration
  • Fusionner ou rebaser en maître (je ne sais pas si le rebase est utile ici, car je ne sais pas ce qui se passera lors de l'application d'autres correctifs)
MichiBack
la source