Ce comportement est-il réservé aux git?
Après discussion avec un collègue, je viens d'essayer, et SVN le gère sans problème: vous obtenez les 2 lignes modifiées.
Les capacités de fusion de plusieurs VCS sont testées ici pour bazaar, darcs, git et mercurial : https://github.com/mndrix/merge-this
Il semble que seuls les darcs fusionnent avec succès le cas des "lignes adjacentes".
L'application de modifications adjacentes à des fichiers n'est pas un problème difficile. Je pense vraiment que ce comportement a été choisi exprès.
Pourquoi quelqu'un déciderait-il que la modification de lignes adjacentes produit un conflit?
Je pense que c'est pour vous forcer à le regarder .
int max = MAX_ITEMS;
for(unsigned int i = 0; i < max; i++)
do_stuff(i);
Modif numéro 1, sur maître:
int max = MAX_ITEMS/2; // Do stuff only on the first half
for(unsigned int i = 0; i < max; i++)
do_stuff(i);
Modif numéro 2, fusionné à partir d'une branche:
int max = MAX_ITEMS;
for(unsigned int i = 0; i < max/2; i++) // max/2: only on 1st half
do_stuff(i);
Après la fusion, vous ne voulez pas que:
int max = MAX_ITEMS/2; // Do stuff only on the first half
for(unsigned int i = 0; i < max/2; i++) // max/2: only on 1st half
do_stuff(i);
Voir ce comportement comme une fonctionnalité
Vous pouvez transformer le comportement de fusion git en avantage. Lorsque vous devez conserver 2 lignes cohérentes mais que vous ne pouvez pas les détecter (au moment de la compilation, au début de vos tests ou autre), vous pouvez essayer de les joindre.
Réécrivez ceci ...:
for(unsigned int i = 0; i < max; i++)
r = do_stuff(i);
// Need to do something else
do_something_else(r);
...pour ça:
for(unsigned int i = 0; i < max; i++)
r = do_stuff(i);
do_something_else(r); // Need to do something else
Donc, lorsque vous fusionnez Modif 1 ...:
for(unsigned int i = 0; i < max; i++)
r = do_stuff(i)/2; // we need only the half
do_something_else(r); // Need to do something else
... avec Modif 2 ...:
for(unsigned int i = 0; i < max; i++)
r = do_stuff(i);
if(r < 0) // do_stuff can return an error
handle_error(r);
do_something_else(r/2); // Need to do something else
..., git produira un conflit, et vous vous forcerez à le regarder.