Почему git не заметил этого встроенного изменения? - PullRequest
1 голос
/ 27 января 2012

Кажется, я столкнулся с ситуацией, когда git не замечает встроенных изменений при слиянии ..

В моей главной ветке был файл с такой строкой:

process &block if block

И я сделал выборку из git-репо и попытался объединить изменения из того же файла, который имел строку с:

process 1, &block if block

Но git не дал предупреждения о возможном конфликте слияния и не выделил строку как измененную [1]. Изменение было просто проигнорировано, не обновляя файл строкой [2].

Почему git не заметил это встроенное изменение? И обновил строку (поскольку строка была из более позднего коммита)?

EDIT:

[1] - git не указал, что он изменился, когда я занимался разрешением конфликта (вы знаете, он не вставлял «<<<» в исходном коде вокруг него). И последующий коммит слияния никак не показывает строку как измененную (ни при запуске gif diff с цветами, ни при просмотре кода на github). </p>

[2] - Линия была получена из репозитория, в котором содержалась более новая версия того же самого драгоценного камня, над которым я работал (поэтому должны быть некоторые общие предки коммитов, с которыми можно выполнить слияние. Кроме того, строка была обновлена ​​в позже сделайте коммит на том же репо, так что для git должно быть очевидно, что это действительно обновление).

EDIT:

В случае, если это играет роль, это было дерево коммитов до слияния:

Оригинальный камень (общее происхождение):

--A

Моя основная ветка (на самом деле это форк оригинального камня):

--A--  
     \  
      --B  

(линия не была изменена в B, но пришла из A)

Репо, слитый в мастер (обновленная версия драгоценного камня):

--A---C---D

(строка была обновлена ​​в D)

Ответы [ 2 ]

6 голосов
/ 27 января 2012

Слияние, мерзавец или иное (без ошибок или неполных реализаций) работает путем поиска последнего общего предка двух ветвей и затем объединяет изменения с этой точки.Это конфликт, только если обе стороны изменили линию (по-разному).Если только одна сторона изменила его, это изменение применяется.

В git вы можете увидеть изменения от базы слияния до заголовка ветви, который вы хотите объединить, используя git diff HEAD...branch, и изменения от базы слияния до вашей локальной головки, используяgit diff branch...HEAD (обычно git diff слева ... справа показывает изменения от общего предка слева и справа до право ).Команды предназначены для того, чтобы сделать слияние.После этого это будет git diff HEAD^..HEAD^2 и git diff HEAD^2..HEAD^ (HEAD^ - первый родитель, HEAD^2 - правый родитель).

Вы также можете увидеть все ревизии начиная с базы слияния, заменив git diff с gitk в вышеприведенных командах или просто спросите, для чего используется простая база git merge-base HEAD branch.

1 голос
/ 27 января 2012

Во время индекса слияния хранится 3 версии каждого файла.

$ git show :1:file.txt  # the file in a common ancestor of both branches  
$ git show :2:file.txt  # the version from HEAD.  
$ git show :3:file.txt  # the version from MERGE_HEAD.  

Подробнее о слиянии здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...