Git 和 Git 中心概念:在本地审查更新的拉取请求

Git and GitHub concepts: Reviewing updated pull requests locally

我遵循通用的 OSS 结构:

  1. 托管在 GitHub
  2. 上的 OSS 远程存储库
  3. 将OSS远程仓库fork到我自己的远程仓库
  4. 在我的远程存储库上克隆一个分支以创建一个本地存储库

因此,贡献者将在本地创建一个新分支,将更改推送到 his/her 远程存储库,然后向 OSS 的远程存储库发起拉取请求。

这一直运作良好。但是,当我尝试通过摆弄 local.

来审查另一个贡献者的拉取请求时,主要问题就来了

所以我使用以下命令获取了对 OSS 远程存储库的拉取请求:

git fetch upstream pull/<PR#>/head:<branchName>

其次是git checkout <branchName>

并且成功了。我研究了 PR,并在 GitHub 上对其进行了审查。然后,贡献者通过将新提交推送到他们的分支(在他们的远程仓库上)来更新 PR,这会自动反映在 PR 中。

现在,我希望能够在本地获取更新,以便再次尝试更改。我了解到我的PR分支的副本默认不跟踪远程分支,所以我尝试将其设置为跟踪PR:

git branch --set-upstream upstream/pull/<PR#>/head:<branchName>

就像我第一次获取分支时所做的那样。但是,我得到的答复是

error: the requested upstream branch 'pull//head:' does not exist

我再次尝试:

git branch --set-upstream-to upstream/pull/<PR#>/head:<branchName>

也因同样的错误而失败。

然后,我想,是不是因为 PR 就像某人远程存储库上分支的 'reflection',所以如果我想跟踪上游分支,我应该从该人的远程存储库跟踪?

所以我将贡献者的远程仓库添加为远程,然后再次尝试:

git branch --set-upstream-to <newRemote> <branchName>

我仍然遇到同样的错误。

我进行了一些谷歌搜索,我找到了 this, but I do not want to get all the pull requests. I also found links like this one 但是没有,不是我需要的帮助。

任何人都可以指出我现在做事的方式有什么问题吗?谢谢!

编辑:除了下面由 Marina Liu - MSFT 提出的方法之外,还有更简单的方法吗?

这里的问题(或者至少是第一个问题)是您不能使用上游来引用 GitHub 拉取请求引用。

在Git中,分支上的上游由两部分组成:

  • 遥控器名称,例如origin
  • 该遥控器上的 分支 的名称,例如 master

Git 将这两个放在一起得到 refs/heads/master——这是遥控器上的名字 ——然后通过 fetch 遥控器的设置。名为 origin 的远程的标准 fetch 设置是 +refs/heads/*:refs/remotes/origin/*,因此如果上游当前设置为 <originmaster> 对,名称Git 在 你自己的 存储库中查找的是 refs/remotes/origin/master,这是你的 remote-tracking 他们 master.[=34= 的名称]

请注意此处假设远程 上的名称refs/heads/ 开头。

GitHub 上拉取引用的实际名称以 refs/pull/ 开头,而不是 refs/heads/,因此您想要的拉取请求 #123 提交的全名是refs/pull/123/head无法拼写以 refs/heads/ 开头的名称,因为这不是 branch 名称。

现在,您可以按照 your first link 中的建议-添加 一个额外的 fetch 设置:

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

这会导致他们的 refs/pull/123/head 与您的 refs/remotes/origin/pr/123 相关联。根据您的特定 Git 版本,some sometimes 甚至 mostly 有效。某些 Git 版本有时会变得相当混乱。如果您尝试它并且它对您有用,那就太好了,如果您出于某种原因升级或降级 Git 版本,请准备好清理一些混乱。

aliases found via your second link 更好。这些从一个特定的拉取请求中获取,创建一个本地分支名称(或者如果它已经存在则覆盖它——这有点危险,但只要你不命名你自己的分支 pr/<em>integer</em> 你会没事的)。您可以改进它们,编写一个真正的 git-pr 脚本来创建一个本地分支——一定要使用全名格式,refs/heads/pr/<em>number</em>,以保证正确性——并设置一些附加信息,以便当您在该分支上时,git pr 自动更新该分支。

(如果有空闲时间,我可能会自己写脚本,因为这样会很方便。)

您可以使用以下任何选项来更新本地仓库中的 PR。

选项 1:删除本地源分支并重新创建以获取更新

当你使用命令在本地获取PR的源代码分支时:

git fetch upstream pull/<PR#>/head:<branchName>
git checkout <branchname>

如果 PR 更新(新提交被推送到 fork 仓库),您可以通过以下方式删除并重新创建:

git checkout master
git branch -D <branchname>
git fetch upstream pull/<PR#>/head:<branchName>
git checkout <branchname>

选项 2:将 fork 仓库添加为本地仓库的远程仓库

您可以通过

将分支仓库添加为本地仓库的远程仓库
git remote add fork1 <URL for the fork repo> -f

然后可以通过

为PR源分支创建一个本地分支
git checkout -b <branchname> fork1/<branchname>

如果PR已经更新,您只需要执行以下命令即可获取更新:

git fetch fork1
git checkout <branchname> #If HEAD is not on the <branchname>
git reset --hard fork1/<branchname>