如何从别人的回购中拉出远程分支

时间:2011-05-04 14:14:56

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

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

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

假设如下:

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

6 个答案:

答案 0 :(得分:289)

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

对评论的回应:

  

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

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

git branch --set-upstream foo colin/foo

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

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

答案 1 :(得分:74)

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

抓住他们的提交:

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

答案 2 :(得分:5)

如果antak回答:

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&#39;的建议)使用

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

答案 3 :(得分:2)

如果分叉存储库受保护,因此您不能直接将其推送到存储库中,而您的目标是更改其foo,则需要像这样将其分支foo放入存储库中:

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

答案 4 :(得分:0)

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

示例:

修复您的不安全代码#8
alice 希望将1个提交从your_repo:master合并到her_repo:branch

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

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

答案 5 :(得分:0)

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

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