Почему мерзавец не дает мне никаких конфликтов? - PullRequest
4 голосов
/ 15 мая 2019

Я обнаружил странную проблему. Я тестировал git-репо и обнаружил в этой ситуации.

Я создал простое git-репо и добавил текстовый файл со следующим содержимым.

Hello Git..!

First Line

Передано в качестве начального коммита.

Затем я создал ветвь с именем "abc" из этого коммита и изменил содержимое файла ниже.

(abc) -> филиал

Hello Git..!

First Line
Second Line

Совершенные. Затем я вернулся в свою основную ветку и изменил содержимое файла на следующее.

(мастер) -> филиал

Hi Git..!

First Line

Совершенные. Затем я попытался объединить ветку "abc" с веткой "master". Я думал, что это вызовет у меня конфликт, но он успешно слился через рекурсивно в ниже.

Hi Git..!

First Line
Second Line

Что не показывало никаких конфликтов? Иногда я пробовал несколько попыток, если между ними нет пустой строки,

Hello Git...!
First Line

тогда это показывает, что есть конфликт. Я не могу этого понять. Кто-нибудь, пожалуйста, помогите мне понять это.

Я искал столько, сколько мог, но не мог найти вопрос или ответ, чтобы решить мой вопрос.

Я загрузил пример репозитория в GitHub. Если кто-то клонирует его и попытается объединить, его можно воспроизвести.

https://github.com/Ranjith-Suranga/test-repo

Есть ли способ заставить GIT показывать конфликты? Я знаю, что это странный вопрос, никому не нужны конфликты, чтобы возникнуть. Но мне тоже не нравится, когда это происходит. Только представьте, это происходит с моим реальным кодом.

Обновление


Поскольку большинство комментариев и ответов предполагают, что не может быть никакого конфликта, подобного этому. Мне пришлось обновить этот ответ.

Хорошо, давайте повторим все эти шаги после удаления второй пустой строки.

Вот и мы,

  1. Я создал простое git-репо и добавил текстовый файл со следующим содержимым. На этот раз нет пустой строки между первой и второй строкой.
Hello Git..!
First Line

Передано как начальный коммит.

  1. Затем я создал другую ветку с именем "abc" из этого коммита и изменил содержимое файла ниже. (снова удаляя пустую строку)

(abc) -> филиал

Hello Git..!
First Line
Second Line

Совершенные.

  1. Затем я вернулся в свою основную ветку и изменил содержимое файла ниже.

(мастер) -> филиал

Hi Git..!
First Line

Совершенные.

  1. Затем я попытался объединить ветку "abc" с веткой "master". На этот раз мне скажут, что конфликт слияния .

Если вы мне не верите, вот пример репозитория github https://github.com/Ranjith-Suranga/test-repo2

Первый не дает никакого конфликта, второй почти такой же, за исключением той удаленной пустой строки, он дает конфликт. Но вопрос почему?

Ответы [ 5 ]

1 голос
/ 15 мая 2019

Обратите внимание, что все версии вашего файла содержат неполную последнюю строку. Когда вы добавляете еще одну строку, это означает, что вы не просто добавляете строку, но вы также удаляете неполную строку, а затем добавляете две строки.

Во второй попытке, когда вы объединяете две ветви, Git обнаруживает изменения в смежных блоках текста. Вопреки тому, что вы можете подумать, строка с текстом

First Line

на самом деле не остается неизменным, потому что последний разрыв строки, добавленный в одну ветвь, считается модификацией этой строки. Поскольку у вас есть изменения в соседних строках, приходящих из разных веток, Git сообщает о конфликте слияния.

В первой попытке над пустой строкой читается строка First Line. Эта линия действует как опорная точка, которая, так сказать, остается стабильной во время слияния. Это позволяет Git четко разделять изменения, поступающие из разных веток, в разные блоки текста. Поэтому Git может объединять изменения автоматически, без конфликтов.

0 голосов
/ 15 мая 2019

Git создает конфликты, когда разные пользователи помещают коммиты в репозиторий. Если вы используете одного и того же пользователя для создания конфликтов, они никогда не появятся.

0 голосов
/ 15 мая 2019

Что не показывало никаких конфликтов?

Возможно, потому что ваше изменение в ветке master было точно таким же, как и в ветке abc, до конца строки "Первая линия". Так что не было никаких противоречивых изменений. Если бы вместо этого вы изменили третью строку файла на «Третья строка» в одной из ветвей, то вы бы зафиксировали два разных изменения в одной строке, и возник бы конфликт. Но если изменения такие же , то проблем нет.

Я пытался с несколькими попытками иногда, если между ними нет пустой строки, как показано ниже ... тогда это показывает, что существует конфликт.

Конечно. Теперь вы изменили вторую строку в master на «Первая строка», а в третьей строке ничего нет, тогда как abc имеет коммиты, которые отличаются во второй и третьей строках. Какой из них git выбрать? Там нет никакого способа сказать, поэтому вы должны решить это. В предыдущем случае git не нужно выбирать между двумя вариантами, потому что они оба одинаковы.

Обновление:

На шаге 1 вашего обновления вы создали первоначальный коммит с файлом, содержащим:

Hello Git..!
First Line

Это в ветке master. Затем вы идете и создаете новую ветку abc, добавляя строку. И затем, на шаге 3, вы говорите, что извлекли master и изменили файл на

Hello Git..!
First Line

и совершил , что . Но это именно то, что должно было быть в master во-первых, поэтому не ясно, что изменит ваш коммит. Похоже, у вас есть еще один коммит в master, который изменяет файл, или, возможно, некоторые случайные символы пробела.

Суть в том, что git скажет вам, что существует конфликт слияния, когда он не может понять, что делать при объединении двух файлов. Когда это происходит, он помечает файл как * Индикаторы 1043 *, ===== и <<<<< и обе версии измененного региона, так что вы сможете точно увидеть, в чем заключается конфликт. Различные версии git могут даже вести себя по-разному с точки зрения того, что они могут или не могут решить автоматически, или почему.

Оглядываясь на исходный пример и на репозиторий Github, с которым вы связались, легко понять, почему нет конфликта: второй коммит в master и второй коммит в abc влияют на разные строки и вы можете увидеть это прямо в Github. Вот изменение коммита 549009d в master:

commit 549009d

Это явно заменяет строку 1 файла. Вот коммит 462394b в ветке abc:

commit 462394b

Как видите, это изменение не касается строки 1, а затрагивает только строку 3 (и добавляет строку 4). Таким образом, изменения совершенно различны, и git может применить их оба без какой-либо двусмысленности.

0 голосов
/ 15 мая 2019

Ответ в том, что вы изменили «First Line» в ветке abc, и git не может сопоставить его с «First Line» в главной ветви.Внесенное вами изменение состояло в том, что вы добавили символ новой строки в конце строки (показано здесь ).

Попробуйте еще раз, но с начальным README, который заканчивается символом новой строки.

0 голосов
/ 15 мая 2019

Насколько я знаю, в этом случае не произойдет конфликта слияния, потому что здесь нет конфликта, поэтому предположим, что у вас есть 4 строки и 2 ветви.

case 1: в первой ветви вы изменяете строку (1), во второй ветви вы изменяете строку (1) и строку (2), это не конфликт

case 2: в первой ветви вы изменяете строку (1), во второй - только строку (1) (вы изменяете точно такие же строки) это конфликт слияния .

Попробуйтеэто самостоятельно, и вы заметите разницу.

...