LINUX.ORG.RU

[git] Ручное слияние

 


0

1

Мне нужно произвести слияние 2-х веток. При этом никого автоматического разрешения конфликтов быть не должно. т.е. мне нужно разрешить конфликты вручную в каждом файле. То что происходит по умолчанию мне не подходит. Здесь пишут что нужно отключить драйвер слияния. Расскажите по подробнее кто сталкивался.

добавил в my_repo/.gitattributes строчку: * merge=unset

эффекта нет

andreykyz ★★
() автор топика

При этом никого автоматического разрешения конфликтов быть не должно

т.е. мне нужно разрешить конфликты вручную в каждом файле.

Примерчик дашь, зачем такое может понадобиться?

baverman ★★★
()

Дык git в случае конфликтов оставляет пометки в файлах, чтобы ты вручную их исправил. Чем не подходит?

post-factum ★★★★★
()
Ответ на: комментарий от baverman

1) Старая реализация ряда классов из другой ветки оказалась лучше чем то что есть сейчас. Однако не все новые классы так плохи так что ряд из них трогать не надо. 2) Идет разработка 2-х вариантов одного и того же ПО в разных ветках. Нужно переместить часть функционала из одной ветки в другую. И только разработчику известно какую часть переместить а какую оставить.

andreykyz ★★
() автор топика
Ответ на: комментарий от andreykyz

Тогда проще всего их слить в автоматическом режиме, а потом накатить нужные изменения отдельными коммитами.

baverman ★★★
()
Ответ на: комментарий от post-factum

post-factum

Дык git в случае конфликтов оставляет пометки в файлах, чтобы ты вручную их исправил. Чем не подходит?

Дело в том что git по умолчанию пытается разрешать конфликты сам. И только если у него не получилось он создает что-то вроде diff файла. Для этого у него есть ряд алгоритмов которые можно выбрать. Я попробовал несколько в итог ни один не подошёл. git считает себя умнее и удаляет нахер много чего что удалять не надо.

«Вот тебе и пирожки.»

andreykyz ★★
() автор топика
Ответ на: комментарий от baverman

baverman

Тогда проще всего их слить в автоматическом режиме, а потом накатить нужные изменения отдельными коммитами.

Да я так уже делал, это очевидное решение. Но сравнивать каждый файл по отдельности муторно. В таком случае можно вообще не пользоваться git merge, а открыть 2 текстовый редактора и копировать из одного в другой.

andreykyz ★★
() автор топика
Ответ на: комментарий от andreykyz

Но сравнивать каждый файл по отдельности муторно.

Зачем? Ты же сказал, что тебе известны «хорошие» классы и функциональность. Их надо только скопипастить. В любом случае git diff никто не отменял.

baverman ★★★
()
Ответ на: комментарий от baverman

braveman

В любом случае git diff никто не отменял.

Можешь по подробнее. Пример например. Я имею в виду последовательность действий, чего-то не очень понял твою идею.

andreykyz ★★
() автор топика
Ответ на: комментарий от andreykyz
git checkout branch1
git merge branch2
git diff branch1^ > changes

Открываешь changes и сверяешь изменения, если чанк не устраивает, копипастишь из нужного места.

Это практически ничем не будет отличаться от маркеров конфликта.

baverman ★★★
()
Ответ на: комментарий от baverman

braveman

Открываешь changes и сверяешь изменения, если чанк не устраивает, копипастишь из нужного места.

хм, похоже подойдет и стрелочки на гитхабе будут. Попробую.

andreykyz ★★
() автор топика
Ответ на: комментарий от baverman

Хайа. Решил проблему так. Сначала смерил как получилось

git checkout branch1
git merge --no-ff branch2
Затем посмотрел изменения:
git diff branch1^ > changes
Отредактировал в текстовом редакторе, удалил лишние файлы, а затем выполнил:
git commit --amend
git push
В итоге коммит результата слияний содержит только то что нужно.

andreykyz ★★
() автор топика
Ответ на: комментарий от baverman

Внимание с

git commit --amend
не работает автоматическое удаление файлов. Нужно удалять через
git rm -r <dir>

andreykyz ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.