git - конфликт слияния, когда локальный удален, но файл существует на удаленном

116

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

После выполнения git-merge он показывает возникшие конфликты.

Используя git gui, он показывает, что локальный файл удален, а файл удаленной ветки имеет содержимое.

Как предотвратить конфликт этих файлов? Есть ли простой способ использовать git gui?

Большое спасибо

бинарные творения
источник
Раньше я делал одну вещь - оставил "удаленные" файлы в системе контроля версий, но исключил их из проекта / makefile / чего угодно. По крайней мере, это нормальный временный обходной путь для конфликтов слияния.
Марк Рушаков
2
Вы исправляете это так же, как исправляете любой конфликт слияния: добавляете желаемую версию (либо файл, либо отсутствие файла) в индекс, а затем фиксируете. Какой вы хотите?
Cascabel
@MarkRushakoff Я бы перефразировал ваш совет так: «когда я сталкиваюсь с ситуацией, когда мне нужно разрешить конфликт, я просто не разрешаю их по-настоящему, просто маскирую их, чтобы они кусали кого-то (возможно, не меня) в будущем». Это действительно хороший совет для тех, кто хотел бы внести в проект больше проблем.
Виктор Ярема

Ответы:

155

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

git rm path/to/file

Если файл действительно нужно отслеживать, добавьте его (версия в дереве работ будет версией из источника):

git add path/to/file

После выполнения любого из этих действий для разрешения конфликта зафиксируйте слияние.

Cascabel
источник
У меня было несколько файлов, все в одном каталоге и с одинаковым суффиксом. Есть ли ярлык, чтобы удалить их все сразу, сохранив при этом остальные файлы в каталоге?
chiborg
@chiborg: Это просто вопрос оболочки. cdв каталог и git rm *.ext. Ваша оболочка (не Git) расширяется *.extдо всех совпадающих имен файлов.
Cascabel
А если я хочу сохранить некоторые файлы? git rmне имеет -iфлага.
chiborg
@chiborg: Вы сказали, что хотите удалить все с заданным суффиксом, а все остальное оставить нетронутым. Это именно то, что я сказал вам, как делать. Или ты имел ввиду git rm *-suffix.ext? Такая же разница. Если у вас возникли проблемы с пониманием того, как использовать подстановочные знаки оболочки, спросите на unix.stackexchange.com. Если вы точно знаете, что то, что вы хотите, нельзя сделать с помощью подстановки, используйте rm -iи нажмите, git add -uчтобы выбрать удаления.
Cascabel
2
@Jefromi, если уточняю, -s recursive -X oursзачем еще надо git rmи git add?
Ноэль Яп
27

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

git diff ...origin/master -- path/to/file

Если это сценарий «удалено ими» , и вы хотите увидеть изменения, чтобы применить их в другом месте, вы можете использовать:

git diff origin/master... -- path/to/file
Джозеф Рэйвенвулф
источник
6
да! Это очень важно, если вы не хотите просто сдуть изменения, которые вы объединяете, например, когда я просто переименовал файл или его содержимое было перемещено до того, как файл был удален.
Эдвард Андерсон
8
Напоминаем: это не работает, когда конфликт возникает во время перебазирования . Нужно быть явным , какgit diff mybranch@{1}...origin/master -- path/to/file
nschum
@nschum Спасибо! Это именно то, что я искал.
Chuim
2
Вы также можете использовать git diff --base(см. Мой другой ответ).
Дориан Маршал
Привет, Джозеф, я все еще застрял, хотя этот ответ выглядит многообещающим. Если у вас есть минутка, я бы хотел, чтобы вы ответили здесь: stackoverflow.com/q/63044843/470749 Спасибо!
Райан
9

В графическом интерфейсе Git вы выбираете конфликтующий файл, а затем щелкаете правой кнопкой мыши в основной текстовой области, где отображается конфликтующий текст.

В появившемся контекстном меню вы можете выбрать «Удаленный» или «Локальный». Поэтому, если файл удален удаленно, вы можете выбрать «Удаленный», чтобы распространить удаление локально, и наоборот.

Мне потребовался месяц, чтобы понять это ... было бы хорошо, если бы у Git GUI действительно была документация ...

Джоэл Фриман
источник
4

Лучший ответ фокусируется на способе разрешения конфликта.

Перед этим вы, вероятно, захотите узнать, что пульт дистанционного управления изменил в локально удаленных файлах.

Для этого вы можете увидеть изменения с помощью:

git diff --base

Из https://git-scm.com/docs/git-diff#Documentation/git-diff.txt--1--base

Сравните рабочее дерево с «базовой» версией [...]. Указатель содержит эти этапы только для несвязанных записей, т.е. при разрешении конфликтов.

Дориан Маршал
источник
Вот хорошее объяснение git diff --base stackoverflow.com/a/60484874/470749
Райан
0

В EGit я тоже обнаружил проблемы. Мое решение было:

  • Использовал представление Git Staging.
  • Дважды щелкнул каждый файл, отображаемый при неустановленных изменениях, чтобы открыть компаратор.
  • Щелкните значок «Копировать все слева направо».
  • Сохранить файл (он исчезнет из неустановленного списка)
borjab
источник