关于合并:Git从GitHub拉出某个分支

Git pull a certain branch from GitHub

我有一个有多个分支的项目。我一直在把他们推到Github,现在有人在这个项目上工作,我需要从Github拉他们的分支。它在主人那里工作得很好。但假设有人创建了一个分支xyz。如何从Github中拔出xyz分支并合并到我的localhost上的xyz分支?

我的答案是:在Git中推拉分支

但我得到一个错误"![拒绝]"以及一些关于"非快速前进"的内容。

有什么建议吗?


But I get an error"! [rejected]" and something about"non fast forward"

这是因为Git无法将分支中的更改合并到当前主控形状中。假设您已经签出了分支master,并且希望合并到远程分支other-branch。当你这样做的时候:

1
$ git pull origin other-branch

Git基本上是这样做的:

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

也就是说,一个pull只是一个fetch,后面跟着一个merge。但是,当pulling时,如果git可以进行快进合并,那么它只能合并other-branch。快进合并是一种合并,其中要合并的分支的头是要合并的分支头的直接后代。例如,如果您有这个历史树,那么合并other-branch将导致快速向前合并:

1
2
3
O-O-O-O-O-O
^         ^
master    other-branch

但是,这并不是一个快速向前的合并:

1
2
3
4
5
    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

要解决您的问题,请首先获取远程分支:

1
$ git fetch origin other-branch

然后将它合并到您当前的分支(我假设是master),并修复任何合并冲突:

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


只需显式地跟踪远程分支,一个简单的git pull就可以满足您的需要:

1
2
git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

后者是本地操作。

或者更适合Github的分叉文档:

1
git branch -f new_local_branch_name upstream/remote_branch_name


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

1
2
3
git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

当您在主分支上时,还可以首先签出一个分支,如:

1
git checkout -b xyz

这将从主服务器创建一个新的分支"xyz",并直接将其签出。

然后你会:

1
git pull origin xyz

这将把新的分支机构拉到您当地的xyz分支机构。


最好的方法是:

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


git fetch将获取最新的分支机构名单。

现在你可以开始了。

完成:)

有关更多信息,请参阅docs:git fetch


我不确定我是否完全理解这个问题,但是拉一个现有的分支是这样做的(至少对我有用)。

1
git pull origin BRANCH

这是假设您的本地分支是从源/分支创建的。


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

1
2
git fetch repo xyz:xyz
git checkout xyz


1
git pull <gitreponame> <branchname>

通常,如果只有repo分配给代码,那么gitreponename就是源代码。

如果您正在处理两个repo,一个是本地的,另一个是远程的,就像您可以从git remote-v查看repo的列表一样。这显示有多少repo分配给您的当前代码。

BranchName应存在于相应的GitRepoName中。

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

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

简单地说,如果您想从Github拉出分支the_branch_I_want

1
2
3
git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want


你也可以

1
git pull -r origin master

修复合并冲突(如果有)

1
git rebase --continue

-R代表钢筋。这将使您的分支结构

1
2
3
4
        v  master      
o-o-o-o-o
     \o-o-o
          ^ other branch

1
2
3
        v  master      
o-o-o-o-o-o-o-o
              ^ other branch

这将导致一个干净的历史。注意:如果您已经将其他分支推到原点(或任何其他远程位置),则可能需要在重新平衡后强制推送分支。

1
git push -f origin other-branch


我做的

1
git branch -f new_local_branch_name origin/remote_branch_name

而不是

1
git branch -f new_local_branch_name upstream/remote_branch_name

如@innam所建议。当我使用上游版本时,它说"致命:不是一个有效的对象名:上游/远程分支名称"。我并没有如评论所建议的那样做git fetch origin,而是简单地用origin替换upstream。我想它们是等价的。