Слияние веток не создает конфликтов для разрешения

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

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

Вот что я пробовал до сих пор

git checkout develop; git merge feature
git checkout feature; git merge -s ours develop
git checkout feature; git merge -s recursive -X ours develop
git checkout develop; git merge -s recursive -X theirs feature
git checkout develop; git merge -s recursive -X theirs feature
git checkout feature; git merge -s resolve develop

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

git checkout feature; git rebase develop

Для некоторых файлов вызывается mergetool, но различия в одном файле не распознаются. Следует отметить, что этот файл был ранее объединен в разработку некоторое время назад. Файлы, которые были удалены при разработке, все еще присутствуют в функции, но с расширением «orig». Это самое близкое, что я когда-либо делал для синхронизации обеих ветвей, но ценой того, что я не могу легко найти, где эта функция больше разветвляется.

git checkout develop; git rebase feature

дает кучу вариантов удалить или сохранить файлы, а затем приводит к ошибке: file not found Continue merging other unresolved paths (y/n) ? y

Я еще не пробовал собирать вишни или осиротеть деревья. Возможно, решение кроется там?

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

Нужно ли мне выполнять слияние вручную каждый раз, когда я добавляю новую функцию? Кажется сложным сделать Git — как вызвать конфликт слияния и слияние вручную для выбранного файла

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

Где я ошибся? Как разрешить эту ситуацию (без ручного редактирования файлов)? И что мне делать по-другому в следующий раз?

P.S. Команды git reflog feature-name и git reset --hard feature-name@{n} бесценны для тех, кто плохо знаком с git и сталкивается с похожими проблемами при изучении использования преобразующих функций, таких как слияние и перебазирование. (всегда используйте --hard с особой осторожностью, так как он отбрасывает локальные изменения)

РЕДАКТИРОВАТЬ: Хотя я до сих пор не знаю, почему это произошло, VonC предложил хорошее временное решение.

Всем, кому интересно, как вы переходите из локальной ветки в новую локальную папку, посмотрите этот пост: https://stackoverflow.com/a/16493707/6419701

Я провел слияние с помощью превосходного инструмента объединения для Ubuntu с использованием синтаксис: meld folder1 folder2


person yosefrow    schedule 06.06.2016    source источник
comment
Вот еще 2 действительно полезные команды, которые я использовал во время экспериментов: git rebase --abort и git merge --abort.   -  person yosefrow    schedule 06.06.2016


Ответы (1)


В вашей нынешней ситуации я бы:

  • проверить ветку feature по новому пути на диске,
  • объединить две ветки (develop и feature) с помощью инструмента сравнения (kdiff3 или другого) вне git (т. е. без слияния git, просто какое-то старомодное сравнение/слияние папок) и очистить файлы .orig,
  • запишите слияние из develop в feature с git merge --ours develop.

Затем, просто для тестирования, я бы сделал одновременную модификацию одного и того же файла в двух ветвях и посмотрел, работает ли git merge develop, и применил бы шаг разрешения конфликта традиционного git merge.

person VonC    schedule 06.06.2016
comment
Хотя это хорошее решение в крайнем случае, ручное объединение файлов по одному — это то, чего я пытаюсь избежать. Я хотел бы иметь возможность использовать git в будущем и не менять все вручную. Я просто пытаюсь понять, почему ничего не работает. Моя теория прямо сейчас заключается в том, что файл, который не был включен в перебазирование, не был включен в него, потому что в него не было внесено никаких изменений после того, как он был разветвлен на функцию. Поскольку rebase воспроизводит модификации поверх базы. - person yosefrow; 06.06.2016
comment
@yosefh не тратьте больше время: ручное слияние + запись слияния равняются: вы начинаете все сначала. - person VonC; 06.06.2016
comment
VonC, я очень ценю ваши усилия, чтобы помочь мне. Но я пытаюсь понять, что я сделал не так, чтобы избежать этого в будущем, и пытаюсь исправить это, если это возможно. Вы абсолютно правы, хотя для получения результатов практическое решение - просто выполнить ручное слияние по одному файлу за раз. - person yosefrow; 06.06.2016
comment
@yosefh, моя цель состоит в том, чтобы вы начали с чистого состояния, а затем попробовали новое слияние, чтобы увидеть, сохраняются ли эти проблемы. (вместо того, чтобы пытаться разобраться в текущей ситуации) - person VonC; 06.06.2016
comment
Так что это была хорошая временная мера. Последующий тест слияния сработал, и, как ни странно, когда я провел тест слияния функции обратно в разработку, он внезапно понял, что все изменения, которые я добавил при ручном слиянии, произошли из функции и добавил их в дерево под именем ветки функции. Возможно ли, что я попал в эту ситуацию, потому что я недостаточно часто сливался с разработкой? - person yosefrow; 07.06.2016
comment
Да, это возможно: частое и регулярное слияние — лучшая практика. - person VonC; 07.06.2016