拉请求是Git的一部分,还是GitHub、Gerrit和Atlassian Stash等工具的一项功能?

拉请求是Git的一部分,还是GitHub、Gerrit和Atlassian Stash等工具的一项功能?,git,github,gerrit,pull-request,bitbucket-server,Git,Github,Gerrit,Pull Request,Bitbucket Server,拉请求似乎是使用Git进行代码审查的常用方法。但是,当使用内置的git请求pull或其他工具时,这个术语的含义是否相同尚不清楚 pull请求是Git的固有功能,还是GitHub、Gerrit或Atlassian Stash等工具的通用术语 代码评审的讨论和“结果”是存储在Git提交历史记录中还是存储在单独的数据库中?该命令可用于在本机Git中创建“拉请求”。运行时,Git会生成对项目和Git存储库URL的更改摘要,从中可以提取代码。然后可以将其邮寄到邮件列表或项目维护人员,他们可以将更改拉入自己

拉请求似乎是使用Git进行代码审查的常用方法。但是,当使用内置的
git请求pull
或其他工具时,这个术语的含义是否相同尚不清楚

pull请求是Git的固有功能,还是GitHub、Gerrit或Atlassian Stash等工具的通用术语

代码评审的讨论和“结果”是存储在Git提交历史记录中还是存储在单独的数据库中?

该命令可用于在本机Git中创建“拉请求”。运行时,Git会生成对项目和Git存储库URL的更改摘要,从中可以提取代码。然后可以将其邮寄到邮件列表或项目维护人员,他们可以将更改拉入自己的存储库


Pro-Git一书中包含了有关
Git-request-pull
命令的更多具体信息。

pull-requests是一个简单的概念,它起源于Git创建时,但从那时起被带到了不同的级别

其本质是,您没有对您想要贡献的存储库的推送权限,因此您可以使用fork存储库,制作您的私有副本(一个克隆已经这样做了),然后贡献给该存储库。然后,您要求原始存储库的维护人员引入您的更改。所以你基本上是在提交补丁

正如我所说的,有不同的方法可以做到这一点,但归根结底都是要求维护人员引入您的更改,因此得名。Git最初是为Linux内核创建的,他们一直在使用邮件列表进行开发。所以对他们来说,拉请求实际上是每封电子邮件发送一个补丁;这些补丁实际上是提交对象,由Git的一些普通电子邮件通信工具预先准备好

git request pull
是一个类似的工具,用于生成请求pull请求的消息。但在这种情况下,它更接近拉的想法。虽然补丁可以直接应用,但是由
request pull
创建的请求实际上告诉维护人员从不同的远程存储库中提取更改

政府有以下例子:

$ git request-pull origin/master myfork
The following changes since commit 1edee6b1d61823a2de3b09c160d7080b8d1b3a40:
  John Smith (1):
        added a new function

are available in the git repository at:

  git://githost/simplegit.git featureA

Jessica Smith (2):
      add limit to log function
      change log output to 30 from 25

 lib/simplegit.rb |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)
因此,它实际上只是一个生成消息以执行底层概念的实用工具

像GitHub这样的其他源代码宿主也做类似的事情。当您在GitHub上创建一个pull请求时,您只需创建一个问题,其中包含维护人员可以在哪里提交的进一步信息。当然,这一切都是在一个网站上,他们可以链接一切多一点,并提供这些一键合并按钮,例如

但基本概念仍然是一样的:要求维护人员引入您所做的一些更改。唯一的区别是该请求的通信方式

其本质是,您没有对您想要贡献的存储库的推送权限,因此您可以使用fork存储库,制作您的私有副本(一个克隆已经这样做了),然后贡献给该存储库

这不再是Git 2.29(2020年第4季度)的唯一选项:

通过“
git push
”接受请求的“()”学会了将大部分ref更新外包到新的“
proc receive
”hook

参见,,,,(2020年8月27日)作者 (于2020年9月25日合并)

:添加新的
proc receive
hook 签字人:姜欣

Git调用内部的
execute_commands
函数来处理从客户端发送到
Git接收包的命令

无论用户推送什么引用,如果用户具有写权限,Git都会创建或更新相应的引用

没有写入权限的参与者无法直接推送到存储库。
因此,参与者必须将提交写入备用位置,并通过电子邮件或其他方式发送请求。
我们将此工作流称为分布式工作流

集中式工作流中工作会更方便,就像Gerrit在某些情况下提供的那样

例如,无法直接推送到分支的只读用户可以运行以下()命令将提交推送到伪引用(前缀为“
refs/For/
”,而不是“
refs/heads/
”),以创建代码审阅

git push origin \
    HEAD:refs/for/<branch-name>/<session>  
在收到命令后,钩子将执行该命令,并可能创建/更新不同的引用

例如,伪引用“
refs/For/master/topic
”的命令可以创建/更新不同的引用,例如“
refs/pull/123/head

备选参考名称和其他状态在选项行中给出

从“
proc receive
”返回的命令列表将替换从用户发送到“
receive pack
”的相关命令,“
receive pack
”将继续运行
“execute\u commands
”功能和其他例程

最后,这些命令的执行结果将报告给最终用户

从“
receive pack
”到“
send pack
”的报告功能将在后一个提交中扩展,就像“
proc receive
”钩子报告“
receive pack
”一样


嗨,我看到你引用了这个网站,但是我已经有好几天无法访问这个网站了。“你还能够到它吗?”斯塔克底流说,真奇怪。它对我有用。不过,你可以从源代码中读取它。除了花哨的图案,还是一样的。谢谢,这很有价值!这里也有任何问题的证据:在我看来,几乎像是一些糟糕的DNS缓存。一定有人在看,因为现在我也可以再看一次了。ch5-2太棒了!这让我放心,我昨天想到的基本上是正确的:谢谢你的解释!我想
# Version and features negotiation.
S: PKT-LINE(version=1\0push-options atomic...)
S: flush-pkt
H: PKT-LINE(version=1\0push-options...)
H: flush-pkt  

# Send commands from server to the hook.
S: PKT-LINE(<old-oid> <new-oid> <ref>)
S: ... ...
S: flush-pkt
# Send push-options only if the 'push-options' feature is enabled.
S: PKT-LINE(push-option)
S: ... ...
S: flush-pkt  

# Receive result from the hook.
# OK, run this command successfully.
H: PKT-LINE(ok <ref>)
# NO, I reject it.
H: PKT-LINE(ng <ref> <reason>)
# Fall through, let 'receive-pack' to execute it.
H: PKT-LINE(ok <ref>)
H: PKT-LINE(option fall-through)
# OK, but has an alternate reference.  The alternate reference name
# and other status can be given in options
H: PKT-LINE(ok <ref>)
H: PKT-LINE(option refname <refname>)
H: PKT-LINE(option old-oid <old-oid>)
H: PKT-LINE(option new-oid <new-oid>)
H: PKT-LINE(option forced-update)
H: ... ...
H: flush-pkt