Co stanowi konflikt merge w Git?

Jak git określa, że dana merge ma konflikt i czym jest konflikt?

Zgaduję, że wygląda to tak: jeśli dwa commity, które są połączone, mają wspólny commit rodzica i jeśli oba zmieniły linię X w stosunku do tego, co miał rodzic, jest to konflikt.

To, co komplikuje moje zrozumienie, to:

  • "Zmiana linii X" może oznaczać zastąpienie jej kilkoma nowymi liniami, a to nadal jest pokazane jako jeden konflikt (Wersja A ma tę jedną linię I Wersja B ma te 5 linii, czy cokolwiek)
  • jeśli wstawisz linie w jednym z commitów, głupszy algorytm pomyślałby, że wszystkie kolejne linie się zmieniły: linia 30 ma teraz poprzednią zawartość linii 25, 31 ma poprzednią zawartość linii 26, itd. Ale git może powiedzieć, że są takie same i nie wiem jak.

Czy ktoś może wyjaśnić jak to działa, albo wskazać mi link który działa?

Author: Nathan Long, 2011-02-07

3 answers

Zasadniczo, z git, każde scalenie jest konfliktem, który pozostawia Ci indeks, który zawiera trzy wersje KAŻDEGO pliku, wersje z każdej gałęzi i bazę. Na tym indeksie uruchamiane są różne resolvery, które mogą decydować dla każdego pliku, jak rozwiązać sprawę.

Pierwszy etap to trywialny resolver, który zajmuje się takimi sprawami jak niezmienione pliki, przypadki, w których jedna gałąź zmodyfikowała plik, a druga nie, lub w których obie gałęzie zawierają ta sama nowa wersja pliku.

Potem to wtyczki patrzą na pozostałe przypadki. Istnieje wtyczka, która obsługuje pliki tekstowe, identyfikując pojedyncze zmiany (jak diff) w jednej gałęzi i próbując zastosować je do drugiej gałęzi, wycofując się z umieszczania znaczników konfliktu, jeśli to nie zadziała. Możesz w tym momencie łatwo podłączyć własne narzędzie do scalania, na przykład możesz napisać narzędzie, które wie, jak scalać pliki XML bez naruszania dobrej formy, lub które daje graficzny interfejs użytkownika, który umożliwia interaktywną edycję i widok side-by-side (na przykład robi to kdiff3).

Tak więc prezentacja konfliktów jest naprawdę kwestią użytej wtyczki; domyślna wtyczka dla plików tekstowych będzie używać tego samego stylu co CVs, ponieważ ludzie i narzędzia są do tego przyzwyczajeni, a znaczniki konfliktu są znanym błędem składni w prawie każdym języku programowania.

 21
Author: Simon Richter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-07 12:35:38

Myślę, że algorytm scalania nie ma nic specjalnego w Git: jest to klasyczny 3-drożny algorytm scalania (nie kodową), która może być używana z kilkoma strategiami (domyślnie: recurse, or resolve lub octopus). Rezultatem jest dość prosty proces scalania, który jest opisany tutaj .
Wszelkie potrzeby wizualizacji są następnie delegowane do narzędzi merge/diff innych firm.

 7
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:55

Przejrzyj HOW CONFLICTS ARE PRESENTED akapit na tej Stronie .

LE: nie ma prawdziwej dokumentacji dla przypadków konfliktu, ani znaczników konfliktu plików, a ponieważ dostaję łomot w komentarzach tutaj, oto wskaźniki w kodzie źródłowym, które prowadzą gdzieś blisko do tego, jakie strategie stosuje git, aby osiągnąć stan konfliktu. Plik merge-recursive.c , wyszukaj "CONFLICT ciąg znaków. Dzięki temu możemy łatwo dowiedzieć się, że istnieje naprawdę garstka przypadków konfliktu like:

  • CONFLICT (rename/rename)
  • CONFLICT (content)
  • CONFLICT (rename/directory)
  • CONFLICT (rename/delete)
  • CONFLICT (rename/add)
  • CONFLICT (delete/modify)
  • ... ans so on

Jeśli pytasz mnie, tak, powinny być udokumentowane i wyraźnie wskazane, ale nie są tak nic do zrobienia, a następnie sprawdzić źródło.. ale ktoś naprawdę może się stąd podnieść i stworzyć ładną dokumentację, a następnie wysłać ją do projektu git.

@Wim Coenen tak, to też zależy od strategii scalania, ale to, jak konflikty są prezentowane, daje znacznie więcej wglądu. Wtedy możesz przeczytać strategie scalania też, jeśli mnie zapytać, ale nadal pozostają wątpliwości.

 3
Author: Shinnok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-07 12:35:27