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