Оба rebase
(и cherry-pick
) и merge
имеют свои преимущества и недостатки. Я спорю merge
здесь, но стоит понять и то и другое. (Ищите здесь альтернативный, аргументированный ответ, перечисляющий случаи, когда rebase
это предпочтительнее.)
merge
предпочтительнее cherry-pick
и rebase
по нескольким причинам.
- Надёжность . Идентификатор SHA1 коммита идентифицирует его не только сам по себе, но и по отношению ко всем другим коммитам, которые ему предшествуют. Это дает вам гарантию того, что состояние хранилища в данном SHA1 одинаково для всех клонов. (Теоретически) нет никаких шансов, что кто-то сделал то же самое, что и похоже, но на самом деле испортил или похитил ваш репозиторий. Вы можете выбрать отдельные изменения, и они, вероятно, совпадают, но у вас нет гарантии. (В качестве незначительной вторичной проблемы новые выбранные вишневые коммиты займут дополнительное пространство, если кто-то еще выберет вишню в том же коммите снова, поскольку они оба будут присутствовать в истории, даже если ваши рабочие копии окажутся идентичными.)
- Простота использования . Люди склонны понимать
merge
рабочий процесс довольно легко. rebase
как правило, считается более продвинутым. Лучше понять и то, и другое, но людям, которые не хотят быть экспертами в области контроля версий (что, по моему опыту, включает в себя многих коллег, которые чертовски хороши в том, что они делают, но не хотят тратить дополнительное время), легче время просто сливается.
Даже с интенсивным рабочим процессом слияния rebase
и cherry-pick
все еще полезны для особых случаев:
- Одним из недостатков
merge
является загроможденная история. rebase
предотвращает рассеяние длинных серий коммитов в вашей истории, как если бы вы периодически сливались с изменениями других. Это на самом деле его основная цель, как я его использую. Что вы хотите быть очень осторожным, так это никогда не rebase
кодировать то, что вы делитесь с другими репозиториями. После того, как зафиксирован коммит, push
кто-то другой мог совершить его поверх него, и перебазирование в лучшем случае вызовет дублирование, обсуждавшееся выше. В худшем случае вы можете получить очень запутанный репозиторий и незначительные ошибки, на которые у вас уйдет много времени.
cherry-pick
полезен для отбора небольшого подмножества изменений из ветки тем, которые вы в основном решили отменить, но поняли, что есть пара полезных частей.
Что касается предпочтения слияния множества изменений над одним: это намного проще. Объединение отдельных наборов изменений может быть очень утомительным, если у вас их много. Разрешение слияния в git (и в Mercurial, и в Bazaar) очень и очень хорошее. Вы не столкнетесь с серьезными проблемами при слиянии даже длинных веток большую часть времени. Обычно я объединяю все сразу, и только если я получаю большое количество конфликтов, я делаю резервную копию и заново запускаю фрагмент слияния. Даже тогда я делаю это большими кусками. В качестве очень реального примера у меня был коллега, у которого были изменения за 3 месяца для слияния, и я получил около 9000 конфликтов в 250000 строк кода. Что мы сделали, чтобы это исправить, так это сделать слияние за месяц: конфликты не накапливаются линейно, а выполнение этого по частям приводит к далекоменее 9000 конфликтов. Это было все еще много работы, но не так много, как попытка сделать это по одному коммиту за раз.
По моему мнению, сбор вишни должен быть зарезервирован для редких ситуаций, когда это необходимо, например, если вы сделали какое-то исправление непосредственно в ветке 'master' (ствол, основная ветка разработки), а затем поняли, что его следует применять также к 'maint ». Вы должны основывать рабочий процесс либо на слиянии, либо на rebase (или "git pull --rebase").
Пожалуйста, помните, что выбранный или перебазированный коммит отличается с точки зрения Git (имеет другой идентификатор SHA-1), чем оригинал, поэтому он отличается от коммита в удаленном репозитории. (Обычно Rebase может справиться с этим, так как он проверяет идентификатор патча, т.е. изменения, а не идентификатор фиксации).
Также в git вы можете объединить много веток одновременно: так называемое объединение осьминога . Обратите внимание, что слияние осьминога должно быть успешным без конфликтов. Тем не менее это может быть полезно.
НТН.
источник
git blame
с исправлениями ошибок : найти коммит, который привел к ошибке, иgit branch --contains
определить, где объединить ветку. Более подробно описано в этом постеRebase и Cherry-pick - единственный способ сохранить чистую историю коммитов. Избегайте использования слияния и избегайте возникновения конфликта слияния. Если вы используете gerrit, установите один проект на Merge, если необходимо, и один проект в режиме cherry-pick и попробуйте сами.
источник