РЕДАКТИРОВАТЬ : после написания ответа ниже я наткнулся на главу о патчах из Mercurial The Definition Guide .Это говорит более или менее то же самое, но гораздо более подробно, чем мой ответ.Он также предлагает способ (немного сложный на мой вкус, но в любом случае) использовать трехстороннее слияние с патчами, как искал OP.
Возможно, вы видите mq только как инструмент импорта патчей?Это не мое основное использование, и для меня qrefresh очень полезен.Типичный пример использования для меня - это когда я работаю поверх опубликованного репозитория.
Обычно я работаю с серией патчей, которые я пишу одновременно.Я начинаю с создания нового пустого патча.Когда я полагаю, что некоторая (часть) функция завершена, я qrefresh
верхний патч, чтобы включить в него все изменения, сделанные со времени создания патча (или последнего qrefresh
).Затем я создаю новый пустой патч и продолжаю писать код, относящийся к следующему патчу.
Если позднее, работая над другим патчем, я вижу некоторые изменения, которые должны быть внесены в предыдущий патч (потому что это логическипринадлежит к нему), я не делаю изменения в верхнем патче и не создаю новый патч.Сначала я qrefresh
текущий патч, затем qpop
к предыдущему патчу, к которому относятся изменения, затем внесу мои изменения.Когда это будет сделано, я qrefresh
снова вернусь к старому патчу, затем qpush
вернусь туда, где я работал, и т. Д.
Когда вы работаете таким образом, слияния обычно очень просты, и я почти не получаю отклоненийqpop
ing и qpush
ing вокруг.
Когда я верю, что моя полная серия патчей готова к публикации, я qfinish
всей серии и начинаю снова с новым пустым стеком патчей.
Можно сделать то же самое с rebase, но тогда вам понадобится такая функция, как git interactive rebase.
Весь смысл работы с патчами заключается в том, что патчи еще не зафиксированы, поэтому их легко изменить, и для этого вам потребуется qrefresh
.Ну, я мог бы достичь того же результата, создавая новые патчи и qfold
используя их, но на самом деле не было бы смысла делать это, просто две команды вместо одной.
Теперь, когда патчи являются внешними компонентами, какОсновным помощником в моем проекте являются вклады, предоставленные участниками, и они никогда не попадают непосредственно в хранилище.Сначала они попадают в мой основной стек патчей.Если они вносят изменения в те же части программы, над которой я работаю, они могут вызвать отклонения (и если так, то я вообще не вставляю их вообще, это может привести к хаосу).Если они применяются к какой-либо другой части программы, которая в настоящее время не изменяется, они в основном объединяются без каких-либо проблем и могут быть импортированы в любой точке стека исправлений, без необходимости вставлять их при определенной ревизии.Но я всегда читаю изменения, и довольно часто я немного изменяю внесенный код.Затем я снова использую qrefresh, чтобы обновить внешний патч так, как я полагаю.