ChatGPT解决这个技术问题 Extra ChatGPT

如何从别人的仓库中拉出远程分支

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

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

假设如下:

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


r
ralphtheninja
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

这非常快 :) 您可能想要补充一点,他应该使用来自其他人的 GitHub 存储库页面的 git:// URL 来代替 //path/to/coworkers/repo.git。 (描述这就是我的回答太慢的原因;))
酷 :) 如果我想对该分支进行自己的更改,我是否应该从“foo”创建第二个本地分支“bar”并在那里工作而不是直接在我的“foo”上工作?
或者直接在我的“foo”中工作并稍后拉/合并他的更改是否安全?这里的最佳做法是什么?
完美,这正是我一直在寻找的 :) 感谢您的帮助!!
3分钟内回答好!
a
antak

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

抓住他们的承诺:

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


谢谢您,如果您和其他人都有同名的分支(如默认的 master 分支),则其他答案不起作用
值得一提的是,如果您的 github 帐户没有 SSH 密钥之类的东西,此方法将不起作用,请参阅 stackoverflow.com/questions/12940626
您不必添加为合作者,以便您可以推送到他们的仓库吗?
@Honey 当然!推送假设您在远程端具有推送所需的权限。获取同样假设路径是可访问的。
如果您在此分离状态下运行 git branch -m newbranch,git 将失去理智并开始说您的 repo 不再有效。 git init 似乎修复了它并使您或多或少地回到您之前的状态,分支名为“newbranch”。
S
Subfuzion

以下是一个很好的权宜之计解决方案,它与 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。


这需要更多的赞成票。完美地工作并避免了我得到最高投票答案的“致命:找不到远程参考”错误。谢谢!
2行简单的代码。感谢分享这个!唯一比这更甜蜜的事情是以简单的方式将更新合并到他们的拉取请求中。
这是最好的答案。
这个答案不清楚
P
Peter

如果安塔克的回答是:

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>

R
Robert Monfera

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

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

滚动到 PR 底部以查看 Merge 或 Squash and merge 按钮 单击右侧的链接:查看命令行说明 按步骤 1 右侧的 Copy 图标 将命令粘贴到终端中


J
J Smith

如果分叉的 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

r
raghava

git fetch 上游 pull//head: