"Git pull" або "git merge" між майстрами та галузями розвитку


243

У мене є своє masterвідділення та developвідділення для роботи над кількома змінами. Мені потрібно об'єднати зміни з masterв develop, але з часом все злилося з developусередині master. Маю на увазі два різні робочі процеси:

  1. git pull origin masterу developвідділення
  2. git merge masterу developвідділення

Який найкращий спосіб це зробити, і чому?


18
Рекомендовано прочитати: nvie.com/posts/a-successful-git-branching-model
Alex Brasetvik

2
git pull= git fetch+git merge FETCH_HEAD
Yousha Aleayoub

Відповіді:


104

Будьте обережні з базою даних. Якщо ви ділитесь своїм відділенням розвитку з ким-небудь, перезавантаження даних може зіпсувати справи. База даних корисна лише для ваших місцевих відділень.

Правило великого пальця, якщо ви натиснули гілку на початок, не використовуйте ребауз. Натомість використовуйте злиття.


Але чи безпечно проводити перезавантаження та git push origin rebasedBranch --forceприватне репо? Єдиний користувач - це я.
k0pernikus

Так, якщо ви єдиний користувач, звичайно, це безпечно. Я використовую git push --force весь час, коли я єдиний користувач. :)
Тайлер Рік

3
Я повторюю попередження Еріка. Хоча, цілком нормально також базувати власну віддалену гілку. Пограйте з обома базами та злиттями, і ви зрозумієте плюси і мінуси кожного та навчитесь їх використовувати.
Ян Лотинський

Хороша стаття про використання бази даних, навіть злиття після вирішення конфліктів: github.com/everpix/Everpix-Intelligence
Ian Lotinsky,

@IanLotinsky ваше посилання не вказує на статтю про перезавантаження. Longshot, але ви все ще маєте правильне посилання? :)
Даніель Серодіо

347

Цей робочий процес найкраще працює для мене:

git checkout -b develop

... внести деякі зміни ...

... майстер сповіщень оновлено ...

... вносити зміни для розвитку ...

git checkout master
git pull

... повернути ці зміни до розвитку ...

git checkout develop
git rebase master

... ще кілька змін ...

... зобов'язати їх розвивати ...

... об'єднайте їх у господаря ...

git checkout master
git pull
git merge develop

2
Так я працюю, і я вважаю, що це добре працює. Є ще одне, що я не роблю, і це git pullпрямо перед фіналом git merge develop. Яка мета цього?
crdx

Після того, як ... майстер сповіщень було оновлено ... частина, чи не розпорядниця каси стерть ваші локальні зміни, щоб вони не були розроблені, якщо ви не зробите їх?
a1an

1
@ a1an Ні, але якщо ви не зробите їх, зміни будуть перенесені на головну гілку і git не дозволить вам тягнути, поки вони не будуть вчинені.
elemjay19

5
@crdx Можливо, інші гілки об'єднуються у віддалений майстер, перш ніж ви з’єднаєте свою гілку з місцевим господарем. Ви витягуєте та вносите віддалені зміни основного ресурсу до локальної копії майстра. Це я так зрозумів.
Тарун

12
git pull --rebase origin masterу вашій галузі розвитку трохи швидше.
Натан Ліліенталь

24

Мабуть, найкращий підхід для такого роду речей git rebase. Це дозволяє перетягувати зміни від майстра до вашої галузі розвитку, але залишати всю роботу над розробкою "поверх" (пізніше в журналі реєстрації) речі від майстра. Коли ваша нова робота буде завершена, злиття назад до майстра стає дуже очевидним.


10
Гарна порада, якщо припустити, що developвона не ділиться ні з ким іншим.
Карл Білефельдт

1
@KarlBielefeldt Якщо develop поділитися з іншими учасниками, як би ми оновили, developколи деякі виправлення були натиснуті безпосередньо на master? Чи слід робити злиття, тобто git checkout master && git pull --rebase && git checkout develop && git merge master? Я залишив коментар до найвищої відповіді, проголосованої вище, яка також детально пояснює цю проблему.
modulitos

5

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

> git clone git://<remote_repo_path>/ <local_repo>
> cd <local_repo>
> git checkout -b develop
....do a lot of work on develop
....do all the commits
> git pull origin master
> git rebase master develop

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

> git checkout -b master
> git merge develop
> git branch -d develop

1

моє правило:

rebaseдля гілок з такою ж назвою , mergeінакше.

приклади же імена будуть master, origin/masterі otherRemote/master.

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

Якщо developце спільне використання, воно не повинно бути переобменене master, а лише об'єднатися назад у нього --no-ff. ви розвиваєтеся далі develop. masterі developмають різні імена, тому що ми хочемо, щоб вони були різними речами, і залишалися окремими. не змушуйте їх з собою rebase.

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