Автоматично разрешаване на git конфликти, където е възможно

Имаме файл с .NET решение с 50+ проекта в него и имаме ситуация, която се появява от време на време: двама души ще направят относително малка промяна (като актуализиране на пакет Nuget или преименуване на файл), която засяга всичките 50 проектни файлове.

Това означава, че всеки път, когато тези клонове бъдат обединени, всичките 50 от тези файлове ще бъдат в конфликт - но ако ги отворите в почти всеки инструмент за сливане, той ще може да ги разреши автоматично. Това означава, че няма реална работа за мен при сливането, но трябва да щракам върху всеки файл, да изчакам да се отвори в Beyond Compare, след това да щракна върху запазване и след това да щракна върху затваряне. Щракнете върху следващия файл, щракнете върху запазване, щракнете върху затваряне... повторете 55 пъти.

Въпросът ми е следният: има ли някакъв начин, по който мога да накарам Git, когато се сблъска с конфликтни файлове, да се опита да ги разреши автоматично с помощта на вашия инструмент за сливане?

Актуализация: Надяваме се, че това ще добави малко яснота: Трябва да разреша всеки конфликт един по един, но тъй като моят инструмент за сливане може да разреши всеки автоматично, няма ли някаква групова операция или опция за командата за сливане, която мога обадете се?


person Richiban    schedule 28.02.2014    source източник
comment
Тъй като проектните файлове са просто MSBuild файлове, обмисляли ли сте да използвате MSBuild Imports ?   -  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