Автоматически разрешать конфликты git там, где это возможно

У нас есть файл решения .NET с более чем 50 проектами в нем, и у нас часто возникает ситуация: два человека вносят относительно незначительные изменения (например, обновляют пакет Nuget или переименовывают файл), которые затрагивают все 50. файлы проекта.

Это означает, что каждый раз, когда эти ветки объединяются, все 50 из этих файлов будут конфликтовать, но если вы откроете их практически в любом инструменте слияния, он сможет разрешить их автоматически. Это означает, что мне не нужно выполнять слияние, но я должен щелкать каждый файл, ждать, пока он откроется в Beyond Compare, затем нажать «Сохранить», затем нажать «Закрыть». Щелкните следующий файл, щелкните "Сохранить", щелкните "Закрыть" ... повторите 55 раз.

У меня такой вопрос: есть ли способ заставить Git при столкновении с конфликтующими файлами попытаться разрешить их автоматически с помощью вашего инструмента слияния?

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


person Richiban    schedule 28.02.2014    source источник
comment
Поскольку файлы проекта - это просто файлы MSBuild, рассматривали ли вы возможность использования импорта MSBuild ?   -  person Dark Falcon    schedule 28.02.2014
comment
Я нашел это для вас blogs.atlassian.com/2013/05/   -  person abnvp    schedule 28.02.2014
comment
Спасибо за пост abhinav, но я тоже не это ищу. В их сообщении речь идет об автоматическом проведении слияний при нажатии, но я говорю об автоматическом разрешении конфликтов, где это возможно, при локальном слиянии.   -  person Richiban    schedule 28.02.2014
comment
@Richiban git действительно пытается автоматически объединить ваши файлы, поэтому было бы полезно узнать, почему это не удается и почему Beyond Compare может выполнить объединение. У вас есть настройка Beyond Compare для игнорирования пробелов? Замечают ли ваши товарищи по команде изменения пробелов? Они переключаются между окончаниями строк? Они не согласны с настройками для core.autocrlf = true?   -  person Edward Thomson    schedule 28.02.2014
comment
Спасибо @EdwardThomson, с тех пор я обнаружил, что после эксперимента с новым репозиторием Git, но я не знаю, почему этого не было сделано в этом случае ... Я думаю, что это должно быть объединено с некоторыми изменениями пробелов в вызвать конфликт, и хотя Beyond Compare не возражал против этого, Git назвал его конфликтом (вероятно, правильно).   -  person Richiban    schedule 03.03.2014


Ответы (3)


Ваш инструмент слияния Beyond Compare использует некоторую стратегию слияния для отображения различий и результатов рядом. Определите, какую стратегию слияния использует этот инструмент, а затем найдите эквивалентную стратегию в GIT. См. git help merge для получения информации о доступных стратегиях и их вариантах.

По умолчанию GIT использует «рекурсивную» стратегию. В качестве быстрой проверки вы можете использовать стратегию «решения» и посмотреть, получите ли вы желаемое решение.

git merge -s resolve ...

или, используя «рекурсивную» стратегию с одним или двумя вероятными вариантами, например:

git merge [-s recursive] -X ignore-all-space

После того, как вы определили желаемую стратегию, вы можете установить ее по умолчанию, используя переменные конфигурации или псевдоним команды.

person GoZoner    schedule 04.08.2016

Некоторое время назад у меня была такая же проблема. После многих поисков я нашел один и два решения.

Поместите это в $ HOME / .gitconfig:

[merge]
    ff = no
    commit = no

Для этого можно использовать git-config:

$ git config --global merge.commit no
$ git config --global merge.ff no

Теперь, когда вы будете объединять ветки, git автоматически объединяет код, используя «рекурсивную» стратегию.

$ git merge master
Auto-merging Dockerfile
hint: Waiting for your editor to close the file...
Merge branch 'master' into feature/ea-116
Merge made by the 'recursive' strategy.
 Dockerfile        | 63 +++++++++++----------------------------------------------------
 1 file changed, 129 insertions(+), 59 deletions(-)
...
person Serhii Popov    schedule 01.05.2019

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

git-mergetool

person Daniel    schedule 28.02.2014
comment
Извините, если я неправильно понял, но я не думаю, что вы читали мой вопрос. У меня уже настроен инструмент слияния, но мне приходится разрешать каждый конфликт один за другим, когда мой инструмент слияния может разрешать каждый из них автоматически. - person Richiban; 28.02.2014
comment
@Richiban Вы можете использовать git mergetool таким образом, чтобы он не запрашивал вас для каждого конфликта по ссылке: -y --no-prompt Don't prompt before each invocation of the merge resolution program. - person Daniel; 03.03.2014