790

我有一个有多个分支的项目。我一直在将它们推送到GitHub,现在其他人正在从事该项目,我需要从 GitHub 中提取他们的分支。它在master中运行良好。但是说有人创建了一个分支xyz。如何xyz从 GitHub 中提取分支并将其合并到xyz我的分支中localhost

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

但我得到一个错误“![拒绝]”和一些关于“非快进”的东西。

有什么建议么?

4

13 回答 13

931

但我得到一个错误“![拒绝]”和一些关于“非快进”的东西

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

$ git pull origin other-branch

Git基本上是这样做的:

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

也就是说, apull只是 afetch后跟 a 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!
于 2009-11-10T19:17:47.140 回答
356

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

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

后者是本地操作。

或者更符合GitHub 的 forking 文档

git branch -f new_local_branch_name upstream/remote_branch_name
于 2009-11-10T19:09:08.913 回答
169

一种安全的方法是先创建一个本地分支(即 xyz),然后将远程分支拉入您的本地。

# create a local branch
git checkout -b xyz

# make sure you are on the newly created branch
git branch

# finally pull the remote branch to your local branch
git pull origin xyz

这是可以将远程分支拉到本地分支的语法。

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

git pull origin xyz:xyz
于 2009-11-10T16:28:48.947 回答
109

最好的方法是:

git checkout -b <new_branch> <remote repo name>/<new_branch>
于 2012-06-29T06:12:10.977 回答
54

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

现在你可以git checkout MyNewBranch

完毕 :)


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

于 2014-10-14T01:02:07.760 回答
41

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

git pull origin BRANCH

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

于 2009-11-10T16:23:46.693 回答
17

简单地说,如果你想从 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
于 2018-11-19T19:38:10.380 回答
16

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

git fetch repo xyz:xyz
git checkout xyz
于 2016-02-15T21:25:49.210 回答
11

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

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

确保分支名称完全相同。

于 2020-06-05T20:23:15.340 回答
8

我做了

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. 我猜他们是等价的。

于 2018-07-25T15:44:58.663 回答
4
git pull <gitreponame> <branchname>

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

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

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

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

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>
于 2017-12-08T04:23:02.380 回答
3

你也可以

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
于 2017-08-28T09:10:46.930 回答
2

你可以试试

git branch -a

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

git checkout theBranch//进入分支

git checkout -b "yourNewBranch"// 在你自己的分支“theBranch”中工作

于 2021-11-24T03:12:06.553 回答