Git вытащить определенную ветку из GitHub

У меня есть проект с несколькими ветками. Я отправлял их на GitHub, и теперь, когда над проектом работает кто-то другой, мне нужно извлечь их ветки из GitHub. Он отлично работает в мастере. Но скажем, что кто-то создал ветку xyz. Как я могу вытащить ветку xyz из GitHub и объединить ее с веткой xyz на моем localhost?

На самом деле у меня есть свой ответ здесь: Push и тянуть ветки в Git

Но я получаю сообщение об ошибке "! [Отклонено]" и что-то о "не быстрой перемотке вперед".

Какие-либо предложения?

Ответ 1

Но я получаю сообщение об ошибке "! [отклонено]" и что-то вроде "non fast forward"

Это потому, что Git не может объединить изменения из ветвей в ваш текущий мастер. Скажем, вы проверили ветку master, и хотите объединиться в удаленной ветке other-branch. Когда вы это сделаете:

$ git pull origin other-branch

Git в основном делает это:

$ git fetch origin other-branch && git merge other-branch

То есть, pull - это просто fetch, за которым следует merge. Однако, когда pull -ing, Git будет сливать только other-branch, если он может выполнить быстрое переключение. Быстрое слияние - это слияние, в котором голова ветки, к которой вы пытаетесь слиться, является прямым потомком главы ветки, которую вы хотите объединить. Например, если у вас есть это дерево истории, то слияние other-branch приведет к ускоренному слиянию:

O-O-O-O-O-O
^         ^
master    other-branch

Однако это не было бы быстрым слиянием:

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

Чтобы решить вашу проблему, сначала выберите удаленную ветку:

$ git fetch origin other-branch

Затем объедините его в вашу текущую ветку (я буду считать, что master), и исправьте любые конфликты слияния:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!

Ответ 2

Просто явно отслеживайте ваши удаленные ветки, и простой git pull сделает то, что вы хотите:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

Последнее является локальной операцией.

Или еще больше вписывается в документацию GitHub по разветвлению:

git branch -f new_local_branch_name upstream/remote_branch_name

Ответ 3

Вы можете вывести ветвь в ветку со следующими командами.

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

Когда вы находитесь на главной ветке, вы также можете сначала проверить ветку, как:

git checkout -b xyz

Это создает новую ветвь "xyz" из мастера и непосредственно проверяет ее.

Затем выполните следующие действия:

git pull origin xyz

Это переносит новую ветвь в локальную ветвь xyz.

Ответ 4

Лучший способ:

git checkout -b <new_branch> <remote repo name>/<new_branch>

Ответ 5

git fetch возьмет последний список ветвей.

Теперь вы можете git checkout MyNewBranch

Готово:)


Подробнее см. в документах: git fetch

Ответ 6

Я не уверен, что полностью понимаю проблему, но вытащить существующую ветку так, как это (по крайней мере, это работает для меня:)

git pull origin BRANCH

Предполагается, что ваша локальная ветвь создана из поля origin/BRANCH.

Ответ 7

Это помогло мне получить удаленную ветвь, прежде чем слить ее в другую:

git fetch repo xyz:xyz
git checkout xyz

Ответ 8

git pull <gitreponame> <branchname>

Обычно, если у вас есть только репо, назначенный вашему коду, то gitreponame будет источником.

Если вы работаете с двумя репо, например, один локальный, а другой для удаленного, например, вы можете проверить список репо из git remote -v. это показывает, сколько репо назначено вашему текущему коду.

BranchName должно существовать в соответствующем gitreponame.

Вы можете использовать следующие две команды для добавления или удаления репо

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>

Ответ 9

вы также можете сделать

git pull -r origin master

исправить конфликты слияния, если какой-либо

git rebase --continue

-r - для rebase. Это создаст структуру ветвей из

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

к

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

Это приведет к более чистой истории. Примечание. Если вы уже нажали другую ветвь в начало (или любой другой пульт), вам может потребоваться принудительно нажать свою ветку после rebase.

git push -f origin other-branch

Ответ 10

я сделал

git branch -f new_local_branch_name origin/remote_branch_name

Вместо

git branch -f new_local_branch_name upstream/remote_branch_name

По предложению @innaM. Когда я использовал вышестоящую версию, она говорила "роковая: недопустимое имя объекта:" upstream/remote_branch_name ". Я не делал git fetch origin как предлагалось в комментарии, но вместо этого просто заменил upstream на origin. Я думаю, они эквивалентны.

Ответ 11

Проще говоря, если вы хотите вытащить из GitHub ветку the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want