Git从GitHub拉出一个分支

时间:2009-11-10 16:18:22

标签: git merge branch github pull

我有一个有多个分支的项目。我一直把它们推到GitHub,现在其他人正在研究这个项目,我需要从GitHub中取出它们的分支。它在master中工作正常。但是说有人创建了一个分支xyz。如何从GitHub中提取分支xyz并将其合并到xyz上的分支localhost

我实际上在这里得到了答案: Push and pull branches in Git

但我收到错误“![拒绝]”以及“非快进”的内容。

有什么建议吗?

12 个答案:

答案 0 :(得分:622)

  

但我收到错误“![拒绝]”以及“非快进”的内容

那是因为Git无法将分支的更改合并到当前的主服务器中。假设您已检出分支master,并且想要在远程分支other-branch中合并。当你这样做时:

$ git pull origin other-branch

Git基本上是这样做的:

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

也就是说,pull只是fetch后跟merge。但是,当pull时,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!

答案 1 :(得分:276)

只需明确跟踪远程分支,一个简单的git pull即可完成您想要的工作:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

后者是一项本地行动。

或者更适合GitHub documentation on forking

git branch -f new_local_branch_name upstream/remote_branch_name

答案 2 :(得分:105)

您可以使用以下命令将分支拉到分支。

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

git pull origin xyz:xyz

当你在主分支机构时,你也可以先签出一个分支,如:

git checkout -b xyz

这会从主人创建一个新分支“xyz”并直接将其检出。

然后你做:

git pull origin xyz

这会将新分支拉到您当地的xyz分支。

答案 3 :(得分:81)

最好的方法是:

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

答案 4 :(得分:36)

git fetch将获取最新的分支列表。

现在你可以git checkout MyNewBranch

完成:)


有关详细信息,请参阅文档:git fetch

答案 5 :(得分:31)

我不确定我是否完全理解这个问题,但拉动现有的分支是这样做的(至少它适用于我:)

git pull origin BRANCH

这假设你的本地分支是从origin / BRANCH创建的。

答案 6 :(得分:11)

这有助于我在将其合并到其他地方之前获得远程分支:

git fetch repo xyz:xyz
git checkout xyz

答案 7 :(得分:6)

要从GitHub提取分支,可以使用

git checkout --track origin/the-branch-name

确保分支名称完全相同。

答案 8 :(得分:2)

git pull <gitreponame> <branchname>

通常如果你只为你的代码分配了回购,那么gitreponame就是原产地。

如果您正在处理两个回购,例如一个是本地的,另一个是远程的,您可以从 git remote -v 查看回购列表。这表示为当前代码分配了多少个repo。

BranchName应存在于相应的gitreponame中。

您可以使用以下两个命令添加或删除回购

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

答案 9 :(得分:1)

您也可以

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 :(得分:1)

简单地说,如果您想从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

答案 11 :(得分:0)

我做了

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。我想它们是等效的。