Github如何Fork仓库后合并上游变更且不向原仓库提交自有修改
首先明确你对Pull Request的认知误区:Pull Request存在方向区分,只有从你的Fork仓库分支向上游原仓库分支发起PR,才会申请将你的修改合并到上游仓库;如果是从上游原仓库分支向你的Fork仓库分支发起PR,只会把上游的更新同步到你自己的仓库,不会向上游提交任何你的自有变更。
以下是适配你需求的最佳操作方案,分为你正在使用的GitHub Desktop操作和Git命令行操作两种路径:
方式1:GitHub Desktop操作(适配你当前的使用习惯)
- 第一步:添加上游远程源
打开对应仓库的GitHub Desktop界面,点击顶部菜单栏「Repository」→「Repository settings」→「Remote」,在「Upstream remote」栏填入上游原仓库的克隆地址,点击保存。 - 第二步:拉取上游最新提交
点击顶部「Fetch origin」旁的下拉箭头,选择「Fetch from upstream」,这一步只会拉取上游的更新内容,不会自动合并到你的本地分支。 - 第三步:合并上游更新到本地分支
点击顶部菜单栏「Branch」→「Merge into current branch」,在弹出的分支列表里选择upstream/master(上游的master分支),点击「Merge upstream/master into master」。 - 第四步:手动解决冲突
若存在冲突,GitHub Desktop会自动弹出冲突文件列表,点击每个冲突文件,工具会高亮显示冲突区域,你可以逐行选择保留上游内容、保留你的本地修改,或是手动编辑混合两者内容,所有冲突解决完成后点击「Commit merge」。 - 第五步:同步到你的Fork远程仓库
点击顶部「Push origin」,你的GitHub Fork仓库就完成了更新,既保留了所有本地定制修改,也同步了上游的最新提交,全程不会向上游提交任何内容。
方式2:Git命令行操作(灵活性更高)
- 检查并添加上游远程源
执行git remote -v查看当前绑定的远程仓库,如果没有上游仓库(upstream)的记录,执行git remote add upstream 上游原仓库的克隆地址完成添加。 - 拉取上游最新提交
执行git fetch upstream拉取上游所有最新的提交记录。 - 合并上游更新到本地master分支
确保你当前处于本地master分支,执行git merge upstream/master启动合并。 - 手动解决冲突
出现冲突的文件会被Git标记,打开文件找到<<<<<<< HEAD到>>>>>>> upstream/master的冲突块,逐行修改为你需要的最终内容,所有冲突修改完成后执行git add 冲突文件名,全部文件处理完后执行git commit完成合并。 - 推送到你的Fork远程仓库
执行git push origin master即可完成你自己Fork仓库的更新。
后续更规范的操作建议
为了后续同步上游更便捷,建议你调整分支使用规则:
- 把当前的所有定制修改迁移到独立的开发分支,执行
git checkout -b my-custom,后续所有适配需求的修改都在这个分支提交。 - 你的本地master分支保持和上游完全同步,每次同步上游时先切换到master分支,执行
git pull upstream master && git push origin master,这个分支不会产生任何冲突。 - 需要把上游更新同步到你的定制分支时,切换到
my-custom分支执行git merge master,只需要解决一次冲突即可,长期迭代效率更高。
内容的提问来源于stack exchange,提问作者DLo
相关产品推荐
相关产品推荐

