Как совершить долгое Git-слияние в процессе разрешения конфликтов - PullRequest
11 голосов
/ 14 февраля 2011

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

1 Ответ

13 голосов
/ 15 февраля 2011

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

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

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

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

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

...