Czy to zachowanie dotyczy tylko gitów?
Po dyskusji z kolegą właśnie próbowałem, a SVN radzi sobie z tym bez problemu: modyfikujesz 2 linie.
Możliwości scalania kilku VCS są testowane tutaj dla bazaru, darcs, git i mercurial : https://github.com/mndrix/merge-this
Wydaje się, że tylko darcy skutecznie łączą przypadek „linii sąsiednich”.
Zastosowanie sąsiednich zmian do plików nie jest trudnym problemem. Naprawdę uważam, że to zachowanie zostało wybrane celowo.
Dlaczego ktoś miałby decydować, że modyfikacja sąsiednich linii powoduje konflikt?
Myślę, że to zmusza cię do spojrzenia na to .
int max = MAX_ITEMS;
for(unsigned int i = 0; i < max; i++)
do_stuff(i);
Modif numer 1, na module głównym:
int max = MAX_ITEMS/2; // Do stuff only on the first half
for(unsigned int i = 0; i < max; i++)
do_stuff(i);
Zmodyfikowany numer 2, scalony z oddziału:
int max = MAX_ITEMS;
for(unsigned int i = 0; i < max/2; i++) // max/2: only on 1st half
do_stuff(i);
Po scaleniu nie chcesz tego:
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);
Widząc to zachowanie jako funkcję
Możesz zmienić zachowanie łączenia git na korzyść. Jeśli musisz zachować spójność 2 linii, ale nie możesz ich wykryć (w czasie kompilacji, na początku testów lub w innym przypadku), możesz spróbować dołączyć do nich.
Przepisz to ...:
for(unsigned int i = 0; i < max; i++)
r = do_stuff(i);
// Need to do something else
do_something_else(r);
...do tego:
for(unsigned int i = 0; i < max; i++)
r = do_stuff(i);
do_something_else(r); // Need to do something else
Więc kiedy scalisz Mod 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
... z 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 wywoła konflikt, a ty zmusisz cię do obejrzenia go.