Git: объединить удаленную ветку локально

204

Я вытащил все удаленные ветви через git fetch --all. Я вижу ветку, которую я хотел бы объединить, git branch -aкак remotes / origin / branchname. Проблема в том, что он недоступен. Я не могу слить или оформить заказ?

micahblu
источник

Ответы:

321

Вы можете ссылаться на эти ветви удаленного отслеживания ~ (перечислены с помощью git branch -r) с названием их удаленного.

Вам нужно получить удаленную ветку:

git fetch origin aRemoteBranch

Если вы хотите объединить одну из этих удаленных веток в вашей локальной ветке:

git checkout master
git merge origin/aRemoteBranch

Примечание 1: Для большого репо с длинной историей вы захотите добавить --depth=1опцию при использовании git fetch.

Примечание 2: Эти команды также работают с другими удаленными репозиториями, так что вы можете настроить originи, upstreamесли вы работаете на развилке.


Противоположный сценарий: если вы хотите объединить одну из ваших локальных веток в удаленной ветке (в отличие от удаленной ветки в локальную, как показано выше), вам сначала нужно создать новую локальную ветку поверх указанной удаленной ветви:

git checkout -b myBranch origin/aBranch
git merge anotherLocalBranch

Идея здесь состоит в том, чтобы объединить «одну из ваших локальных веток» (здесь anotherLocalBranch) с удаленной веткой ( origin/aBranch).
Для этого вы сначала создаете " myBranch" как представление этой удаленной ветви: это git checkout -b myBranch origin/aBranchчасть.
И тогда вы можете слиться anotherLocalBranchс ним (с myBranch).

VonC
источник
aLocalBranch? это опечатка? Я полагаю, вы хотели написать "myBranch" снова?
knocte
1
@knocte No: «Если вы хотите объединить одну из ваших локальных веток с одной из этих удаленных веток»: я объединяю « aLocalBranch» в « myBranch», где « myBranch» представляет удаленную ветку origin/aBranch.
VonC
Извините, что беспокою вас @VonC, в своем предыдущем комментарии вы сказали, что aLocalBranchэто не опечатка, но вы одобрили последнее изменение (2 года спустя!), Которое исправляет эту «вероятную опечатку». Я хотел уточнить у вас, перед отменой редактирования.
Рат
1
@rath Вы правы: похоже, я мог бы поспешно отредактировать это редактирование, граничащее с небрежностью. Я действительно отредактировал ответ, чтобы уточнить второй случай слияния: можете ли вы сказать мне, если это яснее сейчас?
VonC
91

Всякий раз, когда я делаю слияние, я попадаю в ветку, в которую я хочу слиться (например, " git checkout branch-i-am-working-in"), и затем делаю следующее:

git merge origin/branch-i-want-to-merge-from

Майкл Даутерманн
источник
2
Я полагаю, вы должны сделать git fetch origin/branch-i-want-to-merge-fromпервый, верно?
Хинрих
9
git fetch origin developзатемgit merge origin/develop
Оливье
2
@ Оливье Вы правы, это правильный способ сделать это. git merge один не сделает этого.
Сэм
1
спасибо за умное соглашение об именах, которое помогло мне понять
tony2tones
1
@ Акира git add .-> git commit -m <message>-> git push -u origin <branch>?
Облако Чо
24

Сначала извлеките удаленную ветку из источника.

git fetch origin remote_branch_name

Объединить удаленный филиал с локальным филиалом

git merge origin/remote_branch_name
Ланил Марасингхе
источник
1
Это сработало для меня, когда принятый ответ сообщил, что мы не можем слиться. В моем случае я слился с другим пользователем форка моего репо на GitHub.
СДТ
Требуется ли получение первой команды? Читает ли 'git merge origin / remote_branch_name' из удаленной ветви, а не из локальной. Так что мне все равно, обновляется местное отделение или нет?
Майкл Фрейдгейм
20

Может быть , вы хотите , чтобы отслеживать удаленный филиал с местным отделением:

  1. Создайте новую локальную ветку: git branch new-local-branch
  2. Установите эту вновь созданную ветку для отслеживания удаленной ветви: git branch --set-upstream-to=origin/remote-branch new-local-branch
  3. Войдите в эту ветку: git checkout new-local-branch
  4. Вытащите все содержимое удаленной ветви в локальную ветку: git pull
e18r
источник
3

Если вы уже загрузили удаленную ветку и сделали это git branch -a,
вы получите что-то вроде:

* 8.0
  xxx
  remotes/origin/xxx
  remotes/origin/8.0
  remotes/origin/HEAD -> origin/8.0
  remotes/rep_mirror/8.0

После этого вы можете использовать rep_mirror/8.0для локального обозначения вашего удаленного филиала.

Хитрость в том, что remotes/rep_mirror/8.0это не работает, но rep_mirror/8.0работает.

Таким образом, команда, как git merge -m "my msg" rep_mirror/8.0сделать слияние.

(примечание: это комментарий к ответу @VonC. Я поставил его как другой ответ, потому что блоки кода не вписываются в формат комментария)

Эрве-Герена
источник