Git从GitHub拉某个分支


630

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

我实际上在这里有我的答案: 在Git中推和拉分支

但是我收到一个错误“![已拒绝]”和一些有关“非快进”的信息。

有什么建议么?


3
您正在运行的实际命令是什么?
Alex N.

1
提取可能会失败,并显示“非快速转发”消息。您是否修改了远程跟踪分支(origin / xyz),或者在远程存储库中将分支重绕/重写了?您可能需要使用“ git fetch origin --force”,但在使用前请先阅读文档。
JakubNarębski09年

Answers:


755

但是我得到一个错误“![已拒绝]”和一些有关“非快进”的信息

这是因为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!

不,问题在于获取,而不是合并步骤。
JakubNarębski09年

3
通常,将远程服务器设置为强制获取,即使它们不会导致快速提交,因此除非OP用常规配置进行了某些更改,否则不应在获取时发生。快进问题可能会在获取合并期间发生。是什么使您说问题绝对是在获取而不是合并中?
mipadi

我遵循以下步骤(获取,合并)。Git告诉我没有事可做。当我尝试提交时,它就落在抱怨快进上了。
让·乔丹

1
@mipadi我和Jean遇到了同样的问题,尽管我不能说您以提到的非默认方式设置了遥控器,但是我可以说使用它git fetch -f已经解决了我的问题!谢谢!
cregox 2012年

1
这会将远程分支合并xzy为本地分支master,这不是原始问题所暗示的;“如何从GitHub中提取分支xyz并将其合并到本地主机上的分支xyz中?”
user5359531

301

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

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

后者是本地操作。

甚至更适合GitHub上关于fork的文档

git branch -f new_local_branch_name upstream/remote_branch_name

39
如果得到“无效的对象名:origin / remote_branch_name”,请首先执行“ git fetch origin”。
Martin Konicek 2012年

130

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

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

git pull origin xyz:xyz

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

git checkout -b xyz

这将从主服务器创建一个新分支“ xyz”,并直接将其检出。

然后,您执行以下操作:

git pull origin xyz

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


1
完善!我只是不知道这种语法:git pull {repo} {remotebranchname}:{localbranchname}。问题,如果这种拉动不起作用(也许有人更新了分支,并且会发生合并冲突),我有什么选择?
2013年

7
我对此表示反对,因为它试图将远程分支合并到您当前的分支(例如master)中。这不是大多数人想要做的,也不是OP要求的。@mohit的答案是正确的选择。
Phrogz '16

1
Phrogz-在最新版本的Git中,这种行为似乎已改变。我以前用过,效果很好。
Pawan

88

最好的方法是:

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

1
在github上创建新的“ dev”分支并尝试以上操作后,我收到以下错误消息:“致命:origin / dev不是提交,因此无法从中创建分支'dev'”解决方案是“请按照下面的Bradley Flood解决方案获取”,然后重新运行mohit的答案。
TomEberhard '18

46

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

现在你可以 git checkout MyNewBranch

完成:)


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


37

我不确定我是否完全理解问题,但是像这样完成拉现有分支的工作(至少对我有用:)

git pull origin BRANCH

这是假设您的本地分支是在Origin / BRANCH之外创建的。


15

这帮助我在将其合并到其他分支之前获得了远程分支:

git fetch repo xyz:xyz
git checkout xyz


3
git pull <gitreponame> <branchname>

通常,如果您仅将repo分配给您的代码,则gitreponame将是origin。

如果您正在处理两个仓库,例如一个是本地仓库,另一个是远程仓库,则可以从git remote -v检查仓库的列​​表。这显示有多少存储库分配给您的当前代码。

BranchName应该存在于相应的gitreponame中。

您可以使用以下两个命令来添加或删除存储库

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

2

你也可以

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

1

我做了

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按照注释的建议进行操作,而是只是将其替换upstreamorigin。我想它们是等效的。


0

用于从GitHub提取分支,您可以使用

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

确保分支名称完全相同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.