Отримайте зміни від майстра до філії в Git


691

У моєму сховищі є відділення, над aqяким я працюю.

Потім я вчинив нову роботу і помилки master.

Який найкращий спосіб отримати ці комісії у aqфілії? Створіть із нього нову гілку masterта з’єднаєте її aq?


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

2
@Jefromi, але це поза його контролем, якщо він не єдина людина, яка працює над проектом. інші люди оновлюють майстра. пекло, ти сам можеш оновити майстра з третьої гілки, і ситуація була б неминучою і потребує загального рішення.
ahnbizcad

@ahnbizcad Я впевнений, що він контролює, де він починає свою власну філію. Якщо його гілка є загальним предком тих, кого він захоче об'єднати, а люди згодом додадуть до цих гілок, він все одно буде загальним предком.
Каскабель

хлопці, питання, чи виконує ця команда,git pull origin my_branch_name
Basheer AL-MOMANI

Відповіді:


794

Ознайомтеся з aqвідділенням та перезавантажтесь master.

git checkout aq
git rebase master

може базуватися на будь-якій іншій галузі? Тобто git rebase other Branch? Здається, я трохи зупинився на своєму питанні, я відгалужився від гілки, потім змінив оригінальну гілку.
Сон

2
Якщо я маю рацію, перезавантажте запит на витяг, він покаже всі майстерні зобов'язання. якщо ви використовуєте master merge / origin, всі основні комісії відображатимуться як 1 фіксація, що полегшує перегляд коду.
Користувач Foo Bar

4
Іноді, git mergeбуло б краще. Якщо з часом розвивалися обидві гілки, слід розглянути, що найкраще підходить для вас.
erick2red

70
Пізно до партії, але це чудовий огляд того, коли потрібно перезавантажувати та зливати: atlassian.com/git/tutorials/merging-vs-rebasing/…
ebuat3989

7
Якщо ваші попередні зобов’язання щодо aq гілки є загальнодоступними, тоді не виконуйте перезавантаження. atlassian.com/git/tutorials/rewriting-history/git-rebase
Hanmant

301

Ви повинні мати можливість просто git merge origin/masterколи ви перебуваєте на своїй аквалійській гілці.

git checkout aq
git merge origin/master

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

13
чому б ти просто не назвав "git merge master" замість "git merge origin / master"?
Майкл Кюллер

145
Використовуйте, rebaseякщо ваша філія локальна і на неї не натискали origin. Використовуйте, mergeякщо ваше відділення вже висунуте. rebaseперепише історію.
garbagecollector

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

8
@garbagecollector Я проти ребаза (я можу, але не буду перезавантажувати), я не бачу причин грати з ребазом. Це просто робить речі непотрібними. У вас завжди виникає питання "Чи натиснув це на віддалений?" обмірковувати, і носівам пояснити біль. Деякі люди кажуть, що це дозволяє уникати об'єднань. Але я хочу мати об'єднання. Вони не захаращені, вони документують при злитті гілок. Отже, в останній раз, чи можемо ми нарешті перестати діяти так, як ми всі зобов’язуємося опанувати? Якщо ви не любите об'єднання об'єднань у журнал настільки сильно, просто відфільтруйте їх за допомогою --no-merges.
Нуреттін

92

Спочатку перевірити майстер:

git checkout master

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

Поверніться до своєї філії, 'aq', і об'єднайте в ній master:

git checkout aq
git merge master

Ваша філія буде в курсі майстра. Хорошим і базовим прикладом злиття є 3.2 Git Branching - Basic Branching and Merging .


25

Немає гарантії, що виправлення помилок master не є серед інших комітетів, отже, ви не можете просто об’єднати. Зробіть

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

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

Відтепер зберігайте виправлення помилок в окремій гілці. Ви зможете просто

git merge hotfixes

коли ви хочете перенести їх у звичайну гілку розробників.


17

Або cherry-pickвідповідні зобов'язання у філію, aqабо об'єднання гілки masterв гілку aq.


5
@Slee ви відповіли самі ... це не вирішення цієї ситуації
mtet88

13

Об’єднайте його aq

git checkout master
git pull
git checkout aq
git merge --no-ff master
git push

8

Легкий шлях

# 1. Create a new remote branch A base on last master
# 2. Checkout A
# 3. Merge aq to A

7

Для мене зміни вже відбулися, і я хотів останнього з базової гілки. Я не міг цього зробити rebaseі cherry-pickвзяв би назавжди, тому зробив наступне:

git fetch origin <base branch name>  
git merge FETCH_HEAD

так що в цьому випадку:

git fetch origin master  
git merge FETCH_HEAD

7

Це ( звідси ) працювало для мене:

git checkout aq
git pull origin master
...
git push

Цитування:

git pull origin masterвиймає та об'єднує вміст головного відділення з вашою гілкою та створює комісію злиття. Якщо виникають конфлікти злиття, про це вам буде повідомлено на цьому етапі, і ви повинні вирішити об'єднання об'єднань, перш ніж продовжувати . Коли ви будете готові надіслати свої локальні комісії, включаючи нову комісію злиття, на віддалений сервер, запустіть git push.


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

3

У вас є пара варіантів. git rebase master aqна гілку, яка буде зберігати імена фіксації, але НЕ ВІДМОВИТИ, якщо це віддалена гілка. Ви можете, git merge master aqякщо вам не байдуже зберігати імена комітів. Якщо ви хочете зберегти імена фіксації, і це віддалений відгалуження, git cherry-pick <commit hash>здійснює здійснення вашої філії.


0

Ви також можете це зробити, запустивши один рядок.
git merge aq master

Це еквівалентно

git checkout aq
git merge master

Це не те, що ви думаєте, що це робить. git merge a bзливає гілки aі bв поточну гілку. Але git merge aколи ти на гілці a, нічого не зробиш (саме тому це виглядає трохи так, як це робить те, що ти думаєш, що робить). (Див. Git-scm.com/docs/git-merge#Documentation/… .)
MikeBeaton

0

Редагувати:

Моя відповідь нижче документів спосіб злиття masterв aq, де , якщо ви переглянути деталі злиття в ньому перераховані зміни , внесені в aqдо злиття, а не зміна , зроблені на master. Я зрозумів, що це, мабуть, не те, чого ти хочеш, навіть якщо ти думаєш, що це!

Просто:

git checkout aq
git merge master

добре.

Так, це просте злиття покаже, що зміни master, внесені aqв цей момент, а не навпаки; але це нормально - адже саме так і сталося! Пізніше, коли ви, нарешті, об'єднаєте свою філію master, саме тоді злиття нарешті покаже всі ваші зміни, що були зроблені master(що саме ви хочете, і це зобов'язання, де люди в будь-якому випадку очікують знайти цю інформацію).

Я перевірив, і підхід, наведений нижче, також показує точно такі ж зміни (усі зміни, внесені aqпісля початкового розбиття між aqта master), як і звичайний підхід, наведений вище master. Тому я думаю, що єдиним його реальним недоліком (окрім того, що надмірно складний і нестандартний ...: - /) є те, що якщо ви повернете назад n останніх змін, git reset --hard HEAD~<n>і це пройде повз об'єднання, версія нижче відкочується назад "неправильна" гілка, яку потрібно виправити вручну (наприклад, за допомогою git reflog& git reset --hard [sha]).


[Отже, те, що я раніше вважав, це:]

Виникла проблема з:

git checkout aq
git merge master

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

З іншої сторони

git checkout master
git merge aq

показує зміни, внесені в aq, що, ймовірно, саме те, що ви хочете. (Або, принаймні, це часто те, що я хочу!) Але злиття, що показує правильні зміни, знаходиться на неправильній гілці!

Як впоратися ?!

Повний процес, що закінчується об'єктом злиття, що показує зміни, внесені на aq (відповідно до другого злиття вище), але злиттям, що впливає на aq гілку, є:

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

Це: зливає aq на master, швидко пересилає той самий злиття на aq, скасовує його на master і знову повертає вас на aq!

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

Також база даних НЕ еквівалентна. Він втрачає часові позначки та ідентичність комітетів, зроблених на aq, що теж не те, що я хочу.


0

Сценарій:

  • Я створив гілку з майстра скажіть гілка-1 і перетягнув її до своїх місцевих.
  • Мій друг створив філію з майстра кажуть гілка-2.
  • Він здійснив деякі зміни коду для освоєння.
  • Тепер я хочу перенести ці зміни від головного відділення до мого місцевого відділення.

Рішення

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 

Ви можете знайти конфлікти у вашому файлі після виконання "git stash apply". Виправити це потрібно вручну, і тепер ви готові натиснути.

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