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

Col*_*ell 246 git github git-pull git-remote git-branch

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

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

假设如下:

  1. 因为他们分叉我的项目,我们的回购共享相同的'历史'
  2. 虽然GitHub显示他们的项目是从我的分叉,但我的本地存储库没有任何对此人项目的引用.我需要将它们添加为遥控器吗?
  3. 我还没有一个名为"foo"的分支 - 我不知道是否需要先手动创建它.
  4. 我绝对希望把它拉进一个单独的分支而不是我的主人.

ral*_*nja 320

git remote add coworker git://path/to/coworkers/repo.git
git fetch coworker
git checkout --track coworker/foo
Run Code Online (Sandbox Code Playgroud)

这将设置一个本地分支foo,跟踪远程分支coworker/foo.因此,当您的同事做出一些更改时,您可以轻松地将它们拉出来:

git checkout foo
git pull
Run Code Online (Sandbox Code Playgroud)

回复评论:

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

即使我推荐它,您也不需要创建新分支.你也可以直接提交foo并让你的同事拉你的分支.但是该分支已经存在,您的分支foo需要设置为它的上游分支:

git branch --set-upstream foo colin/foo
Run Code Online (Sandbox Code Playgroud)

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

git remote add colin git://path/to/colins/repo.git
Run Code Online (Sandbox Code Playgroud)

  • 这非常快:)你可能想补充一点,他应该使用来自其他人的GitHub存储库页面的`git://`URL代替`// path/to/coworkers/repo.git`.(描述那是我的回答太慢的原因;)) (3认同)
  • 3分钟内给出很好的答案! (2认同)

ant*_*tak 89

不,您不需要将它们添加为遥控器. 这将是繁琐的,每次都很痛苦.

抓住他们的提交:

git fetch git@github.com:theirusername/reponame.git theirbranch:ournameforbranch
Run Code Online (Sandbox Code Playgroud)

这将创建一个名为local的分支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
Run Code Online (Sandbox Code Playgroud)

如果在分离状态下工作担心你,请务必创建一个分支使用:ournameforbranch和替换FETCH_HEAD以及HEAD上面的ournameforbranch.

  • 谢谢你这样做,如果你和另一个人都具有相同名称的分支(例如默认的`master`分支),那么另一个答案将不起作用。 (2认同)
  • 值得一提的是,如果您没有与github帐户相关联的SSH密钥之类的东西,则此方法将不起作用,请参阅/sf/ask/905843851/ (2认同)

Sub*_*ion 16

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

例子:

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

git checkout -b <branch>
git pull origin pull/8/head
Run Code Online (Sandbox Code Playgroud)

如果与origin.
替换8为正确的拉取请求 ID。

  • 这需要更多的赞成票。完美地工作并避免了我在投票最高的答案中遇到的“致命:找不到远程引用”错误。谢谢! (4认同)
  • 2行简单的代码。感谢您分享这个!唯一比这更甜蜜的事情是以一种简单的方式将更新合并回他们的拉取请求中。 (2认同)

Pet*_*ter 10

如果antak回答:

git fetch git@github.com:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 
Run Code Online (Sandbox Code Playgroud)

给你:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
Run Code Online (Sandbox Code Playgroud)

然后(按照Przemek D的建议)使用

git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>
Run Code Online (Sandbox Code Playgroud)


Rob*_*era 7

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

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


J S*_*ith 5

如果分叉的回购受到保护,因此您无法直接推入其中,并且您的目标是更改他们的 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
Run Code Online (Sandbox Code Playgroud)

现在您有一个 foo 的本地副本,没有与之关联的上游。您可以提交更改(或不提交),然后将您的 foo 推送到您自己的远程存储库。

git push --set-upstream origin foo
Run Code Online (Sandbox Code Playgroud)

现在 foo 位于您在 GitHub 上的存储库中,并且您的本地 foo 正在跟踪它。如果他们继续对 foo 进行更改,您可以获取他们的更改并合并到您的 foo 中。

git checkout foo 
git fetch protected_repo
git merge protected_repo/foo
Run Code Online (Sandbox Code Playgroud)