fork是平台级仓库复制,非Git命令;clone是本地Git操作,下载远程仓库到本地;branch是仓库内轻量级并行开发线。三者分属不同层级,不可互换。

fork 和 clone 不是同一类操作,不能互换,也不能“先 fork 再 clone”或“先 clone 再 fork”来混用——它们发生在不同层级、解决不同问题。
fork 是平台级仓库复制,不是 Git 命令
GitHub、GitLab 等平台提供的 fork 功能,本质是在你账号下新建一个远程仓库,内容与原仓库(如 octocat/Hello-World)初始一致,但从此独立。它不依赖本地 Git 安装,也不调用任何 git 命令。
常见错误现象:
- 在终端执行
git fork报错:command not found —— 因为它根本不是 Git 内置命令 - 以为 fork 后就能直接
git push到原仓库 —— 实际只能推到你自己的 fork 仓库(如yourname/Hello-World)
使用场景明确:你想向别人项目提 PR,必须先 fork;想私有化衍生一个项目,也该 fork。
clone 是本地 Git 操作,把远程仓库完整拉到电脑上
git clone 的目标是生成一个带完整 .git 目录的本地副本,无论这个远程仓库是你自己创建的、别人 fork 出来的,还是原始上游仓库。
关键参数差异:
-
git clone https://github.com/yourname/Hello-World.git→ 拉取你 fork 后的仓库 -
git clone https://github.com/octocat/Hello-World.git→ 拉取原始仓库(你无权 push) -
git clone --depth 1可跳过历史,但会丢失 fork 后同步 upstream 所需的提交链
性能影响:clone 大仓库时,--shallow-since 或 --filter=blob:none 能显著提速,但会限制后续 git merge upstream/main 的能力。
fork 后必须 clone 才能本地开发
fork 只发生在 GitHub 页面点击按钮那一刻;你真正开始改代码,得靠 git clone 把那个新 fork 出来的远程仓库下载到本地。
典型流程:
- 在 GitHub 上点
Fork→ 得到https://github.com/yourname/repo git clone https://github.com/yourname/repo.git-
git remote add upstream https://github.com/original-owner/repo.git(配置上游,方便同步) -
git fetch upstream && git merge upstream/main(拉最新改动)
容易踩的坑:忘了配 upstream,导致长期基于过期 fork 开发;或者误把 origin 指向了原始仓库,结果 git push 失败并报 Permission denied。
branch 是仓库内部的轻量操作,和 fork/clone 无关
git branch 只在已有本地仓库里建指针,不涉及远程或平台行为。你在 clone 来的本地目录中执行 git checkout -b feat/login,和 fork 或原始仓库毫无关系。
但协作中常混淆的点:
- PR 是基于分支发起的,但 PR 的源必须来自你有写权限的远程仓库(即你的 fork),不是原始仓库
-
git push origin feat/login推的是你 fork 仓库里的分支,不是原始仓库的分支 - 原始维护者合并 PR 后,你的 fork 仓库不会自动更新 —— 仍需手动
git fetch upstream同步
复杂点在于:fork/clone/branch 三者常串联使用,但各自边界清晰。最容易被忽略的是「fork 后不配置 upstream 就开干」,结果白忙活半天,PR 还可能因基线太旧被拒收。


















