конфликт мерзкого слияния из-за переименования в двух ветках - как исправить и избежать в будущем? - PullRequest
13 голосов
/ 01 сентября 2011

У меня есть две локальные ветви master и dev. Обе ветви содержали три папки:

projectBeta
project
project_v1

Я хотел просто сохранить projectBeta и удалить project и project_v1, а затем переименовать projectBeta в project. Так вот, что я делал отдельно в обеих ветках, совершая, как я пошел вместе. Все выглядело хорошо, пока я не попытался слить ветку dev с мастером, и я получил кучу ошибок такого рода:

CONFLICT (rename/delete): Rename projectBeta/test.c->project/test.c in dev and deleted in HEAD
CONFLICT (rename/delete): Rename project_v1/test.c->project/test.c in HEAD and deleted in dev

Похоже, что Git по-разному отслеживал переименования в разных ветках.

Если я сделаю git status, я получу

# On branch master
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   added by us:        project/test.c
#
no changes added to commit (use "git add" and/or "git commit -a")

Первое, что я не понимаю, почему статус просто говорит, что он «добавлен нами», когда в отчете о слиянии говорится, что он переименован и удален как нами, так и ими?

Во-вторых, я хочу использовать версию ветки dev для них test.c, но теперь, когда я пытаюсь

git co --theirs project/test.c

Я получаю

error: path 'project/test.c' does not have their version

... поэтому я не знаю, как гарантировать, что объединение будет использовать содержимое из ветви dev?

Наконец, есть ли лучший способ избежать такого беспорядка в будущем? По сути, изменение структуры папок независимо в ветвях, в которых содержимое не готово к первому слиянию ...

Ответы [ 2 ]

2 голосов
/ 03 сентября 2011

Что вам нужно, это git mv и git rm .

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

Что вы должны сделать, это:

git rm -r project
git rm -r project_v1
git mv projectBeta project
1 голос
/ 10 июня 2014

попробуйте

git pull

перейдите в папку для удаления проекта и project_v1, переименуйте projectBeta в проект.

git add --all
git commit 
git push

и вы делаете то же самое для другой ветки

...