【问题标题】:How to pull remote branch from somebody else's repo如何从别人的仓库中拉出远程分支
【发布时间】:2011-08-18 14:13:26
【问题描述】:

我有一个托管在 GitHub 上的项目,有人分叉了该项目。在他们的 fork 上,他们创建了一个新分支“foo”并进行了一些更改。如何将他们的“foo”拉到我的仓库中也名为“foo”的新分支中?

我知道他们可以向我提交拉取请求,但我想自己启动这个过程。

假设如下:

  1. 因为他们分叉了我的项目,所以我们的两个存储库共享相同的“历史”
  2. 虽然 GitHub 显示他们的项目是从我的项目中分叉出来的,但我的本地存储库没有任何对这个人项目的引用。我需要添加他们的遥控器吗?
  3. 我还没有名为“foo”的分支 - 我不知道是否需要先手动创建它。
  4. 我绝对希望将其拉入单独的分支,而不是我的主分支。

【问题讨论】:

    标签: git github git-branch git-pull git-remote


    【解决方案1】:
    git remote add coworker git://path/to/coworkers/repo.git
    git fetch coworker
    git checkout --track coworker/foo
    

    这将设置一个本地分支foo,跟踪远程分支coworker/foo。因此,当您的同事进行了一些更改时,您可以轻松拉取它们:

    git checkout foo
    git pull
    

    对 cme​​ts 的回应:

    酷 :) 如果我想自己做 更改该分支,我应该 创建第二个本地分支“bar” 来自“foo”并在那里工作而不是 直接在我的“foo”上?

    即使我推荐它,您也不需要创建新分支。你不妨直接提交到foo 并让你的同事拉你的分支。但是该分支已经存在,您的分支foo 需要设置为它的上游分支:

    git branch --set-upstream foo colin/foo
    

    假设colin 是以类似方式定义的您的存储库(您的同事存储库的远程):

    git remote add colin git://path/to/colins/repo.git
    

    【讨论】:

    • 那非常快 :) 你可能想补充一点,他应该使用其他人的 GitHub 存储库页面中的 git:// URL 来代替 //path/to/coworkers/repo.git。 (描述那是什么让我的回答太慢了;))
    • 酷 :) 如果我想对该分支进行自己的更改,我是否应该从“foo”创建第二个本地分支“bar”并在那里工作而不是直接在我的“foo”上工作“?
    • 或者直接在我的“foo”中工作并稍后拉/合并他的更改是否安全?这里的最佳做法是什么?
    • 完美,这正是我想要的 :) 感谢您的帮助!!
    • 3 分钟内给出很好的答案!
    【解决方案2】:

    不,您不需要将它们添加为遥控器。每次都这样做既麻烦又痛苦。

    获取他们的提交:

    git fetch git@github.com:theirusername/reponame.git theirbranch:ournameforbranch
    

    这将创建一个名为 ournameforbranch 的本地分支,这与 theirbranch 对它们的用途完全相同。对于问题示例,最后一个参数是foo:foo

    注意:ournameforbranch 如果想出一个不与您自己的分支之一冲突的名称很麻烦,可以进一步省略部分。在这种情况下,可以使用名为 FETCH_HEAD 的引用。您可以git log FETCH_HEAD 查看他们的提交,然后执行cherry-picked 之类的操作来挑选他们的提交。

    回馈给他们:

    很多时候,你想修复他们的一些东西,然后把它推回去。这也是可能的:

    git fetch git@github.com:theirusername/reponame.git theirbranch
    git checkout FETCH_HEAD
    
    # fix fix fix
    
    git push git@github.com:theirusername/reponame.git HEAD:theirbranch
    

    如果在detached state 工作让您担心,请务必使用:ournameforbranch 创建一个分支,并将上面的FETCH_HEADHEAD 替换为ournameforbranch

    【讨论】:

    • 谢谢您,如果您和其他人都有同名的分支(如默认的master 分支),则其他答案不起作用
    • 值得一提的是,如果您的 github 帐户没有 SSH 密钥之类的东西,此方法将不起作用,请参阅stackoverflow.com/questions/12940626
    • 你不是必须被添加为合作者,这样你才能推送到他们的仓库吗?
    • @Honey 当然可以!推送假设您在远程端具有推送所需的权限。获取同样假设路径是可访问的。
    • 如果你在这种分离状态下运行git branch -m newbranch,git 会失去理智并开始说你的 repo 不再有效。 git init 似乎修复了它,让你或多或少回到以前的状态,分支名为“newbranch”。
    【解决方案3】:

    以下是一个很好的权宜之计解决方案,可与 GitHub 一起使用,以从其他用户的 fork 中检出 PR 分支。您需要知道拉取请求 ID(GitHub 与 PR 标题一起显示)。

    例子:

    修复您的不安全代码 #8
    alice 想要将 1 个提交合并到来自 her_repo:branchyour_repo:master

    git checkout -b <branch>
    git pull origin pull/8/head
    

    如果与origin 不同,请替换您的遥控器。
    用正确的拉取请求 ID 替换 8

    【讨论】:

    • 这需要更多的支持。完美地工作并避免了我得到最高投票答案的“致命:找不到远程参考”错误。谢谢!
    • 2 行简单代码。感谢分享这个!唯一比这更甜蜜的事情是以简单的方式将更新合并到他们的拉取请求中。
    • 这是最好的答案。
    【解决方案4】:

    如果安塔克的回答:

    git fetch git@github.com:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 
    

    给你:

    Permission denied (publickey).
    fatal: Could not read from remote repository.
    
    Please make sure you have the correct access rights
    and the repository exists.
    

    然后(按照 Przemek D 的建议)使用

    git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>
    

    【讨论】:

      【解决方案5】:

      更新:这似乎不再有效,因为 Github 改变了他们的 UI,我们希望他们能恢复它


      GitHub 相对于前面的答案多了一个新选项,只需从 PR 复制/粘贴命令行即可:

      1. 滚动到 PR 底部以查看 MergeSquash and merge 按钮
      2. 点击右侧链接:view command line instructions
      3. 按步骤 1 右侧的复制图标
      4. 在终端中粘贴命令

      【讨论】:

        【解决方案6】:

        如果分叉的 repo 受到保护,因此您不能直接推入其中,并且您的目标是更改他们的 foo,那么您需要像这样将他们的分支 foo 放入您的 repo:

        git remote add protected_repo https://github.com/theirusername/their_repo.git
        git fetch protected_repo 
        git checkout --no-track protected_repo/foo
        

        现在您有了 foo 的本地副本,没有与之关联的上游。您可以提交更改(或不提交),然后将您的 foo 推送到您自己的远程仓库。

        git push --set-upstream origin foo
        

        现在 foo 位于您在 GitHub 上的存储库中,并且您的本地 foo 正在跟踪它。如果他们继续对 foo 进行更改,您可以获取他们的并合并到您的 foo 中。

        git checkout foo 
        git fetch protected_repo
        git merge protected_repo/foo
        

        【讨论】:

          【解决方案7】:

          git fetch upstream pull//head:

          【讨论】:

            猜你喜欢
            • 2017-03-08
            • 2015-07-12
            • 2021-04-07
            • 1970-01-01
            • 2015-04-24
            • 1970-01-01
            • 2012-08-16
            • 1970-01-01
            • 2021-05-16
            相关资源
            最近更新 更多