Git - объединение "добавить" из двух веток
- я имею
Branch1
а такжеBranch2
и добавили файл с одинаковым именем в обе ветви. СказатьBranch1\folder\file.txt
а такжеBranch2\folder\file.txt
, - Я сливаю
Branch1
вBranch2
и получить ожидаемый конфликт слияния в файле. - Я выбираю
Branch1
версия файла, зафиксируйте и нажмите.
Когда я вижу историю файла в Branch2
Я вижу, что файл "добавлен", а не "изменен". Я ожидаю изменения, потому что файл уже присутствовал в Branch2
и был обновлен файлом из Branch1
но история Git не отражает это.
Это по замыслу? Есть ли другой способ достижения того же результата с правильной / желаемой историей?
1 ответ
Исходная информация
В отличие от большинства других систем контроля версий, git не отслеживает файлы, а отслеживает содержимое. Каждый коммит представляет собой большой снимок кода, что означает, что вы гарантированно получите именно то, что вы вставили, бит за битом. Данные файла, которые мы используем для организации и понимания моментального снимка, больше похожи на метаданные внутри модели git.
Когда вы сравниваете два коммита, даже если между ними 30 коммитов, git просматривает только два коммита, которые вы сравниваете. В результате ему нужен набор правил для интерпретации метаданных, когда он видит, что контент перемещается и изменяется.
Таким образом, он видит, что файл добавлен, удален, перемещен, изменен и т. Д., Он не читает журнал ваших действий, а сравнивает два снимка и интерпретирует разницу.
Ответить на ваш вопрос
Это сделано из-за того, что git рассматривает историю как сравнение двух снимков, а не серии сдержанных действий человека.
Вот схема сценария, который вы описали. (Стрелки указывают от ребенка к родителю)
Сравнивая каждую пару коммитов ниже, git будет интерпретировать file.txt как:
A > B : Added
A > C : Added
B > D : Modified
C > D : Unchanged
A > D : Added