Git - тот же файл, добавленный обоими ветвями, вызывает странный конфликт слияния
В настоящее время у меня есть два ветки, над которыми я работаю. Из-за обновления программного обеспечения мне пришлось полностью изменить папку structre. Поэтому я перемещаю файлы в обеих ветвях. Теперь я достиг точки, в которой я хочу объединить свою рабочую ветвь в мою ведущую ветвь.
Проблема заключается в том, что существуют конфликты слияния, которые говорят мне, что файл был добавлен только одной ветвью (added by them
или added by us
). Проблема в том, что файл был добавлен ветками и.
Например, у меня есть текстура в textures/texture1.png
. Мастер-ветвь просто переместила его в нужное место (было до misc/textures/texture1.png
). Рабочая ветвь переместила его в одно и то же место и впоследствии отредактировала. Конфликт слияния для этого файла говорит:
added by us: textures/texture1.png
Дело в том, что это не файл, который я хочу! Я хочу файл из другого ветки!
Когда я делаю
git checkout --theirs textures/texture1.png
Я получаю
error: path 'textures/texture1.png' does not have their veresion
Но этот файл существует! Я добавил его недавно! И тот файл, который я хочу
Как разрешить эти конфликты?
(при необходимости больше информации!)
Ответы
Ответ 1
a--b--c--M--d--f--E--g--h--i <<< master
\
\
x--M'--y--z <<< you
Ваша ситуация выглядит примерно как выше (где M и M - перемещение коммитов, а E - фиксация, редактирующая текстуры)? вы пытаетесь объединить z/i и git, не очень счастливы.
вы можете попытаться объединить M с M 'на временной ветке
a--b--c---M--d--f--E--g--h--i <<< master
\ \
\ X <<< helper
\ /
x--M'--y--z <<< you
а затем с помощью слияния ( "X" ) с вами ( "z" ) и master ( "i" ).
a--b--c---M--d--f--E--g--h--i <<< master
\ \ \
\ X-----XX---------XXX <<< helper
\ / /
x--M'--y--z <<< you
таким образом конфликты разрешаются непосредственно после их создания и не переносятся. часто это легче, потому что конфликты со временем растут.
Ответ 2
Вы всегда можете попробовать
git mergetool
откроется графический интерфейс, в котором вы можете выбрать нужные изменения, просто нажав соответствующие ссылки. Иногда вам нужно делать ручные изменения. Но в вашем случае вам просто нужно выбрать файл.
Ответ 3
При разрешении конфликтов просто используйте git checkout
, указав правильный древовидный (имя ветки, тег, sha1 коммита...), откуда вы хотите получить файл:
git checkout theirBranchYouAreMerging -- textures/texture1.png
Если вам не нужны все "свои" изменения, вы можете частично отменить их. Для этого вам понадобится git reset -p
для выборочного удаления любого нежелательного изменения из индекса, а затем git checkout
, чтобы удалить их из рабочего каталога:
git checkout theirBranch -- some/file.txt
git reset -p -- some/file.txt
git checkout -- some/file.txt