fork工作流与上游同步
# Fork 工作流与上游同步
# 什么是 Fork?
Fork 是在远程平台上(如 GitHub、Gitee)创建一个属于你自己的仓库副本。与 git clone 不同,Fork 发生在远程平台层面,会在平台上创建一个新的远程仓库。
典型场景:
- 你想基于某个开源项目做二次开发(二开),但不想直接修改原仓库
- 你想给开源项目贡献代码,先 Fork 到自己账号下,修改后提 PR(Pull Request)回原仓库
- 团队基于上游框架二开,需要定期同步上游的更新
关键概念:
| 术语 | 含义 |
|---|---|
| upstream(上游) | 原始仓库(被 fork 的仓库) |
| origin(源) | 你 fork 出来的仓库(你自己的远程仓库) |
| local(本地) | 你本地克隆的仓库 |
upstream(原仓库) ← fork ← origin(你的 fork) ← clone ← local(本地)
1
# 实战:基于 RuoYi-Vue-Plus 二开
以我的点餐项目为例,后端基于 dromara/RuoYi-Vue-Plus 二开:
# 1. 在 Gitee 上 Fork
在 Gitee 上打开 dromara/RuoYi-Vue-Plus 仓库页面,点击右上角 Fork 按钮,fork 到自己账号下。
Fork 完成后,你账号下会多一个仓库:dream-deeply-tyu/RuoYi-Vue-Plus。
# 2. 克隆你的 Fork 到本地
git clone https://gitee.com/dream-deeply-tyu/RuoYi-Vue-Plus.git backend
cd backend
1
2
2
此时 origin 自动指向你的 fork:
git remote -v
# origin https://gitee.com/dream-deeply-tyu/RuoYi-Vue-Plus.git (fetch)
# origin https://gitee.com/dream-deeply-tyu/RuoYi-Vue-Plus.git (push)
1
2
3
2
3
# 3. 添加 upstream 远程
git remote add upstream https://gitee.com/dromara/RuoYi-Vue-Plus.git
1
验证:
git remote -v
# origin https://gitee.com/dream-deeply-tyu/RuoYi-Vue-Plus.git (fetch) ← 你的 fork
# origin https://gitee.com/dream-deeply-tyu/RuoYi-Vue-Plus.git (push)
# upstream https://gitee.com/dromara/RuoYi-Vue-Plus.git (fetch) ← 原仓库
# upstream https://gitee.com/dromara/RuoYi-Vue-Plus.git (push)
1
2
3
4
5
2
3
4
5
origin 和 upstream 的区别:
origin:你有推送权限,日常开发推送到这里upstream:你通常只有拉取权限,用于同步原仓库的更新
# 分支策略
基于 fork 二开时,推荐以下分支策略:
| 分支 | 用途 | 操作 |
|---|---|---|
master | 只用于同步上游,不做任何业务改动 | 定期 git merge upstream/master |
cm-dev(开发分支) | 所有二开业务代码 | 日常开发提交 |
为什么不在 master 上做业务改动?
如果 master 上有你的业务代码,每次同步上游时会产生大量冲突。保持 master 干净(与上游一致),二开代码全在开发分支上,同步上游时只需处理开发分支的冲突。
# 创建开发分支
git checkout -b cm-dev
git push -u origin cm-dev
1
2
2
# 同步上游更新
当原仓库(upstream)有新版本发布时,你需要把更新同步到你的 fork:
# 步骤一:拉取上游最新代码
# 拉取 upstream 的所有分支信息(不合并,只更新本地引用)
git fetch upstream
1
2
2
# 步骤二:同步 master 分支
# 切到 master 分支
git checkout master
# 合并上游 master 的更新
git merge upstream/master
# 推送到你的 fork(保持 origin/master 与 upstream/master 一致)
git push origin master
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
因为 master 不做业务改动,这里通常是 fast-forward 合并,不会有冲突。
# 步骤三:将上游更新合并到开发分支
# 切到开发分支
git checkout cm-dev
# 合并 master 的更新(此时 master 已包含上游最新代码)
git merge master
# 如果有冲突,手动解决后:
git add .
git commit
# 推送到你的 fork
git push origin cm-dev
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
这一步可能会有冲突(你的二开代码与上游更新重叠的地方),需要手动解决。
# 完整同步流程(速查)
# 1. 拉取上游更新
git fetch upstream
# 2. 同步 master
git checkout master
git merge upstream/master
git push origin master
# 3. 合并到开发分支
git checkout cm-dev
git merge master
# 解决冲突(如果有)
git push origin cm-dev
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 贡献代码回上游(提 PR)
如果你想给原仓库贡献代码:
# 1. 在开发分支上完成修改并推送到你的 fork
git push origin cm-dev
# 2. 在 Gitee/GitHub 上发起 Pull Request
# 源分支:你的 fork 的 cm-dev
# 目标分支:upstream 的 master(或 dev)
1
2
3
4
5
6
2
3
4
5
6
提 PR 前,建议先同步上游最新代码,确保你的代码基于最新版本,减少冲突。
# 远程仓库管理命令速查
# 查看所有远程仓库
git remote -v
# 添加远程仓库
git remote add <名称> <url>
# 示例:git remote add upstream https://gitee.com/dromara/RuoYi-Vue-Plus.git
# 删除远程仓库
git remote remove <名称>
# 示例:git remote remove upstream
# 修改远程仓库地址
git remote set-url <名称> <新url>
# 示例:git remote set-url origin https://gitee.com/new-user/RuoYi-Vue-Plus.git
# 重命名远程仓库
git remote rename <旧名称> <新名称>
# 示例:git remote rename upstream origin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 常见问题
# Q:Fork 之后,原仓库更新了,我的 Fork 会自动更新吗?
不会。Fork 是一次性复制,之后两者完全独立。需要手动 git fetch upstream + git merge 来同步。
# Q:我可以 push 到 upstream 吗?
通常不行。除非原仓库给你分配了写权限。所以日常开发推送到 origin(你的 fork),同步更新从 upstream 拉取。
# Q:Fork 和 clone 有什么区别?
| Fork | clone | |
|---|---|---|
| 操作位置 | 远程平台(Gitee/GitHub) | 本地 |
| 是否创建新远程仓库 | 是,创建一个属于你的远程副本 | 否,只克隆到本地 |
| 与原仓库关系 | 远程层面有关联(平台记录了 fork 关系) | 无关联,只是本地副本 |
# Q:同步上游时冲突太多怎么办?
如果二开改动较大,同步上游时冲突可能很多。建议:
- 小步同步:不要攒了几个月再同步,定期(如每周)同步一次,冲突更小
- 保持 master 干净:master 只同步上游,业务代码全在开发分支
- 按模块隔离改动:二开代码放在独立模块/目录中,减少与上游代码的交叉
# 学习参考
上次更新: 2026/7/24 16:59:26