2

Nous avons récemment basculé de SVN à GIT, et j'ai quelques problèmes pour convertir notre flux de travail précédent. La plupart du temps, tout fonctionne, mais aujourd'hui, j'ai eu un conflit bizarre.Comprendre le conflit Git Cherry Pick

Je suis capable de résoudre le conflit, mais j'aimerais savoir d'où cela vient, parce que, à ma connaissance, il ne devrait pas y avoir de conflit dans cette situation.

Configuration

Dans notre dépôt, nous avons une branche master sur laquelle nous développons. Quatre fois par an, nous publions une nouvelle version. Nous branche de master en Release-x et cela est livré après les tests.

Nous avons plusieurs versions de production en production en même temps. Si un bogue est trouvé, cela doit être corrigé sur toutes les branches de publication (supportées). Une seule branche de publication utilisant des balises pour identifier les différentes versions n'est donc pas un workflow valide.

Nous avons donc actuellement ces branches: master, Release-15Q1, Release-15Q2 et Release-15Q3

Dites par exemple, nous avons trouvé une erreur causant un bogue dans master, nous fixerait puis cherry-pick-le sur Release-15Q1, Release-15Q2 et Release-15Q3

donc, maintenant sur le conflit, je suis face:

le fichier était properties.dat chan ged dans master, après branchement Release-15Q3

Properties.dat (Release-15Q3)

serverip=1.1.1.1 
serverport=11 
name=MyApp 

Properties.dat (master)

serverip=2.2.2.2 
serverport=22 
name=BetterName 

développement est allé sur ... tout bon. Ensuite, nous avons remarqué un bug où nous devions ajouter une propriété supplémentaire au fichier pour désactiver le bug.

Properties.dat (master)

serverip=2.2.2.2 
    serverport=22 
    name=BetterName 
+ allowBug=false 

Ce correctif-commit doit également être appliqué aux trois autres branches. Je vais donc à chaque branche et utilise la commande cerise-pick.

Cela me donne des conflits sur les trois premières lignes, mais je ne comprends pas vraiment pourquoi.

J'étais en supposant que, avec la cueillette de cerise vous ne rejeu que commettras spécifique, il faut donc ajouter que la allowBug = false ligne au bon endroit. Cela ne devrait pas avoir d'importance si d'autres changements ont été apportés, n'est-ce pas? Parce que je ne fusionne pas les branches?

Pourquoi cela donne-t-il un conflit? Ces autres changements ne devraient-ils pas être ignorés?

Répondre

0

Lorsque l'option Cherry-Pick est émise, le premier git calcule les différences avec son parent. Cela résulte en un fichier diff (patch a.k.a.). Ce patch contient non seulement ce qui a changé (c.-à-+ allowBug=false) mais aussi le contexte entourant la ligne modifiée (s) Par conséquent, le fichier patch ressemblerait à quelque chose comme:.

@@ -1,7 +1,7 
serverip=2.2.2.2 
serverport=22 
name=BetterName 
+ allowBug=false 

Une fois que le patch est calculé, git essayez de l'appliquer dans votre branche de publication.Le contexte lignes des fichiers de correctif (ceux sans +/-) indique git pour appliquer le + allowBug=false. Comme le contexte environnant ne peut pas être trouvé dans les branches Properties.dat sur la libération , le correctif ne peut pas être appliqué et git déclenche un conflit

Un peu tard, mais hop e il aide :)

EDIT: vous pouvez jeter un oeil à git cherry-pick: how consider only lines modified by the commit (i.e., not the surrounding context)?

+1

PS: une fois que vous résoudre le conflit, si vous êtes préoccupé par git se rappeler comment vous avez résolu ce conflit, vous pouvez activer rerere git: git config --global rerere.enabled true – letimome