331

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

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

假设如下:

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

7 回答 7

453
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
于 2011-05-04T14:17:35.347 回答
149

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

抓住他们的承诺:

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

如果在分离状态下工作让您担心,请务必使用:ournameforbranch和替换FETCH_HEADHEAD以上创建一个分支ournameforbranch

于 2017-03-10T10:40:17.730 回答
19

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

例子:

修复你的不安全代码#8
alice想要将 1 个提交合并到your_repo:masterfromher_repo:branch

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

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

于 2018-11-11T05:51:29.293 回答
18

如果安塔克的回答是:

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>
于 2017-09-04T08:05:08.967 回答
7

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


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

  1. 滚动到 PR 底部以查看MergeSquash and merge按钮
  2. 点击右侧链接:view command line instructions
  3. 按步骤 1 右侧的复制图标
  4. 将命令粘贴到终端
于 2019-01-15T13:00:00.640 回答
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
于 2018-10-16T05:56:10.477 回答
-1

git fetch 上游 pull/<pr_number>/head:<your_local_branch_name>

于 2021-11-26T12:10:31.507 回答