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

我有一个项目托管在GitHub有人已经分叉。在他们的fork上,他们创建了一个新的分支“foo”并做了一些更改。我如何拉他们的“foo”到一个新的分支也命名为“foo”在我的回购?

我知道他们可以向我提交撤诉请求,但我想自己启动这个程序。

假设:

  1. 因为他们分叉了我的项目,所以我们的回购都有相同的“历史”
  2. 虽然GitHub显示他们的项目是从我的分叉,我的本地存储库没有任何引用到这个人的项目。我需要添加他们的遥控器吗?
  3. 我还没有一个叫“foo”的分支-我不知道我是否需要手动创建这个。
  4. 我绝对想把它拉到一个单独的分支,而不是我的主人。
214238 次浏览
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"上?< / p >

您不需要创建一个新的分支,尽管我建议这样做。你也可以直接提交到foo并让你的同事拉你的分支。但是这个分支已经存在,你的分支foo需要被设置为它的上游分支:

git branch --set-upstream foo colin/foo

假设colin是你的存储库(一个远程到你同事的存储库),定义方式类似:

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

接受的答案工作,但你不需要将它们添加为遥控器,因为这将是累赘和痛苦的做每一次。

获取它们的提交:

git fetch git://path/to/coworkers/repo.git theirbranch:ournameforbranch

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

git://path/to/coworkers/repo.git部分应该替换为他们GitHub存储库页面上的URL。一个SSH URL看起来像git@github.com:theirusername/reponame.git,而一个HTTPS URL看起来像https://github.com/theirusername/reponame.git

注意:ournameforbranch部分可以进一步省略,如果考虑一个与你自己的分支不冲突的名字是麻烦的。在这种情况下,可以使用名为FETCH_HEAD的引用。你可以git log FETCH_HEAD查看它们的提交,然后做一些类似cherry-picked的事情来挑选它们的提交。

把它推给他们:

通常情况下,你想修复他们的一些东西,并把它推回去。这也是可能的:

git fetch git://path/to/coworkers/repo.git theirbranch
git checkout FETCH_HEAD


# fix fix fix


git push git://path/to/coworkers/repo.git HEAD:theirbranch

如果你担心在< em > < / em >分离状态中工作,可以使用:ournameforbranch创建一个分支,并用ournameforbranch替换上面的FETCH_HEADHEAD

如果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>

如果fork 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推到你自己的远程repo。

git push --set-upstream origin foo

现在foo在你的GitHub回购和你的本地foo正在跟踪它。如果他们继续对foo进行更改,你可以获取他们的并合并到你的foo中。

git checkout foo
git fetch protected_repo
git merge protected_repo/foo

下面是一个很好的权宜之计的解决方案,它与GitHub一起工作,用于从另一个用户的分支签出PR分支。你需要知道拉请求ID (GitHub与PR标题一起显示)。

例子:

把请求 #8
alice想从her_repo:branch合并1提交到your_repo:master

git checkout -b <branch>
git pull origin pull/8/head
  • her_repo:branch中的分支名替换<branch>
  • 如果遥控器的名称与origin不同,请替换遥控器的名称。
  • 用正确的拉请求ID替换8

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


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

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

get upstream pull/<pr_number>/head:<your_local_branch_name>