Як зберегти гілку git синхронізовано з master


275

На даний момент git запускає голову, я не можу придумати найкращого рішення для наступного.

Є дві гілки, одна з яких називається майстер, а одна називається mobiledevicesпідтримка . Я хочу зберегти mobiledevicesupport як суцільну гілку, яка буде об'єднана / синхронізована з основною гілкою, коли mobiledevicesupport стабільний. Це дозволило б об'єднати зміни з мобільного пристрою підтримки в головний, але також внести всі зміни з головного в мобільний пристрої підтримки, щоб гілка могла продовжувати працювати, а функції покращувати чи доповнювати. Для цього потрібно працювати з центральним сховищем та кількома розробниками.

Наведіть приклад подібних робочих процесів, які використовують інші люди або просто скажіть мені, чи думка ця дурна, і я повинен розглянути інші варіанти. На даний момент робочий процес здається здоровим, але я просто не знаю, як я можу змусити Git працювати таким чином.

Дякую, всі допомагають дуже вдячні.

Оновлення 1: Якщо я мав би об'єднати master у підтримку mobiledevicesпідтримка та підтримка mobiledevice у master, чи отримуватиму тиражні коміти в обох відділеннях. Або git досить розумний, щоб розібратися, що я витягнув останні зміни з гілки A у гілку B і додав злиття C у гілку B. І я витягнув останні зміни з гілки B у гілку A і додаю комісію злиття D у гілку А?

Я збирався опублікувати зображення, але мені не вистачає репутації для нього, тому, мабуть, слід буде виконати наступну ілюстрацію. Дві гілки, що постійно працюють із злиттями, часто йдуть в обидва напрямки. Ключова річ, в якій я не впевнений, - це те, як git розіграє коміти та чи заповнить вона будь-яку гілку командами з іншої гілки при злитті чи чи залишиться вона чистою. Раніше я використовував ребауз, але, здається, закінчується гілка і передає всі комітети майстру, або я зробив це неправильно. Дякуємо за надану допомогу.

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. Єзекіїль
DJphy

Якщо ви працюєте на вилці, вам слід дотримуватися help.github.com/articles/syncing-a-fork
koppor

Відповіді:


416

так просто робити

git checkout master
git pull
git checkout mobiledevicesupport
git merge master

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

тоді, коли ви будете готові поставити mobiledevicesпідтримку в майстер, спочатку об'єднайтеся в master, як вище, потім ...

git checkout master
git merge mobiledevicesupport
git push origin master

і це все.

припущення тут полягає в тому, що mobilexxx - це тематична галузь, яка ще не готова перейти до вашої основної галузі. Тож зливайтеся в майстер лише тоді, коли мобільний пристрій підтримує в хорошому місці


Мені це здається розумним, я думаю, я не впевнений, наскільки брудно це зробить історію фіксації, я оновлю своє питання прикладом того, що я думаю, що станеться.
Пан ЕЗЕКІЕЛ

1
У вас буде досить багато "злиття комітетів", по суті, git намагається вирішити відмінності між вашими гілками. якщо ви переживаєте з цього питання, і ви єдиний, хто використовує гілку, тоді робіть "git rebase master" замість "git merge master" І НЕ ПІДТРИМАЙТЕ КОМІТЕТІВ ДО ВИДАЛЕНОГО РОБОТИ. Якщо у вас є, ви збираєтеся робити багато сильних натискань (git push --force) на походження / mobiledevicesпідтримка, тому що ви збираєтеся (ймовірно) завжди надсилати, будь то історія комітетів, які не відповідають тому, що віддалене відділення має. докладніше тут git-scm.com/book/en/Git-Branching-Rebasing
concept47

Я вважаю, що це правильна відповідь, це звучить точно так, як я хочу. Я додав ілюстрацію вище, щоб зробити її трохи більш зрозумілою, але якщо те, що ви говорите, є правдою, то це має вийти саме так, як я хочу. Дякую.
Містер ЕЗЕКІЕЛ

2
Прочитайте це, щоб зрозуміти, чому це не особливо гарна порада: kentnguyen.com/development/visualized-git-practices-for-team/… . Це написав керівник Git, тому, мабуть, справедливо сказати, що він знає, про що він говорить у цій конкретній темі.
Дан Ліплення

2
Це забруднить історію фіксації, дивіться мою відповідь, роблячи це через rebase.
Gob00st

43

Всякий раз , коли ви хочете , щоб отримати зміни від майстра у вашій робочої гілки, робити git rebase <remote>/master. Якщо є якісь конфлікти. вирішити їх.

Коли ваша галузь роботи буде готова, ще раз перезавантажте її та виконайте git push <remote> HEAD:master. Це оновить головну гілку на віддалений (центральний репо).


3
Які плюси / мінуси робити це таким чином, а не як у прийнятій відповіді?
Hampus Ahlgren

33
Здорово, поки ви не витратите 5 годин у пекло бази
IcedDante

21
Це справедливо лише в тому випадку, якщо ваша філія знаходиться у приватному сховищі. Ніколи не обновлюйте те, що було висунуто вище за течією. Ось чому: git-scm.com/book/en/v2/…
Kleag

3
Проблема з тим, щоб rebasing переписати історію, полягає в тому, що SHAs перезавантаженого комітету змінюються і, отже, ви не можете розраховувати на результат (наприклад) git branch --contains <commit>.
jnns

13

Підхід concept47 - це правильний спосіб зробити це, але я б радив об'єднатись з варіантом --no-ff, щоб зберегти історію ваших зобов’язань.

git checkout develop
git pull --rebase
git checkout NewFeatureBranch
git merge --no-ff master

9

Так, я згоден з вашим підходом. Для об'єднання мобільних пристроївпідтримка в майстер ви можете використовувати

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

Аналогічно ви також можете об'єднати майстер у мобільному пристрої підтримки.

Q. Якщо перехресне злиття є проблемою чи ні.

А. Ну, це залежить від доручень, зроблених у мобільній * гілці та головній гілці від останнього часу, коли вони були синхронізовані. Візьмемо цей приклад. Після останньої синхронізації з цими гілками трапляються наступні коміти

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

Тепер припустимо, що команда B внесла деякі зміни у файл a.txt, а команда 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. Це не дає змоги і просить вас злитися. У цьому випадку відбудеться новий коміт, який відповідає за вирішення конфліктів у a.txt.

Отже, лінія "Знизу" є крос-об'єднанням - це не проблема, і в кінцевому підсумку ви повинні це зробити, і саме це означає синхронізацію. Переконайтеся, що ви забруднили руки в об'єднанні гілок, перш ніж робити щось на виробництві.


1
Так перехресне злиття, як це, не є проблемою?
Містер ЕЗЕКІЕЛ

Поперечне злиття - це те, що ми говоримо як синхронізація, і це не проблема, якщо комітети в обох гілках не викликають конфліктів. Будь ласка, дивіться мою оновлену відповідь.
sachinjain024

3

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

1 git fetchіз вашої гілки функцій (переконайтесь, що галузь функцій, над якою ви працюєте, оновлена ​​на сьогодні)

2 git rebase origin/develop

3 якщо виникне якийсь конфлікт, вирішіть їх по черзі

4 використовуйте git rebase --continueпісля вирішення всіх конфліктів

5 git push --force


1
Це і важко читати, і важко зрозуміти. Будь ласка, оновіть свою відповідь і використовуйте належну розмітку коду, щоб відокремити свої коментарі від команд.
not2qubit

2

Ви думаєте в правильному напрямку. Постійно об’єднуйте майстер з мобільним пристроєм, підтримуйте мобільний пристрій і підтримуйте його, коли мобільний пристрій стабільний. Кожен розробник матиме власну філію і може зливатися на майстер або з мобільних пристроїв, що підтримуються, залежно від їх ролі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.