应先执行 git remote add upstream https://github.com/original-owner/repo-name.git 添加上游远程,再通过 git fetch upstream 和 git merge --ff-only upstream/main 安全同步更新。

怎么给 fork 的仓库添加上游远程(upstream)
不加 upstream,你就没法自动拉取原项目的新提交——很多人卡在这步,直接在自己 fork 里 git pull,结果报错 There is no tracking information for the current branch。
必须手动关联原仓库地址,且推荐用 HTTPS(不用输 SSH 密钥):
git remote add upstream https://github.com/original-owner/repo-name.git
- 执行前先确认当前在主分支(比如
main或master),别在临时分支上操作 - 如果提示
remote upstream already exists,说明之前加过,跳过这步 - 加完后用
git remote -v检查:能看到两行,origin指向你的 fork,upstream指向原仓库
拉取上游更新但不自动合并(安全做法)
直接 git pull upstream main 会强行合并,一旦你本地有未 push 的修改,可能触发冲突甚至覆盖逻辑。生产环境或协作中应避免。
推荐分两步走,可控性强:
git fetch upstream<br>git merge --ff-only upstream/main
-
fetch只下载对象,不动工作区和当前分支指针,可随时检查差异:git log --oneline ..upstream/main -
--ff-only确保只做快进合并;如果失败,说明本地有 diverge 提交,这时不该强合,而该人工判断是否 rebase - 若想同步到其他分支(比如你维护的是
dev),先git checkout dev,再git merge --ff-only upstream/main(注意目标分支是upstream/main,不是upstream/dev)
遇到「refusing to merge unrelated histories」怎么办
这是 Git 2.9+ 默认行为,常见于你 fork 后首次尝试合并 upstream,但两个仓库历史完全无关(比如原项目 init 后你才 fork,又自己 commit 过)。
这不是错误,是保护机制。解决方式明确且唯一:
git merge --allow-unrelated-histories upstream/main
- 仅首次需要加这个 flag,之后再 merge 就恢复正常流程
- 加了之后 Git 会把两个根提交连起来,形成一个共同祖先,后续
--ff-only就能用了 - 别用
--no-commit或--squash替代,那会破坏原始提交时间线和作者信息,对开源协作不友好
同步时要不要 push 到自己的 origin
要,但得想清楚推什么。多数人只需要同步主干(如 main),不需要把你本地实验性分支也推上去。
- 同步完
main后,运行git push origin main,确保 GitHub 上的 fork 也更新了 - 如果你改过
main并提交过 PR,又刚从 upstream 拉了新提交,push 前务必确认没丢掉自己的改动——git log origin/main..main能看出哪些是你独有的 - 别写
git push --force,除非你 100% 确认远程没人基于你旧的main开发,否则会打断别人协作
真正麻烦的不是命令记不住,而是搞不清「当前分支是谁的、上游有没有新提交、我本地改过什么、别人有没有基于我的旧提交继续开发」——这些信息全靠几个 git log 和 git status 组合来交叉验证,少看一眼就容易出事。


















