Стратегия Git Merge - PullRequest
       4

Стратегия Git Merge

2 голосов
/ 24 августа 2011

У нас есть проект на Github с основной веткой разработки под названием "Master".Некоторые разработчики стремятся объединить ветки проекта в Master.И другие, как правило, объединяют Мастера в ветки проекта.

Мне кажется, что первый придерживается стандартного протокола.Последнее просто не имеет смысла.Я просто параноик, или это действительно имеет значение?

Чтобы соединить вещи, ветви проекта затем возвращаются в github с объединенной веткой Master

Для тех, кто объединяет Мастерв проект, аргумент в том, что они нуждаются в актуальной копии Master.Мой ответ;при чем тут слияние?Может быть, чтобы забрать изменения, которые были внесены другими и объединены в мастер?

Разве процесс не должен быть: 1) мастером проверки, 2) git fetch или git pull

Ответы [ 4 ]

3 голосов
/ 24 августа 2011

Для разработчиков имеет смысл время от времени объединять основную ветвь с веткой своего проекта, чтобы убедиться, что они не делают вещи, которые не будут работать после объединения. Обычно это происходит в их локальном хранилище.

Затем, когда они завершат работу с новой функцией, они объединят ее с master и нажмут, что добавит эту функцию в ветку master публичного репозитория. Или они просто помещают то, что находится в их ветви функций, в главную ветвь общедоступного репозитория.

A git fetch - это просто способ получить хранилище с какого-нибудь пульта. Это никогда не сделает слияние вообще. git pull будет делать то же самое, но также включает слияние.

Так что процесс, который вы предлагаете, в лучшем случае только объединит изменения в публичной мастер-ветке с локальной мастер-веткой. Затем разработчику все равно нужно будет объединить свою локальную (теперь обновленную) главную ветку с их веткой функций, иначе они не смогут выполнять проверки работоспособности, упомянутые выше.

2 голосов
/ 27 августа 2011

В отличие от @richardolsson, я бы не советовал объединять master в свои ветки тем, если под merge мы подразумеваем git merge master.

Это определенно хорошая идея, чтобы они брали обновления, которые произошли на master, и обновляли свои ветки тем, чтобы отразить эти изменения, чтобы избежать ужасного разрушения, но git предоставляет немного лучший инструмент для этого конкретного использования. кейс, git rebase.

Концептуально они очень похожи, и результат с точки зрения кодовой базы часто идентичен, однако использование rebase может сделать историю проекта намного более понятной для того, кто просматривает журналы, и поможет избежать гигантской истории. График, чтобы просмотреть, хотя они могут выглядеть довольно мило.

Когда вы merge, git получает статус двух (или более) объединяемых ветвей, пытается соединить их соответствующим образом и делает коммит, отражающий, что слияние произошло, если только заголовок целевой ветви не является прямой потомок объединяемой ветви, и в этом случае ему не нужно делать какие-либо изменения / патчи, а просто воспроизводить коммиты друг над другом (git вызывает эту быструю пересылку).

Когда вы rebase, git (концептуально) берет целевую ветвь, возвращается к последнему коммиту, который имеет общее с веткой, на которую он перебазирован, делает коммиты из этой ветки, а затем делает коммиты из целевая ветка. Пример может быть в порядке:

У вас есть две ветви, master, с коммитами A, B, C и D и topic, которые были разветвлены на B и имеют коммиты A, B, E и F. Если вы используете topic и git merge master, вы можете получить историю фиксации, которая будет выглядеть как A B E F G, где G - это фиксация, сделанная путем слияния. Если вы перебазируете, git сначала берет topic и делает свою историю фиксации такой же, как master, а затем делает коммиты в topic, так что вы получаете историю фиксации, которая выглядит как A B C D E F.

Одним из основных преимуществ этого, помимо ясности в истории журналов, является то, что до тех пор, пока в master не было изменений с тех пор, как вы выполнили ребазинг, git checkout master && git merge topic или подобное всегда будет ускоренной перемоткой вперед, так как вся история master содержится в topic. Большое предостережение заключается в not перебазировании веток, которые предназначены для общего доступа, потому что SHA-1 коммитов необходимо переписать, что в основном означает кучу бессмысленных конфликтов.

Мне понадобилось какое-то время, чтобы это вошло в мою голову. С тех пор я обнаружил, что (по крайней мере для меня и до сих пор ...) "лучший" рабочий процесс заключается в следующем:

  • перебазировать ветки тем
  • отслеживание слияния веток

Что-то вроде:

git checkout topic
git rebase master
# fix any conflicts, run tests, etc
git checkout master
git merge topic

Это дает очень ясную историю и в значительной степени гарантирует, что если произойдет поломка, это произойдет в ветке темы. Это также делает некоторые инструменты, такие как git bisect, немного проще в использовании, когда вам нужно их использовать.

Во всяком случае, надеюсь, что вы нашли этот слишком длинный ответ полезным.

1 голос
/ 24 августа 2011

Лучшим рабочим процессом будет то, что разработчики перебазируют свои ветки функций / проектов в основной ветке, чтобы избежать загромождения истории.

0 голосов
/ 24 августа 2011

Первое, что нужно понять, это то, что имена ветвей технически являются только локальными для любого данного репозитория.Центральный version-2.0 может быть моим master и вашим testing.При этом на практике люди обычно используют те же имена, что и репозиторий, к которому они чаще всего обращаются, поэтому стандартное объединение project в master, а затем добавление master.

Слияние master в project создаст это дерево:

master  A____B
project  \__C_\_D

При слиянии project в master будет получено это дерево:

master  A____B___D
project  \__C__/

Обратите внимание, что оба по существу идентичны, за исключениемимена филиалов в D меняются местами вместе с порядком их родителей.Если вы укажете git push origin project:master, если вы сделаете это первым способом, а затем обновите master, чтобы он указывал на D, прежде чем делать другую ветку, вы не заметите разницы на практике.Однако это создает дополнительные умственные усилия для вас, и вы можете все испортить, если каждый раз делаете это неправильно.Слияние project с master позволяет вам установить значения по умолчанию для push, что упрощает его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...