Git 中的 origin 和 upstream 区别
FreeGuideOnline
最新
2026-07-06
bash git clone https://github.com/your-username/awesome-project.git cd awesome-project
此时查看远程信息:
```bash
git remote -v
输出示例:
origin https://github.com/your-username/awesome-project.git (fetch)
origin https://github.com/your-username/awesome-project.git (push)
3. 添加原始仓库为 Upstream
为了持续获取原始项目的更新,你需要手动添加 upstream 别名:
git remote add upstream https://github.com/original-author/awesome-project.git
再次查看远程信息,确认配置正确:
origin https://github.com/your-username/awesome-project.git (fetch)
origin https://github.com/your-username/awesome-project.git (push)
upstream https://github.com/original-author/awesome-project.git (fetch)
upstream https://github.com/original-author/awesome-project.git (push)
注意:
upstream的 push 地址同样存在,但你没有推送权限,任何推送尝试都会失败。可以将其移除或忽略。
Origin 与 Upstream 的核心区别
| 对比维度 | origin | upstream |
|---|---|---|
| 指向仓库 | 你自己的 Fork 仓库,即个人远程副本 | 原始项目的官方仓库,即上游仓库 |
| 读写权限 | 拥有完整的读取和写入权限,可自由 push | 通常只有读取权限,无法直接 push |
| 主要用途 | 存放并分享你的个人修改、实验分支、Pull Request 的源分支 | 作为代码同步的来源,获取最新官方更新 |
| 工作流中的角色 | 个人开发中心,所有本地改动首先推送到这里 | 官方代码基线,保持你的 Fork 与上游同步 |
日常开发中的典型操作
同步上游更新
在开始新功能之前,务必先将 upstream/main 的最新提交合并到本地:
# 拉取上游所有分支的最新信息
git fetch upstream
# 切换到本地主分支(通常为 main 或 master)
git checkout main
# 将上游的 main 分支合并到本地
git merge upstream/main
# 将更新后的本地 main 推送到你的 origin
git push origin main
这一步确保你的 Fork 和本地仓库都包含了官方的最新代码,避免后续出现复杂的合并冲突。
创建功能分支并推送
永远不要在 main 分支上直接开发。创建一个描述性的功能分支:
git checkout -b feature/awesome-improvement
# ... 进行代码修改并提交 ...
git push -u origin feature/awesome-improvement
-u 参数将本地分支与 origin 的远程分支建立跟踪关系,之后可以直接使用 git push 和 git pull。
提交 Pull Request
- 将功能分支推送到你的
origin仓库后,访问原始仓库页面。 - 发起新的 Pull Request,通常将 原始仓库的 main 分支 设为 base,将 你 Fork 仓库的功能分支 设为 compare。
再次同步上游(变基方式)
为了保持 Pull Request 的提交历史整洁,可以使用 rebase:
git fetch upstream
git checkout feature/awesome-improvement
git rebase upstream/main
# 解决可能的冲突后:
git push -f origin feature/awesome-improvement # 由于改写了历史,需要强制推送
常见问题与最佳实践
-
Q:可以不用 upstream,直接添加原始仓库作为另一个 origin 吗?
A:技术上可行,但会混淆。明确的命名让命令更具可读性,团队协作时更易沟通。 -
Q:为什么
git remote -v中 upstream 也有 push 地址?
A:这是git remote add的默认行为。你可以通过以下命令移除 push 地址,防止误操作:git remote set-url --push upstream no_push