PR中的P为什么是pull而非push?

1. 问题引入

修改一段代码,push到远程,创建PR,等待维护者评审合并到主干。这里PR,为什么叫 Pull Request ,而不是 Push Request?


2. 理解pull 含义

回答上面问题之前,要先理解**"Pull"** 这个词在 Git 里有双重含义:

  1. 技术层面git pull 是一个具体的命令,用于下载代码。
  2. 协作层面Pull Request 是一种协作机制,意思是"我准备好了,请你来拉取"。

git pull 、git push 属于具体的git命令行操作;Pull Request 不是git操作,是一个社交动作。


3. 为什么叫 Pull Request

为什么叫 Pull Request(拉取请求)而不是 Push Request,需要从Git 的底层逻辑和协作的安全模型两个角度来看。

3.1 发起 PR的流程

在 GitHub/GitLab 等平台上,"发起 PR"并不是一个 Git 命令行操作,而是一个平台层面的动作。具体步骤如下:

  1. 你本地操作

    • 你在本地分支修改代码。
    • git add .
    • git commit -m "fix bug"
    • git push origin your-branch (注意:这里你只是推送到你自己的远程分支,或者你在 Fork 后的仓库中)
  2. 平台操作(发起 PR)

    • 打开 GitHub/GitLab 网页界面。
    • 点击 "New Pull Request" 按钮。
    • 选择对比分支:
      • Base branch(目标分支):比如 main(你想合并进去的地方)。
      • Compare branch(源分支):比如 your-branch(你刚才推送代码的地方)。
    • 填写标题、描述,点击 "Create Pull Request"。

此时,PR 就发起了, 它本质上是一个通知+链接,告诉维护者:"请看这两个分支的差异,如果没问题,请把它们合并。"

3.2 为什么不叫 Push

虽然你确实执行过 git push操作,将代码提交到自己的远程分支。PR 的核心语义是"请求对方来拉取你的代码",你没有权限直接将代码写入(push)到别人仓库。

操作 谁主动? 权限要求 安全性
Push 你主动推送到别人仓库 你需要有写权限(Write Access) ❌ 高风险:任何人都能直接改主分支,容易出错或被恶意注入
Pull Request 你请求别人从你这里拉取 你只需要有读权限或对自己 Fork 仓库的写权限 ✅ 高安全:维护者控制是否合并,经过审查后才生效

具体来说:

  1. 你不能直接 Push 到别人的主分支

    • 在开源项目或大型团队中,普通开发者没有权限 直接 git pushmain 分支。
    • 如果你尝试 git push origin main,Git 会拒绝你:"Permission denied"。
  2. 所以你把代码推送到"你能控制"的地方

    • 要么是你 Fork 后的个人仓库(如 github.com/yourname/project)。
    • 要么是你自己在原仓库中创建的一个特性分支(如 feature/login),你有这个分支的写权限。
  3. 然后你"请求"维护者来 Pull 你的代码

    • 你通过 PR 说:"我的代码已经准备好了,放在我的分支里,请你(维护者)从我的分支 **拉取(Pull)**这些更改,并合并到你的主分支中。"
    • 维护者点击 "Merge" 按钮时,GitHub 后台实际上是在执行类似 git pull 的操作,将你的更改整合进主分支。

3.3 简单总结

问题 答案
发起 PR 的流程 在网页上点击"Create Pull Request",指定源分支和目标分支,生成一个可审查的代码变更请求。
为什么叫 Pull Request? 因为你没有权限直接 Push 到主分支,所以你请求维护者从你的分支拉取(Pull)代码并合并。这是一种被动式、受控的协作方式,确保代码经过审查。
我明明 push 了啊? 你 push 的是你自己的分支,不是主分支。PR 是连接"你的分支"和"主分支"的桥梁。

4. 理清git pull、git push、pull request 三者关系

我们可以从动作发起者数据流向两个维度来梳理这三者关系。

操作 谁主动? 数据流向 是否需要审查?
git pull 远程 → 本地 否(自动同步)
git push 本地 → 远程 否(直接上传)
Pull Request 你发起,维护者执行 你的分支 → 主干分支 是(核心目的)

git pull(本地拉取)

  • 发起者:你自己(开发者)。
  • 方向:远程仓库 → 本地仓库。
  • 目的:同步最新代码。比如同事合并了代码,你需要把远程主分支的最新变化"拉"下来,保持本地代码最新。

git push(本地推送)

  • 发起者:你自己(开发者)。
  • 方向:本地仓库 → 远程仓库。
  • 目的:备份或分享代码。把你本地写好的提交(commit)上传到远程分支。
  • 注意:你通常只能 push 到你有权限写入的分支(比如你自己的 fork 仓库,或者团队中分配给你的特性分支)。

Pull Request / PR(请求拉取)

  • 发起者:你自己(开发者),但执行合并动作的是维护者。
  • 方向:你的远程分支 → 目标远程分支(如 main)。
  • 本质:这不是一个 Git 命令,而是一个社交/管理动作
    • 你说:"我的代码在我的分支里,请你(维护者)把它 拉(Pull)进主干。"
    • 维护者审查后,点击 Merge,GitHub/GitLab 后台实际上执行了一次类似 pullmerge 的操作,将你的代码整合进主干。
相关推荐
水云桐程序员2 小时前
Git是什么?怎样使用?
git·学习方法
Allen_LVyingbo2 小时前
面向医疗群体智能的协同诊疗与群体决策支持系统(上)
数据结构·数据库·人工智能·git·python·动态规划
deng-c-f2 小时前
配置(14):git创建分支,跟确保正确提交分支
git
callJJ3 小时前
Git 分支合并到测试分支(dep-qa)教程
大数据·git·elasticsearch
爱钓鱼的程序员小郭3 小时前
Git 使用文档
git
IT布道3 小时前
[Git] 源码服务器主/备备份方案
运维·服务器·git
lpfasd1234 小时前
Win11笔记本睡眠唤醒致命bug:NUL设备丢失致Git等工具瘫痪
git·bug
AI自动化工坊4 小时前
基于Git Worktree的OpenSwarm多Agent开发团队实践
git
墨倾许5 小时前
从零搭建运维学习环境(2026):WSL + Docker + Git + VS Code 完全指南
运维·git·学习·docker·容器·bash