Git从GitHub拉出一个分支

tyb*_*103 569 git merge branch pull github

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

我实际上在这里得到了答案: 在Git中推拉分支

但我得到一个错误"![拒绝]"和一些关于"非快进"的事情.

有什么建议?

mip*_*adi 682

但我得到一个错误"![拒绝]"和"非快进"的事情

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

$ git pull origin other-branch
Run Code Online (Sandbox Code Playgroud)

Git基本上是这样做的:

$ git fetch origin other-branch && git merge other-branch
Run Code Online (Sandbox Code Playgroud)

也就是说,a pull只是a fetch后跟a merge.然而,当pull-ing,Git会合并other-branch ,如果它可以进行快进合并.一个快进合并是合并在您试图合并到分支的头部是一个直接后裔要合并分支的头.例如,如果您有此历史记录树,那么合并other-branch将导致快进合并:

O-O-O-O-O-O
^         ^
master    other-branch
Run Code Online (Sandbox Code Playgroud)

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

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch
Run Code Online (Sandbox Code Playgroud)

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

$ git fetch origin other-branch
Run Code Online (Sandbox Code Playgroud)

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

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!
Run Code Online (Sandbox Code Playgroud)

  • 通常,设置遥控器以便强制提取,即使它们不会导致快进提交,因此除非OP使用通常的配置改变了某些内容,否则它不应该在提取时发生.在fetch*或*merge期间可能会发生快进问题.是什么让你说这个问题肯定是在获取,而不是合并? (3认同)
  • 这将远程分支 `xzy` 合并到本地分支 `master`,这不是原始问题所暗示的;“如何从 GitHub 拉取分支 xyz 并将其合并到本地主机上的分支 xyz 中?” (3认同)

inn*_*naM 292

只需明确跟踪远程分支,简单git pull就可以完成您想要的操作:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name
Run Code Online (Sandbox Code Playgroud)

后者是一项本地行动.

或者更适合关于分叉GitHub文档:

git branch -f new_local_branch_name upstream/remote_branch_name
Run Code Online (Sandbox Code Playgroud)

  • 如果你得到'不是有效的对象名:'origin/remote_branch_name',先做'git fetch origin'. (36认同)

Rob*_*bri 115

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

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

git pull origin xyz:xyz
Run Code Online (Sandbox Code Playgroud)

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

git checkout -b xyz
Run Code Online (Sandbox Code Playgroud)

这将从主控器创建一个新分支"xyz"并直接将其检出.

然后你做:

git pull origin xyz
Run Code Online (Sandbox Code Playgroud)

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

  • 我正在低估这一点,因为它试图将远程分支合并到您当前的分支(例如master).这不是大多数人想要做的事情,也不是OP所要求的.@mohit的答案是正确的选择. (6认同)
  • 完美的!我只是不知道语法:git pull {repo} {remotebranchname}:{localbranchname}。问题,如果拉动不起作用(也许有人更新了分支并且会出现合并冲突)我有什么选择? (2认同)
  • Phrogz - 看起来这种行为在最近版本的 Git 中有所改变。我以前用过这个,效果很好。 (2认同)

moh*_*hit 85

最好的方法是:

git checkout -b <new_branch> <remote repo name>/<new_branch>
Run Code Online (Sandbox Code Playgroud)

  • 在 github 上创建新的“dev”分支并尝试上述操作后,我收到以下错误消息:“致命:origin/dev 不是提交,无法从中创建分支“dev””解决方案是“git fetch”按照下面 Bradley Flood 的解决方案,然后重新运行 mohit 的答案。 (2认同)

Bra*_*ood 41

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

现在你可以 git checkout MyNewBranch

完成:)


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


Ale*_* N. 31

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

git pull origin BRANCH
Run Code Online (Sandbox Code Playgroud)

这假设您的本地分支是从origin/BRANCH创建的.

  • 但首先你需要执行“git checkout -b xyz”,然后执行“git pull origin xyz” (3认同)
  • 这会将分支拉入您当前的本地分支,因此当您使用“dev”并使用“git pull origin feature”时,它会将功能分支拉入“dev”。提出问题的人想要创建一个新分支“feature”并拉入该分支 (2认同)

Adr*_*aud 15

简单地说,如果你想从 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
Run Code Online (Sandbox Code Playgroud)


ana*_*nik 13

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

git fetch repo xyz:xyz
git checkout xyz
Run Code Online (Sandbox Code Playgroud)


Ban*_*nty 10

这些对我有用。

  1. 将特定的远程分支拉取到当前所在的本地分支。(<remote_repo>远程仓库在哪里,<remote_branch>是你要拉取的特定远程分支)
git pull <remote_repo> <remote_branch>
Run Code Online (Sandbox Code Playgroud)

例如

git pull origin remote_master
Run Code Online (Sandbox Code Playgroud)
  1. 将特定的远程分支拉取到特定的本地分支。(<local_branch>你要拉入的具体本地分支在哪里)
git pull <remote_repo> <remote_branch>:<local_branch>
Run Code Online (Sandbox Code Playgroud)

例如

git pull origin remote_master:local_master
Run Code Online (Sandbox Code Playgroud)


小智 6

你也可以这样做

git pull -r origin master
Run Code Online (Sandbox Code Playgroud)

修复合并冲突(如果有)

git rebase --continue
Run Code Online (Sandbox Code Playgroud)

-r 用于变基。这将使你的分支结构来自

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch
Run Code Online (Sandbox Code Playgroud)

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch
Run Code Online (Sandbox Code Playgroud)

这将带来更干净的历史。注意:如果您已经将其他分支推送到原点(或任何其他远程),则可能必须在变基后强制推送您的分支。

git push -f origin other-branch
Run Code Online (Sandbox Code Playgroud)


小智 6

git pull <gitreponame> <branchname>
Run Code Online (Sandbox Code Playgroud)

通常,如果您只将存储库分配给您的代码,那么 gitreponame 将是 origin。

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

BranchName 应存在于相应的 gitreponame 中。

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

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>
Run Code Online (Sandbox Code Playgroud)


Vic*_*cky 6

我做了

git branch -f new_local_branch_name origin/remote_branch_name
Run Code Online (Sandbox Code Playgroud)

代替

git branch -f new_local_branch_name upstream/remote_branch_name
Run Code Online (Sandbox Code Playgroud)

正如@innaM 所建议的那样。当我使用上游版本时,它说'fatal: Not a valid object name:'upstream/remote_branch_name''。我没有git fetch origin按照评论的建议去做,而是简单地替换upstreamorigin. 我猜他们是等价的。


小智 6

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

git checkout --track origin/the-branch-name
Run Code Online (Sandbox Code Playgroud)

确保分支名称完全相同。