Получить изменения от мастера в филиал в Git


691

В моем хранилище есть ветка под названием, над aqкоторой я работаю.

Затем я совершил новую работу и ошибки master.

Каков наилучший способ получить эти коммиты в aqветке? Создать еще одну новую ветку masterи объединить ее с aq?


3
В будущем вы также можете запустить ветку с исправлениями ошибок от общего предка master и других веток, которые потребуют исправлений, чтобы вы могли объединить их со всеми этими ветками, не поднимая ничего другого.
Каскабель

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

@ahnbizcad Я уверен, что он контролирует, где он открывает свою собственную ветку. Если его ветвь является общим предком тех, с кем он захочет слиться, и люди впоследствии добавят к этим ветвям, он все равно будет общим предком.
Каскабель

ребята, вопрос, эта команда делает это,git pull origin my_branch_name
Basheer AL-MOMANI

Ответы:


797

Проверьте aqветку и сделайте ребаз из master.

git checkout aq
git rebase master

может ребазить из любой другой ветки? То есть. мерзавец перебазировать другой филиал? Кажется, я был немного не в своем вопросе, я разветвлялся из ветки, затем вносил изменения в исходную ветку.
Slee

2
Если я прав, перебазирую по запросу, он покажет все основные коммиты. если вы используете мастер слияния / происхождения, все основные коммиты будут показаны как 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
Ханман

302

Вы должны быть в состоянии только git merge origin/masterкогда вы находитесь на вашей ветке aq.

git checkout aq
git merge origin/master

55
Если «перебазирование» «лучше», полностью зависит от конкретной ситуации.
Бомба

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

145
Используйте, rebaseесли ваша ветка является локальной и не была отправлена ​​в origin. Используйте, mergeесли ваша ветка уже нажата. rebaseперепишу историю.
сборщик мусора

17
@Toskan вы можете столкнуться с проблемами, когда ваш локальный мастер не в курсе с удаленным. Таким образом, вы гарантируете, что вы объединяете удаленную копию кода.
Крис Кукен

8
@garbagecollector Я против перебазирования (могу, но не перебазирую) Не вижу смысла играть с ребазом. Это просто делает вещи излишне сложными. У вас всегда есть вопрос "Я перенес это на пульт?" размышлять, и это трудно объяснить новичкам. Некоторые люди говорят, что он избегает коммитов слияния. Но я хочу сделать коммит слияния. Они не загромождают, они документируют, когда ветви объединяются. Итак, в последний раз, можем ли мы наконец прекратить вести себя так, как будто все мы стремимся овладеть? Если вам не нравится коммит слияния в журнале, просто отфильтруйте его с помощью --no-merges.
Нуреттин

92

Сначала проверьте, чтобы освоить:

git checkout master

Сделайте все изменения, исправления и коммиты и нажмите ваш мастер.

Вернитесь к своей ветке 'aq' и объедините в ней master:

git checkout aq
git merge master

Ваша ветка будет в курсе с мастером. Хорошим и базовым примером слияния является 3.2 Git Branching - Basic Branching и Merging .


25

Нет гарантии, что основные исправления ошибок не входят в число других коммитов, поэтому вы не можете просто объединить. Делать

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
@ Если вы ответили сами ... это не выход из ситуации
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.


Важно отметить, что это решение идеально, если слияние требуется конкретно, то есть, если основная ветвь не может быть перебазирована по какой-либо причине.
cudacoder

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 с мастером, быстро переходит вперед на то же самое слияние с aq, отменяет его на master и снова возвращает вас на aq!

Я чувствую, что что-то упустил - кажется, это то, что вы, очевидно, хотели бы, и что-то, что трудно сделать.

Кроме того, ребаз не эквивалентен. Он теряет метки времени и идентичность коммитов, сделанных на aq, что тоже не то, что я хочу.


0

Сценарий:

  • Я создал ветку от master say branch-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.