Почему git дает мне "конфликт удаленных слияний", когда обе стороны удаляются?
Я сливаю обновленную версию master
в мою ветку. В master был удален файл, который я тоже удалил. Git дает мне следующее:
Deleted merge conflict for 'Lib/SharedBL/WebServices/WebAPI/Admin/Admin.cs':
{local}: deleted
{remote}: deleted
Use (m)odified or (d)eleted file, or (a)bort?
Почему это конфликт? Обе стороны удалены, так что Git должен просто удалить его?
1 ответ
Во-первых, нам нужна небольшая справочная терминология. Когда ты бежишь git merge xyz
Git выделяет три коммита:
- Ваш текущий коммит:
HEAD
, "местный",--ours
, и так далее. Мне нравится называть это L для Левого или Местного. - Другой коммит: тот, который идентифицирован
xyz
: "удаленный", "другой",--theirs
, и так далее. Мне нравится называть это R для Right или Remote. - Третий коммит: первый коммит L и R. Это коммит базы слияния.
Git вычисляет diff из базы слияния в L, а второй diff из базы слияния в R. Два diff могут вносить различные изменения в файлы, которые существовали в базе слияния.
Если Lib/SharedBL/WebServices/WebAPI/Admin/Admin.cs
был файл в коммите слияния базы и удален в обеих главах, не будет никакого конфликта, и это не произойдет.
Однако если Lib/SharedBL/WebServices/WebAPI/Admin/Admin.cs
существовал в базе слияния и был переименован (и, возможно, также изменен) в одном коммите, но удален в другом коммите, возникнет конфликт переименования / удаления. В этом случае, git mergetool
не найдете Lib/SharedBL/WebServices/WebAPI/Admin/Admin.cs
в L или R.
Этот конкретный файл, другими словами, будет удален в рабочем дереве. Но... это должно быть? Стоит ли восстанавливать файл из базового коммита? git mergetool
Сценарий не знает. Он задает вам этот вопрос.
Обратите внимание, что если вы восстановите файл из базового коммита, у вас все равно будет переименованный файл. Вам решать, что с этим делать.