Об'єднайте галузь розвитку з майстром


763

У мене дві гілки , а саме masterі developmentв GitHub Repository. Я весь свій розвиток роблю в галузі розвитку, як показано.

git branch development
git add *
git commit -m "My initial commit message"
git push -u origin development

Тепер я хочу об'єднати всі зміни на developmentгілці в master. Мій сучасний підхід:

git checkout master 
git merge development
git push -u origin master 

Будь ласка, дайте мені знати, чи правильна процедура, яку я дотримуюсь.


7
git pull -uвстановлює відстеження гілки за версією (або всі гілки, якщо натискає більше однієї). Після встановлення відстеження зберігається. Немає жодної причини використовувати його постійно.
Девід Калп

Відповіді:


1164

Я, як правило, люблю зливатися masterв developmentперший, щоб у разі виникнення конфліктів я міг вирішитись у самій developmentгілці, і мої masterзалишаються чистими.

(on branch development)$ git merge master
(resolve any merge conflicts if there are any)
git checkout master
git merge development (there won't be any conflicts now)

У двох підходах немає великої різниці, але я іноді помічав, що не хочу зливати гілку masterще після їх об'єднання або що ще потрібно зробити ще багато роботи, перш ніж їх можна об'єднати. , тому я, як правило, залишаю masterнедоторканим до остаточного матеріалу.

EDIT: З коментарів

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

git merge --no-ff development

71
У цьому підході є незначний недолік: фактичне злиття в master є, швидше за все, швидким злиттям вперед і тому не створює жодного вузла фіксації. Це не є проблемою з фактичним кодом на гілці, але важко з’ясувати пізніше, хто здійснив фактичне злиття для управління та в який час. Для --no-ffтого, щоб виправити це, потрібне явне злиття в master.
michas

11
Так, саме це і --no-ffє. :)
michas

19
Це git merge --no-ff developmentпросто для виправлення використання @ elect.
jewbix.cube

2
@sailesh чи можете ви оновити свою відповідь, щоб включити прапор git merge, якщо ви згодні з коментарями?
Веб-користувач

2
@Mars, злиття замінить файл, якщо стара зміна була прямим походженням комітету. Наприклад, нехай A->B->Cбуде майстром, і A->X->Yце твоя галузь розвитку. Якщо ви зміните частину файлу, в Xякому, можливо, виникли конфлікти зі зміною A, це не буде конфліктом, тому що Aє родоначальником X. Щодо втрачених змін, перегляньте stackoverflow.com/questions/7147680/…, щоб відновити будь-які зміни.
Sailesh

103

Особисто мій підхід схожий на ваш, з ще декількома гілками та певним стисканням комітетів, коли вони повертаються до майстра.

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

git fetch origin master

git merge master

git push origin development:master

Перший рядок гарантує, що у нього є будь-які зобов’язання, що надходять за течією, які були зроблені для освоєння з моменту останнього оновлення свого локального сховища.

Другий тягне ці зміни (якщо такі є) з головних у розробку

Третя підштовхує галузь розвитку (тепер повністю злита з майстром) аж до походження / майстра.

Можливо, його основний робочий процес трохи неправильний, але це головна суть цього.


Дякую! Це для мене має більш інтуїтивний сенс.
Джеймі Ніколл-Шеллі

2
Так - за 6+ років, як я написав це, я теж прийняв це, хоча з rebaseоновленням devгілки замість merge.
Девід Калп

32

Пояснення знизу для тих, хто прийшов сюди без будь-якого знання галузей.

Основна логіка розвитку ведучої гілки така: Ви працюєте лише над іншими гілками і використовуєте Master лише для об'єднання інших гілок.

Ви починаєте створювати нову гілку таким чином:

1) Клоніруйте сховище у вашому локальному реєстрі (або створіть нове сховище):

$ cd /var/www
$ git clone git@bitbucket.org:user_name/repository_name.git

2) Створіть нове відділення. Він буде містити останні файли вашого головного сховища філій

$ git branch new_branch

3) Змініть поточну гілку git на new_branch

$ git checkout new_branch

4) Робіть кодування, чинить, як завжди ...

$ git add .
$ git commit -m “Initial commit”
$ git push (pushes commits only to “new_branch”)

5) Коли робота буде завершена на цій гілці, об'єднайтесь з гілкою "master":

$ git merge master
$ git checkout master (goes to master branch)
$ git merge development (merges files in localhost. Master shouldn’t have any  commits ahead, otherwise there will be a need for pull and merging code by hands!)
$ git push (pushes all “new_branch” commits to both branches - “master” and “new_branch”)

Оновлення: настійно рекомендую використовувати GitKraken для цього, щоб побачити візуальне дерево змін та краще побачити всю логіку та зобов'язання.


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

якщо ви працюєте в іншій гілці, ніж майстер, будьте впевнені, що ви зробили і натиснули зміни на цю гілку. Тоді ви можете подивитися, як виглядають файли на графічному інтерфейсі github.com або bitbucket.com і спробувати натиснути Злиття там, на веб-сайті. Він повинен оновлювати все від вашої гілки до майстра. Якщо у майстра є новіші файли, це повинен бути конфлікт, і ви отримаєте повідомлення про помилку. Не впевнений, що я відповів досить добре, будь ласка, дайте мені повідомлення, якщо ні :)
Gediminas

Я використовую sourcetree як GUI та сховище github. Я спробував 2 рази з тестом на випуск. майстер ніколи не оновлювався останньою галуззю розробки.
Аміт Шах

спробуйте використовувати на веб-сайті live github.com файли своєї філії, над якою ви працюєте. Їх штовхають? Якщо так, спробуйте натиснути на ту саму гілку - Злиття, і ви побачите, що станеться. В моєму особистому досвіді з sourcetree дуже погано - я так і не зміг повністю зрозуміти, що відбувається в моїх гілках
Gediminas

Дякую @Gediminas за детальне пояснення. Я заплутався в ключових словах git, перш ніж читати вашу відповідь .. :)
Дінеш Сутар

21

Було б чудово, якщо ви можете використовувати робочий процес Git Flow . Це може легко злити розвинуту галузь до господаря.

Що ви хочете зробити, це просто дотримуватися інструкції git-flow, згаданої тут:

КРОКИ:

  • налаштування проекту git-flow
  • створити гілки і злити все, щоб розвиватися
  • запустити команду git flow release start <version_number>
  • то надайте змістовне повідомлення для випуску
  • запустити команду git flow release finish <version_number>
  • це злить усе в головне і змінить гілку на головну .
  • запустіть команду git pushдля публікації змін у віддаленому майстрі .

Для отримання додаткової інформації відвідайте сторінку - http://danielkummer.github.io/git-flow-cheatsheet/


1
Рішення, якщо хтось використовує git flow!
Csaba Toth

21
1. //pull the latest changes of current development branch if any        
git pull (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any
git pull

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master

9

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


6

Якщо ви перебуваєте на Mac або Ubuntu, перейдіть до робочої папки відділення. У терміналі

припустимо, harisdev - це назва гілки.

git checkout master

якщо є не відстежені або непослані файли, ви отримаєте помилку, і вам доведеться вчинити або видалити всі не відстежені або непослані файли.

git merge harisdev 

git push origin master

Остання остання команда для видалення гілки.

$ git branch -d harisdev

Що тут специфічно для Mac чи Ubuntu?
талонкс

Вибачте. Жодна з інших відповідей не згадувала, що команди повинні бути надані в Терміналі, а команда для видалення гілки. Насправді я просто хотів додати команду для видалення гілки, щоб розробник не возився з тією ж гілкою в майбутньому. Я використовую Mac, тому я це згадав. Ваше запитання дійсне, і жодна з цих команд не стосується Mac або Ubuntu.
Харіс Нп

Дякуємо за уточнення.
талонкс

5

Крок 1

Створіть і перейдіть до нової гілки "dev", де ваші локальні файли git синхронізовані з віддаленою, але "dev" гілка ще не існує.

git branch dev # create
git checkout dev # switch
# No need to git add or git commit, the current
# branch's files will be cloned to the new branch by-default.
git push --set-upstream origin dev # push the "dev" branch to the remote.

Крок 2

Внесіть зміни у гілку "dev" (поточну, якщо ви дотримуєтесь кроку 1), виконайте зміни та натисніть їх на віддалену гілку "dev".

git add .
git commit -S -m "my first commit to the dev branch" # remove the -S if you're not "secure", secure = when you already setup crypto private and public keys (i.e "verified" green sign in github)
git push -u origin dev # push the changes to the remote, -u origin dev is optional but good to use.

Крок 3

Об’єднайте свою гілку "dev" у "master".

git checkout dev # switch to "dev" branch if you're not already.
git merge master # optionally, this command is being used to resolve any conflicts if you pushed any changes to your "master" but "dev" doesn't have that commit.
git checkout master # switch to "master", which is the branch you want to be merged.
git merge --no-ff dev # merge the "dev" branch into the "master" one.

4

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

  1. Перевірте, чи розробляється в курсі останніх змін на віддаленому сервері за допомогою git fetch
  2. Після завершення вибору git checkout master.
  3. Переконайтеся, що головна гілка має останні оновлення шляхом виконання git pull
  4. Після завершення підготовки можна приступити до злиття git merge development
  5. Натисніть на зміни, git push -u origin masterі ви закінчите.

Докладніше про злиття git ви можете дізнатись у статті.


3

1) Під час розробки відділення перевіряйте стан git за допомогою наступної команди:

git status

Не повинно бути відпущеного коду. Якщо це так, натисніть свій код на відділенні розвитку:

git add *

git commit -m "My initial commit message"

git push origin Development

2) На гілці розвитку запустіть наступні дві команди:

git branch -f master HEAD

git push -f origin master

Це підштовхне ваш код філії розвитку до освоєння гілки.


Чи підштовхує це все, що розробники зобов'язуються також керувати, або просто додають нове єдине введення в master?
котиться

1
як це насправді працює? конкретно "майстер гілки гіта", коли ви знаходитесь у стадії розвитку, схоже на божевілля. як можна створити нову гілку під назвою master, якщо вже є гілка під назвою master? Документи говорять, що -f робить це: Скиньте <name_name> до <startpoint>. Що це означає?
Джон Літл

Чи не ця сила підштовхує місцевого господаря до віддаленого майстра? Це здається поганою ідеєю, якщо ви працюєте в команді.
Нік

-fне рекомендується.
Світанок

2

На основі @Sailesh та @DavidCulp:

(on branch development)
$ git fetch origin master
$ git merge FETCH_HEAD
(resolve any merge conflicts if there are any)
$ git checkout master
$ git merge --no-ff development (there won't be any conflicts now)

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

Другий виконає злиття та створить конфлікти, які ви зможете потім вирішити.

Зробивши це, ви можете нарешті перевірити майстра, щоб перейти до майстра.

Потім ви з’єднуєте галузь розвитку з місцевим майстром. Прапор no-ff створить вузол фіксації у програмі master для відстеження всього злиття.

Після цього ви можете взяти на себе зобов’язання та підштовхнути їх.

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

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

EDIT: моя оригінальна відповідь запропонувала те, git merge masterщо нічого не зробило, краще це зробити git merge FETCH_HEADпісля отримання походження / master


2

Після того, як ви "замовте" галузь розвитку, ви ...

 git add .
 git commit -m "first commit"
 git push origin dev
 git merge master

 git checkout master 
 git merge dev
 git push origin master 

1

Якщо ви використовуєте gerrit, наступні команди прекрасно працюють.

git checkout master
git merge --no-ff development

Ви можете зберегти за допомогою повідомлення про фіксацію за замовчуванням. Переконайтесь, що ідентифікатор змін створено. Щоб переконатися, ви можете скористатися наступною командою.

git commit --amend

Потім натисніть за допомогою наступної команди.

git push origin HEAD:refs/for/refs/heads/master

Можливо, ви побачите повідомлення про помилку, як описано нижче.

! [remote rejected] HEAD -> refs/for/refs/heads/master (you are not allowed to upload merges)

Щоб вирішити це, адміністратору проекту герріту необхідно створити ще одне посилання в gerrit під назвою 'refs / for / refs / heads / master' або 'refs / for / refs / heads / *' (яке охопить усі гілки в майбутньому). Потім надайте дозвіл "Надіслати об'єднання об'єднань" на це посилання та "Надіслати" дозвіл, якщо потрібно, щоб подати GCR.

Тепер спробуйте вищезгадану push команду ще раз, і вона повинна працювати.

Кредити:

https://github.com/ReviewAssistant/reviewassistant/wiki/Merging-branches-in-Gerrit

https://stackoverflow.com/a/21199818/3877642


1

Я думаю, що найпростішим рішенням було б

git checkout master
git remote update
git merge origin/Develop -X theirs
git commit -m commit -m "New release"
git push --recurse-submodules=check --progress "origin" refs/heads/Master

Це також зберігає історію всіх галузей, які використовуються


-4
1. //push the latest changes of current development branch if any        
git push (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any from (current development branch)
git pull origin (current development branch)

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master

Error
To https://github.com/rajputankit22/todos-posts.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/rajputankit22/todos-posts.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Then Use 
5. //push the master branch forcefully
git push -f origin master

1
Коли ви бачите, що помилка майже ніколи не є правильною справою, якщо ви не впевнені, що знаєте, чому у вашій місцевій гілці відсутня комісія з віддаленої гілки. Взагалі, набагато краще повернутися до кроку 3 і pullзнову. Також незрозуміло, яке значення надає ця відповідь порівняно з існуючими відповідями.
Кайл Странд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.