Как получить трехстороннее слияние в GIT при бесконфликтных слияниях? - PullRequest
4 голосов
/ 26 июня 2010

Как отключить автоматическое объединение в GIT ?

Цель состоит в том, чтобы иметь то же поведение, что и при разрешении слияний конфликтов при автоматических слияниях при вызове цепочки команд:

$ git fetch
$ git merge some_branch
$ git mergetool

Последняя команда приводит нас к трехстороннему объединению файлов в случае конфликтов объединения. Я хотел бы иметь простой способ выполнить такое же трехстороннее слияние файлов без конфликтных слияний.

Я не смог найти никакого решения в интернете, есть ли?

Я имею в виду некоторые обходные пути, но предпочел бы избежать этого.

Заранее спасибо,

Aleks

Ответы [ 2 ]

6 голосов
/ 26 июня 2010

Для изменений, которые были сделаны только с одной или другой стороны, вы можете предотвратить автоматическое слияние, отключив атрибут merge (см. gitattributes в разделе «Выполнение трехстороннего слияния»).Слияние, выполненное для пути, в котором отсутствует атрибут слияния (или для него задано значение «двоичный»), оставит версию из текущей ветви в рабочем дереве и оставит запись индекса для пути в конфликтующем состоянии.

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

#    repository/.git/info/attributes
# OR
#    .gitattributes
* -merge

Если с обеих сторон вносятся одинаковые изменения, даже эта конфигурация не вызовет конфликта.

5 голосов
/ 26 июня 2010

Хитрость в том, способ, которым git решает слияния :

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

Так что даже если вы определите драйвер слияния , он не будетвключите, если не возникнет какой-либо конфликт.


Первая попытка - определить атрибут объединения Unset

Unset

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

Вы должны написать в .gitattributes file

 * -merge

, и посмотреть, если этодостаточно для запуска mergetool на всех объединенных файлах.


Одна из причин, по которой эта функция "unset" не является опцией git merge, заключается в том, что:

  • объединение является основной функцией DVCS
  • объединение выполняется на уровне дерева (с учетом всего проекта)

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

...