Git внести изменения в одну строку на нескольких ветках и сохранить все изменения - PullRequest
1 голос
/ 08 апреля 2020

В моем коде действительно длинная строка, содержащая идентификаторы для чего-либо. Вот пример строки

const IDs="0,1,2,3,4"

Я хочу добавить к этой строке несколько веток. Вот пример

Ветка 1:

const IDs="0,1,2,3,4,87"

Ветка 2:

const IDs="0,1,2,3,4,95"

В ветви 1 я добавил 87 в строку, а в ветви 2 I добавлено 95. Как только они будут объединены, возникнет конфликт слияния.

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

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

const IDs="0,1,2,3,4,87,95"

1 Ответ

3 голосов
/ 08 апреля 2020

Вы можете написать свой собственный драйвер слияния .

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

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

  • базовая копия слияния, являющаяся частью общего общего коммита;
  • --ours копия из ветки HEAD commit / current; и
  • копия --theirs из коммита, который вы объединяете.

Git извлечет все три копии во временные файлы и вызовет ваш драйвер слияния с именами эти временные файлы. Ваш драйвер слияния должен:

  • найти разницу от базового файла до ours и theirs копий, а
  • объединить эти различия, записав результат в ours copy.

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

То есть вам нужно продублировать работу, которую сделал бы стандартный драйвер низкого уровня. Ключевое отличие состоит в том, что если есть строка, которая изменяется в обоих, и это одна , которую вы можете разрешить с помощью компьютерной программы, то стандартный низкоуровневый драйвер может 't , вы можете go опередить и решить его.

Если вы не хотите переписывать все стандартные низкоуровневые драйверы снова, вы можете вызвать Git low -уровень слияния драйвера первым. Это доступно как отдельная команда, git merge-file. Он будет делать то же самое, что и встроенный низкоуровневый драйвер Git, и будет возвращать тот же вид состояния выхода. Затем вы можете проверить этот статус, и если он говорит о наличии конфликтов слияния, ваша программа может попытаться разрешить их. Если ваша программа выполнена успешно, ваша программа может сообщить об отсутствии статуса завершения.

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

...