Git - объединение "добавить" из двух веток

  1. я имею Branch1 а также Branch2и добавили файл с одинаковым именем в обе ветви. Сказать Branch1\folder\file.txt а также Branch2\folder\file.txt,
  2. Я сливаю Branch1 в Branch2 и получить ожидаемый конфликт слияния в файле.
  3. Я выбираю 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
Другие вопросы по тегам