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 pushgit pull

提交 Pull Request

  1. 将功能分支推送到你的 origin 仓库后,访问原始仓库页面。
  2. 发起新的 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