Как зафиксировать длинное Git слияние в середине разрешения конфликтов

У меня есть большое слияние с более чем 300 конфликтующими файлами. Я хочу разрешить их с помощью mergetool, но я не собираюсь закончить все это за один присест. Как я могу выполнить слияние, а затем вернуться позже и продолжить слияние? Обычно кажется, что git не позволяет вам совершать, если в индексе есть конфликты.

Ответ 1

Я предполагаю, что "не могу сделать это за один присест", вы на самом деле означаете "хотите сделать что-то еще до того, как я закончу" - так как вы могли бы просто оставить частично разрешенное слияние в вашем дереве работ в противном случае.

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

Все, что говорилось, если вы действительно хотите сохранить работу, которую вы сделали, чтобы частично разрешить слияние, мое лучшее предложение - использовать git rerere (REuse REcorded REsolutions).

Чтобы начать работу, убедитесь, что для параметра rerere.enabled установлено значение true - это будет охватывать большинство обычных случаев использования. Это приводит к тому, что git rerere автоматически запускается сразу после возникновения конфликтов слияния - в этот момент вы увидите сообщения формы Recorded preimage for '<path>'. Он также запускается автоматически, когда вы совершаете слияние; то вы увидите сообщения формы Recorded resolution for '<path>'.. Затем разрешения могут быть повторно использованы позже, когда появятся те же конфликтующие ханки.

Теперь, в вашем случае использования, произойдет первый автоматический триггер - прообразы будут записаны. Но вы не готовы выполнить слияние, поэтому после разрешения некоторых конфликтующих файлов и их маркировки (добавив их в индекс) вы можете напрямую запускать git rerere (без аргументов). Он будет записывать разрешения для всего, что вы отметили как разрешенные, но игнорировать все, что еще не разрешено. Затем вы можете просто уничтожить попытку слияния (git reset --merge), и в следующий раз, когда вы его попытаетесь, записанные разрешения будут повторно использованы!