如何从其他人的仓库中提取远程分支


265

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

我了解他们可以向我提交请求请求,但我想亲自启动此过程。

假设以下内容:

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

Answers:


349
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

对评论的回应:

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

即使我建议您也不需要创建新分支。您不妨直接致力于foo并让您的同事拉您的分支。但是该分支已经存在,您的分支foo需要设置为该分支的上游分支:

git branch --set-upstream foo colin/foo

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

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

3
速度非常快:)您可能想要补充一点,他应该使用git://其他人的GitHub存储库页面中的URL代替//path/to/coworkers/repo.git。(这就是让我的回答太慢的原因;)
马克·朗伊尔

酷:)而且,如果我想对该分支进行自己的更改,是否应该从“ foo”创建第二个本地分支“ bar”并在那里工作而不是直接在我的“ foo”上工作?
Colin O'Dell

还是直接在我的“ foo”中工作并稍后合并/合并他的更改是否安全?这是最佳做法?
Colin O'Dell,

1
完美,这正是我想要的东西:)感谢您的帮助!
Colin O'Dell,

1
在3分钟内回答好!
Tieme,2014年

103

不,您不需要将它们添加为遥控器。 那样会很麻烦,而且每次都很难。

抓住他们的承诺:

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

如果在分离状态下工作让您感到烦恼,请务必使用创建一个分支:ournameforbranchFETCH_HEAD并使用替换和HEAD以上ournameforbranch


2
谢谢您这样做,如果您和另一个人都具有相同名称的分支(如默认master分支),则另一个答案将不起作用
Job

2
值得一提的是,如果您没有与自己的github帐户相关联的SSH密钥之类的东西,则此方法将不起作用,请参阅stackoverflow.com/questions/12940626
Przemek D

您不是必须被添加为协作者,这样您才能进行他们的回购吗?
亲爱的

@蜂蜜当然!推送假定您具有在远端进行推送的必要权限。提取同样假定该路径可访问。
antak

如果您git branch -m newbranch在此分离状态下运行,git将失去理智,并开始说您的存储库不再有效。git init似乎已解决此问题,并通过名为“ newbranch”的分支使您或多或少地恢复了以前的状态。
伊恩·希克森

14

如果是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的建议)使用

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

6

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

例:

修复你的不安全的代码#8
爱丽丝想合并1到承诺your_repo:masterher_repo:branch

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

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


2
这需要更多的支持。可以完美地工作,并避免了我在投票最多的答案中遇到的“致命:找不到远程引用”错误。谢谢!
Michael Romrell '19

2行简单代码。感谢您分享!唯一比这更甜蜜的事情是以轻松的方式将更新合并回他们的请求中。
klewis

4

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

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

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.