Git вытащить определенную ветку от GitHub - PullRequest
530 голосов
/ 10 ноября 2009

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

У меня есть мой ответ: Push и Pull ветви в Git

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

Есть предложения?

Ответы [ 11 ]

629 голосов
/ 10 ноября 2009

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

Это потому, что 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 , если , он может выполнить слияние fast-forward . fast-forward слияние - это слияние, в котором глава ветви, в которую вы пытаетесь слиться, является прямым потомком главы ветви, которую вы хотите объединить. Например, если у вас есть это дерево истории, то слияние 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!
277 голосов
/ 10 ноября 2009

Просто явно отслеживайте ваши удаленные ветви, и простой 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
105 голосов
/ 10 ноября 2009

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

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

git pull origin xyz:xyz

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

git checkout -b xyz

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

Тогда вы делаете:

git pull origin xyz

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

81 голосов
/ 29 июня 2012

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

git checkout -b <new_branch> <remote repo name>/<new_branch>
38 голосов
/ 14 октября 2014

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

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

Готово:)


Для получения дополнительной информации см. Документы: git fetch

31 голосов
/ 10 ноября 2009

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

git pull origin BRANCH

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

11 голосов
/ 16 февраля 2016

Это помогло мне получить удаленную ветку перед объединением в другую:

git fetch repo xyz:xyz
git checkout xyz
2 голосов
/ 08 декабря 2017
git pull <gitreponame> <branchname>

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

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

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

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

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>
1 голос
/ 19 ноября 2018

Проще говоря, если вы хотите вытащить из 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
1 голос
/ 28 августа 2017

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

git pull -r origin master

исправление конфликтов слияния, если таковые имеются

git rebase --continue

-r для перебазирования. Это сделает вашу структуру ветки из

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

до

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

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

git push -f origin other-branch
...