我有一个托管在 GitHub 上的项目,有人分叉了该项目。在他们的 fork 上,他们创建了一个新分支“foo”并进行了一些更改。如何将他们的“foo”拉到我的仓库中也名为“foo”的新分支中?
我知道他们可以向我提交拉取请求,但我想自己启动这个过程。
假设如下:
因为他们分叉了我的项目,所以我们的两个存储库共享相同的“历史”尽管 GitHub 显示他们的项目是从我的项目中分叉的,但我的本地存储库没有对这个人的项目的任何引用。我需要将它们添加为遥控器吗?我还没有一个名为“foo”的分支——我不知道我是否需要先手动创建它。我绝对希望将其拉入一个单独的分支,而不是我的主人。
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
不,您不需要将它们添加为遥控器。每次都这样做很麻烦而且很痛苦。
抓住他们的承诺:
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_HEAD
和 HEAD
替换为 ournameforbranch
。
master
分支),则其他答案不起作用
git branch -m newbranch
,git 将失去理智并开始说您的 repo 不再有效。 git init
似乎修复了它并使您或多或少地回到您之前的状态,分支名为“newbranch”。
以下是一个很好的权宜之计解决方案,它与 GitHub 一起用于从另一个用户的 fork 中签出 PR 分支。您需要知道拉取请求 ID(GitHub 与 PR 标题一起显示)。
例子:
拉取请求 #8
alice 想要将 1 个提交从 her_repo:branch
合并到 your_repo:master
git checkout -b <branch>
git pull origin pull/8/head
用 her_repo:branch 中的分支名称替换
如果您将其命名为与 origin 不同的名称,请替换您的遥控器的名称。
用正确的拉取请求 ID 替换 8。
如果安塔克的回答是:
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>
更新:这似乎不再起作用,因为 Github 改变了他们的 UI,我们希望他们能恢复它
GitHub 相对于前面的答案有一个新选项,只需从 PR 复制/粘贴命令行:
滚动到 PR 底部以查看 Merge 或 Squash and merge 按钮 单击右侧的链接:查看命令行说明 按步骤 1 右侧的 Copy 图标 将命令粘贴到终端中
如果分叉的 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
git fetch 上游 pull/
git://
URL 来代替//path/to/coworkers/repo.git
。 (描述这就是我的回答太慢的原因;))