2016-04-13 3 views
0

Есть ли способ сказать «для всех оставшихся конфликтов слияния», выберите «наш» в качестве разрешения конфликта слияния? В моем случае «наш» также является удалением, а не редактированием.Массовое разрешение оставшихся конфликтов слияния как «наш» для удаленных файлов

Я использую расширения Git с небольшой работой в командной строке. Когда я делаю слияние, я прохожу через ряд сложных процессов, чтобы разрешить слияние. Для одного процесса всегда будет набор файлов, которые будут конфликтуют в слиянии, потому что на моей ветке я их удаляю.

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

Тогда, когда я уверен, что моя локальная файловая система верна, я пошел в Git Extensions и выбрал объединение на каждом скрещенном конфликтуемом файле и выбрал 'ours' (Deleted) ... один за другим .... (Git Extensions не позволяет многократно выбирать). Есть много файлов ... поэтому я ищу способ, которым я могу по существу сделать массив «Merge -> Ours» для всех оставшихся конфликтов слияния, как только закончу другие мои слияния.

+0

есть флаг --ours. проверьте http://gitready.com/advanced/2009/02/25/keep-either-file-in-merge-conflicts.html – pedrorijo91

+0

Правильно ... Поэтому я ищу сделать это навалом ... не за -file .... так как мне нужно сделать это примерно для 200 файлов для каждого слияния. –

ответ

0

Я не имею ни малейшего представления о том, как сделать это в GUI, но в командной строке:

git checkout HEAD -- path1 path2 path3 path4 ... 

(берет "наш" вариант) или:

git checkout MERGE_HEAD -- path1 path2 path3 path4 ... 

(принимает «их»).

Если «наша» версия является удаление (как в описании), просто:

git rm path1 path2 ... 

создать индекс с «разрешением, чтобы удалить файл».


Редактировать (после двух комментариев) добавить: git checkout --ours и git checkout --theirs также могут быть использованы вместо git checkout HEAD и git checkout MERGE_HEAD. Разница (есть одна) является тонкой: когда вы находитесь в середине конфликтного слияния, индекс содержит записи в промежуточных слотах 1, 2 и/или 3 для каждого path, для которого существует конфликт. Для неконфигурированных путей индекс имеет только запись с нулевым уровнем. Проверка с --ours или --theirs извлекает постановочных записи, в то время как проверка из HEAD или MERGE_HEAD извлекает файл из указанного фиксацией (точнее, из дерева, связанное с коммитом).

Стадия 1 - основание слияния, этап 2 - --ours, а этап 3 - --theirs. Если конфликт с модификациями, используются все три промежуточных слота. Если конфликт является удалением-vs-modify, используется промежуточный слот 1, но один из оставшихся слотов отсутствует. Если конфликт создается create-vs-create, слот 1 пуст, а слоты 2 и 3 заполняются.

Выполнение git rm или git checkout очищает игровые слоты конфликта и заполняет нормальную запись этапа-0 разрешенным результатом. Git разрешает окончательное слияние совершать только в том случае, если не осталось ни одного конфликтующего этапа (git ls-files --stage ничего не показывает, кроме этапа 0).

Одна из многих причин ненавидеть графические интерфейсы заключается в том, что они могут отказаться от повторной проверки индекса, думая, что знают, что лучше (и они никогда не делают). Если вы похожи на это, он может игнорировать все принятые вами CLI-решения и требует, чтобы каждое решение проходило через сам графический интерфейс.

+0

Я видел упоминание git checkout -ours и других методов, подобных вашим, но все они являются пред-слиянием (я считаю) ... тогда как я хочу еще выполнить слияние ... и после -факт (как раз перед совершением), я хочу «разрешить все оставшиеся конфликты с нашими (удалить в моем случае)». Я пробовал ваш ответ, и, похоже, это не так. –

+0

Все это должно быть сделано в середине слияния (после слияния с '--no-commit' или с конфликтом). Я сделал это (хотя, конечно, CLI), и он работает. Для случаев с измененными/удаленными конфликтами вы хотите «git rm», а не только «git rm --cached», так как дерево работы содержит версию файла с той стороны ('HEAD' или' MERGE_HEAD'). Если какой-то GUI не позволяет этого, GUI делает что-то неправильно (например, не перечитывая индекс по мере необходимости). – torek

Смежные вопросы