Как git rerere выясняет сходство между двумя конфликтами?

Хорошо, вот мой вопрос. Сравнивает ли "git rerere" хеши двух файлов, чтобы выяснить разрешение? То есть, скажем, у меня есть файл XML, который содержит этот тег:

<number>12</number>

Когда у меня возникает конфликт, это число обычно изменяется на 13, 14 и т. Д., Поэтому я застрял с:

<<<<<<<
<number>12</number>
=======
<number>13</number>
>>>>>>>

Может ли rerere автоматически разрешить этот конфликт, даже если цифры не такие, как в прошлый раз? Я всегда хочу, чтобы это разрешалось таким образом, чтобы оно занимало большее число (в примере выше, 13). Так что, если он записывает разрешение для чисел 12 и 13, разрешит ли он конфликт с другими числами? У меня есть подозрение, что это не так, но с таким же успехом могу спросить.

2 ответа

Решение

Может ли rerere автоматически разрешить этот конфликт, даже если цифры не такие, как в прошлый раз? Я всегда хочу, чтобы это разрешалось таким образом, чтобы оно занимало большее число (в примере выше, 13).

Нет, git rerere не могу этого сделать.

Когда вы используете git rerereВы просите его запомнить две вещи:

  • конкретный конфликт (то есть буквальный текст фрагментов, которые находятся в конфликте, и файлы, в которых они находятся); а также
  • резолюция, которая должна применяться к этому конфликту

Поскольку это литералы фрагментов (например, "заменить 12 на 13"), а не какую-то функцию преобразования (например, "заменить N на N + 1"), git не может сделать вывод, что вы хотите заменить каждое число более высоким.

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

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

Другой подход заключается в том, чтобы избежать git rerere в целом, и вместо этого напишите пользовательский драйвер слияния, который решит все за вас. Я делал это раньше, но это нетривиальный объем работы, и он требует от вас написания и тестирования некоторого кода. Если вам интересна эта стратегия, посмотрите ссылку в ответе Карла.

Vanilla Git не сравнивает файлы таким образом. Он выполняет строгое сравнение строк и ничего не знает о его семантике.

Однако взгляните на "Определение пользовательского драйвера слияния" на справочной странице gitattributes. Он позволяет вам написать собственную программу для разрешения определенных слияний любым способом, в том числе выбирая большее число.

Другие вопросы по тегам