【问题标题】:Git pull a certain branch from GitHubGit 从 GitHub 拉取某个分支
【发布时间】:2010-12-15 02:46:51
【问题描述】:

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

其实我的答案在这里: Push and pull branches in Git

但我收到一个错误“![rejected]”和一些关于“非快进”的信息。

有什么建议吗?

【问题讨论】:

  • 你运行的实际命令是什么?
  • 获取可能会失败并显示“非快进”消息。您是否修改了远程跟踪分支(origin/xyz),或者分支是否在远程存储库中重绕/重写?您可能需要使用“git fetch origin --force”,但请在使用之前阅读文档。

标签: git merge branch github pull


【解决方案1】:

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

这是因为 Git 无法将分支中的更改合并到您当前的 master 中。假设您已签出分支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!

【讨论】:

  • 不,问题在于获取,而不是合并步骤。
  • 通常,远程设置为强制提取,即使它们不会导致快进提交,所以它不应该发生在 fetch 上,除非 OP 用通常的方式更改了某些内容配置。在 fetch 合并期间可能会出现快进问题。是什么让您说问题肯定出在获取上,而不是在合并上?
  • 我遵循这些步骤(获取、合并)。 Git告诉我没有什么可做的。当我尝试提交时,它会抱怨快进。
  • @mipadi 我和 Jean 有同样的问题,虽然我不能说遥控器是以你提到的非默认方式设置的,但我可以说使用 git fetch -f 解决了我的问题!谢谢!
  • 这会将远程分支xzy 合并到本地分支master,这不是原始问题所暗示的; “如何从 GitHub 中提取分支 xyz 并将其合并到本地主机上的分支 xyz 中?”
【解决方案2】:

只需明确地跟踪您的远程分支,一个简单的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

【讨论】:

  • 如果你得到'Not a valid object name: 'origin/remote_branch_name',请先执行'git fetch origin'。
【解决方案3】:

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

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

git pull origin xyz:xyz

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

git checkout -b xyz

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

然后你做:

git pull origin xyz

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

【讨论】:

  • 完美!我只是不知道这种语法:git pull {repo} {remotebranchname}:{localbranchname}。问题,如果那个 pull 不起作用(也许有人更新了分支并且会有合并冲突)我有什么选择?
  • 我对此表示反对,因为它试图将远程分支合并到您当前的分支中(例如 master)。这不是大多数人想要做的,也不是 OP 要求的。 @mohit 的答案是正确的选择。
  • Phrogz - 看起来这种行为在最新版本的 Git 中有所改变。我以前用过这个,效果很好。
  • 答案严重误导!!!我在没有注意到@Phrogz 的评论的情况下应用了答案,现在遇到了他/她提到的问题。要么它试图合并的分支应该明确表达,要么答案应该被删除!!!!
  • @Phrogz,@Letitbe 您尝试了哪个命令?我可以相应地改变答案。从来没有把它拉进主人的问题。
【解决方案4】:

最好的办法是:

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

【讨论】:

  • 在 github 上创建新的“dev”分支并尝试上述方法后,我收到以下错误消息:“fatal: origin/dev is not a commit and a branch 'dev' cannot be created从中”解决方案是按照 Bradley Flood 下面的解决方案“git fetch”,然后重新运行 mohit 的答案。
【解决方案5】:

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

现在你可以git checkout MyNewBranch

完成:)


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

【讨论】:

  • 它运行良好 git fetch,然后 git checkout remoteBranch
【解决方案6】:

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

git pull origin BRANCH

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

【讨论】:

  • 这会将分支拉入您当前的本地分支,因此当您在devgit pull origin feature 上时,它会将功能分支拉入dev。问这个问题的人想创建一个新分支feature并拉入这个分支
【解决方案7】:

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

【讨论】:

    【解决方案8】:

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

    git fetch repo xyz:xyz
    git checkout xyz
    

    【讨论】:

      【解决方案9】:

      你可以使用从 GitHub 拉取分支

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

      确保分支名称完全相同。

      【讨论】:

        【解决方案10】:

        我做到了

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

        【讨论】:

        • 为我工作。谢谢
        【解决方案11】:
        git pull <gitreponame> <branchname>
        

        通常,如果您只为您的代码分配了 repo,那么 gitreponame 将是 origin。

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

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

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

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

        【讨论】:

          【解决方案12】:

          你也可以

          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
          

          这将导致更清晰的历史记录。 注意:如果您已经将 other-branch 推送到 origin(或任何其他远程),您可能必须在 rebase 后强制推送您的分支。

          git push -f origin other-branch
          

          【讨论】:

            【解决方案13】:

            你可以试试

            git branch -a
            

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

            git checkout theBranch //进入分支

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

            【讨论】:

              猜你喜欢
              • 2022-01-08
              • 1970-01-01
              • 2011-01-03
              • 1970-01-01
              • 2018-06-04
              • 2012-03-03
              • 2015-12-06
              • 1970-01-01
              • 2016-10-15
              相关资源
              最近更新 更多