Автоматическое разрешение конфликта слияния - PullRequest
0 голосов
/ 04 апреля 2019

Я получаю конфликт слияния в index.js при запуске этого:

$ git checkout feature
$ git merge master

Ветвь feature index.js

const a = 1;
const b = 1;

Ветвь master index.js (Здесь родилась ветвь feature)

 const a = 1;

Ветвь master index.js (Текущее состояние)

 const a = 2;

Я хочу автоматически разрешить конфликт таким образом, чтобы ветка index.js на feature была обновлена ​​до:

const a = 2;
const b = 1;

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

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

git merge --strategy-option theirs или git merge --strategy-option ours

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

Разрешить конфликты слияний Git в пользу их изменений во время вытягивания

https://git -scm.com / docs / merge-strategies

1 голос
/ 04 апреля 2019

Я бы не советовал использовать -X ours или -X theirs (или их более длинные орфографические эквиваленты, --strategy-option ours и т. П.) Здесь.

Конфликт, который видит Git - помните, Git работает построчно - в том, что в base merge commit Git видит:

const a = 1;

В одном из двух коммитов tip tip (назовем это левой стороной или ours one) Git видит:

const a = 1;
const b = 1;

Это для Git выглядит так:

  • в строке a = 1 (что соответствует) add const b = 1;

Между тем, в другом коммите tip tip, theirs или справа, Git видит:

const a = 2;

Для Git это выглядит так:

  • в строке a = 1 удалить строку и вставить const a = 2; вместо

Обе инструкции "касаются" строки a=1, поэтому Git объявляет конфликт.

Если вы скажете Git отдать предпочтение «нашему» / левой стороне, Git сохранит инструкцию add b = 1 line и выбросит delete a = 1 и вставить строку замены инструкция. Если вы скажете Git отдать предпочтение «их» / правой стороне, Git сохранит инструкцию, которая заменит a=1 на a=2, но выбросит другую инструкцию.

В любом случае вы получите неправильное разрешение. Правильное разрешение - принять оба изменения , даже если они кажутся конфликтующими . У Git нет способа сделать это автоматически.

В этом случае мне нравится устанавливать merge.conflictStyle на diff3. Таким образом, когда Git оставляет беспорядочный конфликт слияния в моем рабочем дереве, файл выглядит так:

<<<<<<< HEAD
const int a = 1;
const int b = 1;
||||||| merged common ancestor
const int a = 1;
=======
const int a = 2;
>>>>>>> master

По умолчанию семь вертикальных полос и const int a = 1; базовых линий отсутствуют (а иногда оставшиеся линии сжимаются вместе еще больше). Это очень трудно читать. При стиле diff3 базовые линии там : вы можете увидеть, с чего все начали, и принять собственное решение, принять ли оба изменения, только одно изменение или какую-то третью альтернативу, которая лучше, чем любая из них. .

(см. Также http://psung.blogspot.com/2011/02/reducing-merge-headaches-git-meets.html)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...