Как сохранить ветку Git в синхронизации с мастером

276

В тот момент, когда Git делает мою голову, я не могу найти лучшее решение для следующего.

Есть две ветви, одна называется master, а другая называется mobiledevicesupport . Я хочу сохранить мобильную поддержку устройств как непрерывную ветвь, которая будет объединена / синхронизирована с главной веткой всякий раз, когда мобильная поддержка устройств стабильна. Это объединит изменения из поддержки мобильных устройств в мастер, но также перенесет все изменения из мастера в поддержку мобильных устройств, чтобы можно было продолжить работу над веткой и улучшить или дополнить функции. Это необходимо для работы с центральным хранилищем и несколькими разработчиками.

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

Спасибо, вся помощь очень ценится.

Обновление 1: если я должен был объединить мастер с поддержкой мобильных устройств и поддержку мобильных устройств с мастером, получу ли я реплицированные коммиты в обеих ветвях. Или git достаточно умен, чтобы понять, что я перенес последние изменения из ветви A в ветку B и добавил коммит слияния C в ветку B. И я вытащил последние изменения из ветви B в ветвь A и добавил коммит слияния D в ветку A?

Я собирался опубликовать изображение, но у меня не достаточно репутации для него, поэтому я думаю, что следующая иллюстрация будет делать. Две ветки непрерывно бегут, слияния часто идут в обоих направлениях. Главное, в чем я не уверен, так это то, как git будет проигрывать коммиты и будет ли он заполнять ветку коммитами из другой ветки при слиянии или останется чистым. Раньше я использовал rebase, но, похоже, он заканчивает ветку и помещает все коммиты в мастер, или я сделал это неправильно. Спасибо за помощь до сих пор.

master
A--B--C-----H--I--J--M--N
       \   /    \
mobile  \ /      \
D--E--F--G--------K--L
Г-н ЭЗЕКИЭЛЬ
источник
1
Если бы вы, как и я, искали, как это сделать с помощью клиента GitHub : help.github.com/articles/merging-branches
cregox
1
Этот вопрос спас мою жизнь на века; Спасибо за большое усилие, что нашли время, чтобы задать этот замечательный вопрос @Mr. EZEKIEL
DJphy
Если вы работаете над вилкой, вы должны следовать help.github.com/articles/syncing-a-fork
koppor

Ответы:

417

да просто сделай

git checkout master
git pull
git checkout mobiledevicesupport
git merge master

поддерживать мобильную поддержку устройств в синхронизации с мастером

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

git checkout master
git merge mobiledevicesupport
git push origin master

и это все.

здесь предполагается, что mobilexxx - это тематическая ветка с работой, которая еще не готова перейти в вашу основную ветку. Таким образом, только слиться с мастером, когда mobiledevicesupport находится в хорошем месте

concept47
источник
Это звучит разумно для меня, я думаю, я не уверен, насколько грязно это сделает историю коммитов, я обновлю свой вопрос примером того, что, я думаю, произойдет.
г-н ЭЗЕКИЕЛЬ
1
У вас будет довольно много «коммитных слияний», по сути, git пытается разрешить различия между вашими ветками. если вы беспокоитесь об этом, и вы единственный, кто использует ветку, тогда сделайте «мастер git rebase» вместо «мастер git merge» И НЕ НАДВИГАЙТЕ КОМИТЕТЫ В УДАЛЕННЫЙ ФИЛИАЛ. Если вы это сделаете, вы обнаружите, что делаете много принудительных толчков (git push --force) к origin / mobiledevicesupport, потому что вы собираетесь (вероятно) всегда посылать, будь то история коммитов, которые не соответствуют удаленная ветка имеет. более подробно здесь git-scm.com/book/en/Git-Branching-Rebasing
concept47
Я считаю, что это правильный ответ, он звучит именно так, как я хочу. Я добавил иллюстрацию выше, чтобы сделать ее немного более понятной, но если то, что вы говорите, верно, то это должно сработать именно так, как я хочу. Спасибо.
г-н ЭЗЕКИЭЛЬ
2
Прочитайте это, чтобы понять, почему это не особенно хороший совет: kentnguyen.com/development/visualized-git-practices-for-team/… . Это было написано сопровождающим Git, так что, вероятно, будет справедливо сказать, что он знает, о чем говорит в связи с этой конкретной темой.
Дэн Молдинг
2
Это запутает историю коммитов, смотрите мой ответ, сделайте это через rebase.
Gob00st
43

Всякий раз, когда вы хотите получить изменения от мастера в свою рабочую ветку, выполните a git rebase <remote>/master. Если есть какие-либо конфликты. разрешить их.

Когда ваша рабочая ветвь готова, перезагрузите ее, а затем выполните git push <remote> HEAD:master. Это обновит основную ветку удаленно (центральное хранилище).

euphoria83
источник
3
Какие плюсы / минусы в том, чтобы делать это так, как в принятом ответе?
Хампус Альгрен
33
Нормально, пока вы не проведете 5 часов в аду перебазировки
IcedDante
21
Это верно только в том случае, если ваша ветка находится в закрытом хранилище. Никогда не рекламируйте что-то, что было вытолкнуто вверх Вот почему: git-scm.com/book/en/v2/…
Kleag
3
Проблема с перебазированием, являющимся переписыванием истории, заключается в том, что SHA перебазированного коммита изменены, и поэтому вы не можете полагаться на вывод (например) git branch --contains <commit>.
17
13

Подход concept47 - верный способ сделать это, но я бы посоветовал объединить его с параметром --no-ff, чтобы сохранить историю ваших изменений.

git checkout develop
git pull --rebase
git checkout NewFeatureBranch
git merge --no-ff master
IwishIcanFLighT
источник
9

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

git checkout master
git pull origin master //Get all latest commits of master branch
git merge mobiledevicesupport

Точно так же вы можете также объединить мастер в поддержке мобильных устройств.

В. Если перекрестное слияние является проблемой или нет.

О. Ну, это зависит от коммитов, сделанных в ветке mobile * и master ветке с момента их последней синхронизации. Возьмите этот пример: после последней синхронизации с этими ветками происходят следующие коммиты

Master branch: A -> B -> C [where A,B,C are commits]
Mobile branch: D -> E

Теперь предположим, что commit B внес некоторые изменения в файл a.txt, а commit D также внес некоторые изменения в a.txt. Давайте посмотрим на влияние каждой операции слияния сейчас,

git checkout master //Switches to master branch
git pull // Get the commits you don't have. May be your fellow workers have made them.
git merge mobiledevicesupport // It will try to add D and E in master branch.

Теперь возможны два типа слияния

  1. Ускоренное слияние
  2. Истинное слияние (требует ручного усилия)

Git сначала попытается объединить FF, и если он обнаружит, что какие-либо конфликты не разрешаются с помощью git. Он не сможет объединиться и попросит вас объединить. В этом случае произойдет новый коммит, который отвечает за разрешение конфликтов в .txt.

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

sachinjain024
источник
1
Таким образом, слияние как это не проблема?
г-н Иезекииль
Перекрестное слияние - это то, что мы называем синхронизацией, и это не проблема, если фиксация в обеих ветвях не вызывает никаких конфликтов. Пожалуйста, смотрите мой обновленный ответ.
sachinjain024
3

Принятый ответ с помощью git merge выполнит работу, но оставит беспорядочную фиксацию, верный путь должен быть «перебазирован» с помощью следующих шагов (при условии, что вы хотите сохранить свою ветку Feature в sycn с Develop до того, как вы сделаете последний push перед PR ).

1 git fetchиз вашей ветки функций (убедитесь, что ветка функций, над которой вы работаете, обновлена ​​до даты)

2 git rebase origin/develop

3 если возникнет конфликт, разрешите их один за другим

4 используйте, как git rebase --continueтолько все конфликты разрешены

5 git push --force

Gob00st
источник
1
Это и трудно читать, и трудно понять. Пожалуйста, обновите свой ответ и используйте правильную разметку кода, чтобы отделить ваши комментарии от команд.
not2qubit
2

Вы думаете в правильном направлении. Объединяйте master с поддержкой mobiledevices постоянно и объединяйте поддержку mobiledevices с master, когда поддержка mobiledevices стабильна. Каждый разработчик будет иметь свою собственную ветку и может объединяться с поддержкой master или mobiledevices в зависимости от их роли.

Фейсал
источник