2011-11-30 13 views
5

Nadal nie mam potwierdzonego sposobu na odtworzenie tego, ale w przypadku, gdy jest to znany problem, spytaj o to w każdym razie. Co się dzieje, że git często tworzy konflikty tak:Dlaczego git czasami oznacza dodane linie jako zmienione linie (np. Pusty konflikt nad dodanym fragmentem kodu)

<<<<<<< HEAD 
    } // action_do_add 
======= 
    } // action_do_add 
...lots of code here... 
>>>>>>> some_branch 

Zamiast więc zauważyć, że po prostu dodał nowy kawałek kodu, git uważa, że ​​zmodyfikowane całą linię zamiast. Czasami dzieje się to w środku pliku, ale najczęściej - na końcu pliku. Domyślam się, że może to mieć coś wspólnego ze znakami końca linii, ale muszę jeszcze przeprowadzić testy, aby to potwierdzić. Czy ktoś miał ten sam problem, a jeśli tak, jak to naprawić?

+0

prawdopodobnie, tylko różnice kosmiczne? –

+0

Sprawdziłem to i wygląda na to, że tak nie jest. Obie linie mają taką samą liczbę spacji, więc nie jest tak, że istnieje pewna ukryta przestrzeń na końcu jednej linii. – Eugene

+0

Różne zakończenia linii? Czy te linie wyglądają na równe w edytorze szesnastkowym? – Rudi

Odpowiedz

5

Podczas łączenia git sprawdza różnice w kontekście do otaczających linii. Rozważmy następujący kod:

def a 
    do_something_a 
end 

def b 
    do_something_b 
end 

def c 
    do_something_c 
end 

Kiedy jeden oddział zmienia coś w sposobie a (lub usuwa go), a drugi oddział zmienia coś w sposobie c (lub usuwa go), wciąż masz kontekst metody b zarówno dla dyferencjału . Dlatego zmiany prawdopodobnie scalą się bez konfliktów.

Jednakże, jeśli masz coś takiego:

def a 
    do_something_a 
end 

def c 
    do_something_c 
end 

najprawdopodobniej skończy się konfliktów podczas edycji jednej metody w jednym oddziale, a drugi w innym oddziale, ponieważ złamał odpowiedni kontekst diff w drugim oddziale.

To także dlatego, że zdarza się częściej na końcu pliku - ponieważ istnieje tylko kontekst powyżej dla porównania, ale żaden poniżej niego.