Оновлення гілок Git від майстра


675

Я новачок у Git, і зараз я в цій ситуації:

  • У мене є чотири гілки (master, b1, b2, b3).
  • Після того, як я працював над b1-b3, я зрозумів, що я маю щось змінити на магістралі філії, що має бути у всіх інших галузях.
  • Я змінив те, що мені потрібно, masterі ... ось моя проблема:

Як оновити всі інші гілки masterкодом філії?


3
Тут я знайшов свою відповідь: Як ви з’єднуєте селективні файли з git-merge?
wjandrea

58
Ще одне просте завдання, ускладнене Git. Розробники Git повинні використовувати переповнення стека як зворотній зв'язок у своєму циклі SDLC. 300 000 людей повинні вказувати на те, що в процесі роботи Git серйозно не так. Їм потрібно найняти експерта з UX, оскільки вони явно не можуть це зрозуміти самостійно.
jww

Відповіді:


620

У вас є два варіанти:

Перший - це злиття, але це створює додатковий комітет для злиття.

Оформити кожну гілку:

git checkout b1

Потім об'єднайте:

git merge origin/master

Потім натисніть:

git push origin b1

Крім того, ви можете зробити ребауз:

git fetch
git rebase origin/master

15
Мене хвилює такий підхід. Коли я запускаю git log --graph, графік показує, що майстер насправді об'єднується з галуззю теми. Чи це спричинить якісь проблеми в довгостроковій перспективі? Я вважав, що найкраща практика - це завжди об'єднати тему гілки назад до основної. Будь ласка, прокоментуйте.
Патрік

2
Зверніть увагу на цю проблему , якщо ви збираєтеся з робочим процесом злиття: randyfay.com/node/89
Hampus Ahlgren

22
Ви об'єднуєте майстра в b1. Чому ти got push origin master... не має сенсу. Ви не змінюєте головну галузь. Я думаю, що це помилка з 119 upvote: /
Ів Ланге

22
Не використовуйте метод злиття, використовуючи git rebase masterправильну відповідь
Weston Ganger

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

495

У вас є два варіанти:

  1. Ви зливаєтесь. Це насправді досить проста та ідеально локальна операція:

    git checkout b1
    git merge master
    # repeat for b2 and b3
    

    Це залишає історію саме так, як це сталося: Ви відключили від майстра, ви внесли зміни до всіх гілок, і, нарешті, ви включили зміни з головного в усі три гілки.

    gitможе вирішити цю ситуацію справді добре, вона розроблена для злиття, що відбувається в усіх напрямках, одночасно. Ви можете довіряти, що зможете правильно зібрати всі нитки. Просто не байдуже, чи b1об'єднує гілка master, чи masterзливається b1, комірка злиття виглядає все одно, що git. Різниця полягає лише в тому, яка галузь в кінцевому підсумку вказує на цей об'єкт об'єднання.

  2. Ви переобладнаєте. Люди з SVN або подібним фоном вважають це більш інтуїтивно зрозумілим. Команди є аналогом випадку злиття:

    git checkout b1
    git rebase master
    # repeat for b2 and b3
    

    Людям подобається такий підхід, оскільки він зберігає лінійну історію у всіх галузях. Однак ця лінійна історія - брехня, і ви повинні знати, що вона є. Розглянемо цей графік фіксації:

    A --- B --- C --- D <-- master
     \
      \-- E --- F --- G <-- b1
    

    Об'єднання призводить до справжньої історії:

    A --- B --- C --- D <-- master
     \                 \
      \-- E --- F --- G +-- H <-- b1
    

    Однак, база даних дає вам цю історію:

    A --- B --- C --- D <-- master
                       \
                        \-- E' --- F' --- G' <-- b1
    

    Справа в тому, що вчинення E', F'і G'ніколи справді не існувало і, ймовірно, ніколи не було перевірено. Вони можуть навіть не складати. Насправді досить просто створити безглузді комітети за допомогою ребайду, особливо коли зміни masterважливі для розвитку в Росії b1.

    Наслідком цього може бути, що ви не можете визначити , який із трьох коммітов E, Fі Gфактично ввів регресію, зменшуючи значення git bisect.

    Я не кажу, що ви не повинні використовувати git rebase. Він має свої напрямки. Але щоразу, коли ви цим користуєтеся, вам потрібно знати про те, що ви брешите про історію. І вам слід принаймні скласти тест на нові коміти.


Я зливалася інше джерело гілки (не мастак) і додаткові кроки , щоб додати до цього хорошого відповіді був , щоб оновити його на моєму локальному репо до злиття (мати останню версію коди локально) git checkout <source branch> git pull. Тоді продовжуючи вище: git checkout b1...
Род

3
Як давній користувач SVN, я віддаю перевагу варіанту злиття перед базою даних: використовуючи будь-який контроль версій, дуже важливо вести точні записи про внесені вами зміни та чому. Я бачу заклик ребазування для спрощення уявної історії, але вам слід повернутися назад і додати до коментарів коментарів E ', F', G '- і бажано, щоб оновлення автоматично додалося до цих коментарів. В іншому випадку, якщо процес складання / тестування / тестування розгортається на G ', вам доведеться з’ясувати, чому зміни були внесені без повної інформації.
WillC

13
Історія - брехня
piratemurray

Дякую, я використовую "git merge any-branch-name" для об'єднання одного коду філії з іншою гілкою. Місцево я можу перевірити код відділення 1, поки я перебуваю на гілці 2
Пріті

1
@blamb Конфлікти злиття трапляються з обома git mergeта git rebase. Цього не уникнути. git rebaseмає перевагу в тому, що ви можете приховати кілька етапів перезавантаження (тобто перезавантаження однієї гілки на кілька різних комісій послідовно, щоб зменшити кількість конфліктів на кожному етапі). Тим не менш, сам факт, що в основі даних лежить базова історія, набагато легше трахатись на такій багатоступеневій базі даних ... Тому я завжди віддаю перевагу злиття, навіть коли це означає, що мені потрібно захаращувати історію кількома комісіями злиття. .
cmaster - відновити

238

git rebase masterце правильний спосіб зробити це. Об'єднання означало б, що для злиття буде створено зобов’язання, а звільнення не буде.


52
Що робити, коли ви вже натиснули на початковий код, якщо ви перезавантажуєтесь, ви будете переписувати історію фіксації, і це суперечить вашому віддаленому відділенню. Я думаю, що ребауз слід використовувати лише на витягуванні або тоді, коли ви не натиснули на віддалену гілку.
Метт Сміт

6
Якщо ви єдиний, хто працює на віддаленій гілці, ви можете скористатися функцією git push --force для поновлення віддаленої гілки з перезавантаженою локальною гілкою. stackoverflow.com/questions/8939977 / ...
stormwild

7
перезавантажити та об'єднати обидві роботи, ребазація найкраща для приватних відділень, оскільки вона дає більш чистий графік історії. ця відповідь найкраща
Junchen Liu

5
Необхідно чіткіше пояснювати компроміс між чіткістю (чудово для однокористувача чи малокомандної команди) або безладною правдою (для галузей коду, що надає багато користувачів - необхідна для ремонту (на мій досвід - YMMV)).
WillC


53

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

git checkout master
git pull
git checkout local_branch_name
git rebase master
git push --force # force required if you've already pushed

Примітки:

  • Не поновлюйте гілки, на яких ви співпрацювали з іншими.
  • Вам слід перезавантажити гілку, до якої ви будете зливатися, що може не завжди бути головним.

На веб- сторінці http://git-scm.com/book/ch3-6.html є розділ про повторну публікацію та багато інших ресурсів там в Інтернеті.


Дякую за просте рішення
інший хлопець

18

@cmaster зробив найкращу детальну відповідь. Коротко:

git checkout master #
git pull # update local master from remote master
git checkout <your_branch>
git merge master # solve merge conflicts if you have`

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


13

Оновити інші гілки, як-от (резервне копіювання) за допомогою вашої головної копії гілки. Ви можете слідувати будь-яким способом (перезавантажити або об'єднати) ...

  1. Зробіть ребайт (зайвих комісій не буде зроблено до гілки резервного копіювання).
  2. Об’єднайте гілки (автоматично буде здійснено додатковий фіксацію до гілки резервного копіювання).

    Примітка: Побаза даних - це не що інше, як встановлення нової бази (нова копія)

git checkout backup
git merge master
git push

(Повторіть для інших гілок, якщо такі є, наприклад, backup2 і т. Д.,)

git checkout backup
git rebase master
git push

(Повторіть для інших гілок, якщо такі є, наприклад, backup2 і т. Д.,)



1

Існує два варіанти цієї проблеми.

1) git rebase

2) git merge

Тільки відмінність від вищезгаданих обох у випадку злиття, матиме додаткові комісії в історії

1) гілка каси git (b1, b2, b3)

2) походження / master git rebase (у випадку вирішення конфліктів на локальному рівні, виконуючи git rebase - продовжуйте)

3) git push

Як варіант, варіант злиття git - аналогічний спосіб

1) git checkout "your_branch" (b1, b2, b3)

2) майстер злиття git

3) git push


0

щоб оновити свою гілку від головного:

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