Как объединить удаленный мастер с локальной веткой

238

У меня есть локальная ветвь проекта ("configUpdate"), которую я разветвил из чужого проекта, и я внес в нее множество изменений и хотел бы объединить изменения, которые они внесли в мою локальную ветку.

я пробовал

git pull --rebase origin configUpdate

но это не захватило последние изменения - как я могу объединить два? (также для бонусных баллов, что я сделал с pull --rebaseкомандой?)

Martyn
источник
Возможный дубликат Git: Объедините удаленную ветку локально
Майкл

Ответы:

354

Из вашей функциональной ветки (например configUpdate) запустите:

git fetch
git rebase origin/master

Или более короткая форма:

git pull --rebase

Почему это работает:

  • git merge branchnameберет новые коммиты из ветки branchnameи добавляет их в текущую ветку. При необходимости он автоматически добавляет коммит "Merge" сверху.

  • git rebase branchnameберет новые коммиты из ветки branchnameи вставляет их "под" ваши изменения. Точнее, он изменяет историю текущей ветки так, чтобы он основывался на кончике branchname, с любыми изменениями, которые вы внесли поверх этого.

  • git pullв основном так же, как git fetch; git merge origin/master.

  • git pull --rebaseв основном так же, как git fetch; git rebase origin/master.

Так почему вы хотите использовать, git pull --rebaseа не git pull? Вот простой пример:

  • Вы начинаете работать над новой функцией.

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

  • Если вы git pull(который использует слияние), ваши изменения будут скрыты новыми коммитами, в дополнение к автоматически создаваемому коммиту слияния.

  • Если вы git pull --rebaseвместо этого, git перемотает ваш мастер на апстрим, затем примените ваши изменения сверху.

Джои Адамс
источник
Я сделал это в правильной ветке, но я все еще вижу различия между моими локальными файлами и удаленной главной веткой исходного проекта (хотя в нем говорится, что все обновлено!), Возможно, я неправильно настроил проект? Есть ли способ проверить?
Мартын
1
@Martyn: различия должны быть вашими местными изменениями. Сделайте еще одну ветвь удаленной ветки и проверьте, имеет ли она правильное содержимое файла.
ZeissS
4
Я знаю, что это старый ответ, но учтите, что вы можете предпочесть MERGE вместо ребазинга. Вы не хотите делать ребазинг, если позже вам придется объединиться с удаленным репо, в котором уже есть некоторые ваши изменения.
Домино
1
Как насчет (при условии, что вы в данный момент используете ветку configUpdate) ... git pull в основном то же самое, что и git fetch; git merge origin / master. <- НЕ ПРАВДА
Крис
@ Крис: В каком смысле это не так? Предположение о происхождении / хозяине в качестве восходящего потока? Или git pull был изменен?
Джои Адамс
81

Я узнал, что это было:

$ git fetch upstream
$ git merge upstream/master
Martyn
источник
6
Так что, если вы еще не поняли это, вы pull --rebaseне работали, потому что originуказывал на вашу вилку. Это бы сработало, если бы ты это сделал git pull --rebase upstream/master.
Карл Билефельдт
3
Попробуйте: git merge origin / master
Крис
Я скучал по зацепке, этот ответ решил для меня.
nurettin
39

Переключитесь на местный филиал

> git checkout configUpdate

Слияние удаленного мастера с вашей веткой

> git rebase master configUpdate

Если у вас есть какие-либо конфликты, исправьте их, и для каждого конфликтующего файла выполните команду

> git add [path_to_file / конфликтаted_file] (например, git add app / assets / javascripts / test.js)

Продолжить перебазирование

> git rebase - продолжение

Серж Селецкий
источник
не бойтесь использовать rebase вместо слияния, потратьте некоторое время на изучение различий, если вы чувствуете разрыв в этих вопросах
Серж Селецкий
13

Git ReBase, похоже, не работает для меня. После git rebase, когда я пытался отправить изменения в свою локальную ветку, я продолжал получать сообщение об ошибке («Подсказка: обновления были отклонены, потому что конец вашей текущей ветки находится за своим удаленным аналогом. Интегрируйте удаленные изменения (например,« git pull »). .. ') перед повторным нажатием. ") даже после git pull. То, что в итоге сработало для меня, было git merge.

git checkout <local_branch>
git merge <master> 

Если вы новичок, как я, вот хорошая статья о git merge против git rebase. https://www.atlassian.com/git/tutorials/merging-vs-rebasing

АЕК
источник