如何在Git上发送拉取请求

60
我们最近从SVN迁移到了Git。我们在我们的局域网中的一台机器上设置了一个裸仓库,并在其他机器上进行了克隆。现在,当任何人做出更改并提交时,我们希望他将拉取请求发送到裸仓库(通过告知、电子邮件或其他方式),之后将会对更改进行审核并在裸仓库上拉取它(就像在GitHub上工作一样)。
我们是否需要安装任何界面或者Git本身有一些命令可以使用?
3个回答

82

Git(软件)和GitHub(网络服务)都有一个名为“pull request”的概念,但很不幸,它们并不完全相同。

原生 Git

原生的 Git request-pull 命令有一个非常简短的手册页面,其中包含以下一句话描述:

总结两个提交之间的更改,并将给定的 URL 包含在生成的摘要中。

这是一个相当低级的命令,生成适合发布到邮件列表的更改简短摘要。其他用户可以使用此“pull request”中发布的 URL 手动拉取更改到自己的存储库。

GitHub Pull 请求

使用GitHub 网络服务时,Pull Request 是一个功能齐全的交互式协作工具。GitHub pull request 具有以下功能:

  • 比单个提交摘要更详细的更改说明
  • 自动发送通知给选择关注该项目的用户
  • 在线审查界面,其他人可以对建议的更改发表评论
  • 记录关于提交的对话评论
  • 集中管理 pull 请求,以防它们丢失

值得注意的是,Linus 对这两个功能的相对实用性有自己的看法

结论

上述两个“pull request”功能在精神上相似,但在实现上完全不同。特别是,git request-pull 命令不能用于在 GitHub 上创建新的 Pull Request。如果您想支持“pull request”类型的功能,则有几个选择:

  • 使用GitHub。这肯定需要最少的努力,但如果您的项目不是公开的,您将不得不支付GitHub来托管私人存储库。有些人可能对这个选择不感到舒适。
  • 使用Gerrit。Gerrit是一个开源服务器程序,您可以下载它提供许多与GitHub中可用功能类似的功能。它特别适合协作代码审查。
  • 使用git request-pull和邮件列表。使用此方法需要更多的工程师纪律性,因为很容易错过或处理邮件列表信息。此方法没有与之关联的中央责任。

2
我明白你的意思。当出现这种情况时,你可以使用 git revert 创建一个新的提交来撤销带有错误的更改。然后你推送那个新的提交。Git非常灵活,所以如果这是一个大型团队的问题,你可以让开发人员先推送到一个中间仓库。然后,一个集成工程师会从中间仓库拉取更改,如果测试通过,然后将这些更改推送到主要仓库。开发人员会从主要仓库拉取,这样他们就知道他们有经过测试的可行代码。 - Greg Hewgill
8
@Greg:这并不特定针对 Github。git-request-pull(http://www.kernel.org/pub/software/scm/git/docs/git-request-pull.html)是每个 Git 发行版的一部分。 - eckes
3
我已经重新改写了上述答案,旨在回应被“踩”的关注。 - Greg Hewgill
有一个名为hub(https://github.com/github/hub)的官方Github项目可以帮助您从命令行发送pull request。 - OOO
2
这个问题还应该提到像Gitorious和Gitlab这样的GitHub克隆,它们复制了GitHub的Pull Request界面。 - strugee
显示剩余3条评论

57

8
请注意,GitHub 并不使用 git request-pull 命令。请参阅 https://github.com/torvalds/linux/pull/17#issuecomment-5654674。 - user1203803

10

"Git方式" 是这样做的:所有开发人员在服务器上都有自己的公共bare库(读权限所有人,写权限仅为本人)。如果您想要一个额外的“主干”(或“稳定”或您想要什么名称)的bare仓库,一些或所有开发人员都可以对其进行写入访问。开发人员将其仓库镜像到自己的公共仓库中,并从其他开发人员那里拉取。这样,如果您将尚未完成的内容推送到公共仓库中,您不必担心。(开发人员可以从您的仓库拉取到测试分支并查看是否有效)。当您有一个稳定的规范分支时,可以将其推送到“主干”仓库。


而且,这也默认所有开发者首先都有一个公共服务器。在家庭和移动ISP应用运营商级网络地址转换(CGNAT)的时代,这该如何实现呢? - Damian Yerrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接