И rebase
(и cherry-pick
), и merge
имеют свои преимущества и недостатки. Я спорю за merge
здесь, но стоит понять и то и другое. (Ищите здесь альтернативный, аргументированный ответ перечисление случаев, в которых rebase
является предпочтительным.)
merge
предпочтительнее, чем cherry-pick
и rebase
по нескольким причинам.
- Надёжность . Идентификатор SHA1 коммита идентифицирует его не только сам по себе, но и относительно всех других коммитов, которые ему предшествуют. Это дает вам гарантию того, что состояние хранилища в данном SHA1 одинаково для всех клонов. (Теоретически) нет никаких шансов, что кто-то сделал то же самое, что и похоже, но на самом деле испортил или похитил ваш репозиторий. Вы можете выбрать отдельные изменения, и они, вероятно, совпадают, но у вас нет гарантии. (В качестве второстепенной проблемы новые выбранные вишневые коммиты займут дополнительное пространство, если кто-то еще выберет вишню в том же коммите снова, поскольку они оба будут присутствовать в истории, даже если ваши рабочие копии окажутся идентичными.) 1020 *
- Удобство использования . Люди склонны понимать рабочий процесс
merge
довольно легко. rebase
считается более продвинутым. Лучше понять и то, и другое, но людям, которые не хотят быть экспертами в области контроля версий (что, по моему опыту, включает в себя многих коллег, которые чертовски хороши в том, что они делают, но не хотят тратить дополнительное время), легче время просто сливается.
Даже при интенсивном рабочем процессе rebase
и cherry-pick
по-прежнему полезны для особых случаев:
- Одним недостатком
merge
является загроможденная история. rebase
предотвращает разброс длинных серий коммитов в вашей истории, как если бы вы периодически сливались с изменениями других. Это на самом деле его основная цель, как я его использую. То, к чему вы хотите быть очень осторожным, это никогда не rebase
код, который вы поделились с другими репозиториями. Как только коммит будет push
ed, кто-то другой мог совершить его поверх него, и перебазирование в лучшем случае вызовет тот тип дублирования, который обсуждался выше. В худшем случае вы можете получить очень запутанный репозиторий и незначительные ошибки, на которые у вас уйдет много времени.
cherry-pick
полезен для отбора небольшого подмножества изменений из ветки тем, которые вы в основном решили отменить, но поняли, что есть пара полезных частей.
Что касается предпочтения слияния множества изменений над одним: это намного проще. Объединение отдельных наборов изменений может быть очень утомительным, если у вас их много. Разрешение слияния в git (и в Mercurial, и в Bazaar) очень и очень хорошее. Вы не столкнетесь с серьезными проблемами при слиянии даже длинных веток большую часть времени. Обычно я объединяю все сразу и только , если Я получаю большое количество конфликтов, резервирую ли я и заново запускаю фрагмент слияния. Даже тогда я делаю это большими кусками. В качестве очень реального примера у меня был коллега, у которого было 3 месяца изменений для слияния, и я получил около 9000 конфликтов в 250000 строк кода. Чтобы исправить это, мы выполняем слияние за месяц: конфликты не накапливаются линейно, а частичное создание результатов приводит к намного меньше, чем 9000 конфликтов. Это было все еще много работы, но не столько, сколько попытка сделать это по одному коммиту за раз.