Git считает, что изменения вступают в конфликт друг с другом, если они вносят различные изменения в одну и ту же исходную исходную строку или , если два изменения "касаются" по краям. Причина последнего заключается в том, что Git не знает, в каком порядке их поместить.
То есть предположим, что, начиная с того же пустого файла test.txt
, ваше изменение:
+Test 1
(то есть добавьте одну строку, читающую Test 1
) и его изменение:
+Test 2
+Hotfix
Git не знает, стоит ли ставить вашу строку первой, за которой следуют две его строки или две его строки, за которыми следует ваша строка.
Вы сказали, что он что-то изменил, хотя и "строку 3". Строка 3 отсутствует. Возможно, исходный предположительно пустой файл был на самом деле одной пустой строкой? Тогда ваше изменение будет:
-
+Test 1
То есть уберет пустую строку и вставит строку, читающую Test 1
. Его изменение теперь:
+Test 2
+Hotfix
(то есть оставьте пустую строку, но добавьте первую и третью строки). Это изменение вступает в конфликт, потому что вы изменили пустую строку, и он сохранил ее, или - если мы посмотрим на это немного по-другому - он добавил строку выше и ниже пустой строки, а вы изменили пустую строку. (Git не смотрит на измененные строки, а только на добавленные и / или удаленные строки, и это еще одна причина, почему изменения, которые примыкают - касаются краев вот так —Conflict.)
В любом случае, вы бы не получили конфликт слияния, если бы вы изменили линии, которые отличались или не «соприкасались» друг с другом. То есть предположим, что в исходном файле text.text
указано:
This test file
has several
lines in it.
Вы вносите изменение, добавляющее Test 1
в top . Он вносит изменения, которые добавляют Test 2
и Hotfix
внизу. Когда Git сравнивает версию файла, с которого вы оба начали - с его тремя строками - с вашей версией, с четырьмя строками, и с его версией, с пятью, Git видит, что ваше изменение вставить между «строкой 0» (верхняя часть файла) и строкой 1, а его изменение вставить после строки 3 перед «строкой 4» (нижней частью файла). Эти изменения не перекрывают , поэтому Git может применить оба изменения к исходному трехстрочному файлу и получить чтение из шести строк:
Test 1
This test file
has several
lines in it.
Test 2
Hotfix
Подумайте о объединить базу
Другой способ поместить все это: Git не добавляет свои изменения в вашу версию файла. Git также не добавляет ваши изменения в его версию файла. Git находит версию файла base merge .
Помните, что каждый коммит хранит полный, полный снимок каждого файла. Так что если Git может найти любой коммит, который у вас у обоих был до того, как вы начали работать, то какой бы файл мы ни задавали, Git имеет некоторую копию файла в этом коммите .
База слияния - это «лучший» коммит, с которого вы оба начали - тот, который ближе всего к тому, с чем вы оба закончили. Поскольку вы оба начали с одного и того же коммита, у вас обоих была одинаковая версия этого файла. Таким образом, Git может выполнять две операции git diff
. Кто-то находит, что вы изменили. Другой находит, что он изменился. Задача Git состоит в том, чтобы объединить два набора изменений и применить эти объединенные изменения к копии base .
Когда эти изменения влияют на разные строки и не примыкают, Git может комбинировать их самостоятельно. Когда они воздействуют на одни и те же строки или примыкают друг к другу, Git не может объединить их самостоятельно.