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