Git 和 Git 中心概念:在本地审查更新的拉取请求
Git and GitHub concepts: Reviewing updated pull requests locally
我遵循通用的 OSS 结构:
- 托管在 GitHub
上的 OSS 远程存储库
- 将OSS远程仓库fork到我自己的远程仓库
- 在我的远程存储库上克隆一个分支以创建一个本地存储库
因此,贡献者将在本地创建一个新分支,将更改推送到 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/*
,因此如果上游当前设置为 <origin
、master
> 对,名称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>
我遵循通用的 OSS 结构:
- 托管在 GitHub 上的 OSS 远程存储库
- 将OSS远程仓库fork到我自己的远程仓库
- 在我的远程存储库上克隆一个分支以创建一个本地存储库
因此,贡献者将在本地创建一个新分支,将更改推送到 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/*
,因此如果上游当前设置为 <origin
、master
> 对,名称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>