如何排除配置提交,仅将功能代码提交PR至上游仓库?
GitHub项目开发中隔离本地配置变更的方案
1. 你设想的流程是否可行?
这个流程的核心思路没问题,但存在可以简化和优化的细节:
- 步骤4无需创建PR从
my/config到my/feature-dev,因为都是你自己fork仓库内的分支,直接在本地切换到my/feature-dev,执行git merge my/config就能把配置变更合并进来,没必要走PR流程。 - 步骤6的核心需求是剥离配置提交、只保留功能提交到
my/feature-release,单纯基于my/master创建分支后直接合并my/feature-dev会把配置变更带进去,需要借助Git的提交筛选功能实现,不能直接按原步骤操作。
2. 如何创建排除指定提交的分支?
这里不是“克隆分支时排除提交”,而是基于目标分支(my/master)创建新分支,将my/feature-dev中除配置提交外的功能提交迁移过去,有两种常用方法:
方法1:使用git rebase --onto(推荐,适合线性提交历史)
假设my/config分支的提交ID是abc123,my/feature-dev是合并该配置提交后做的功能开发:
- 确保本地仓库同步最新状态:
git fetch origin - 创建并切换到
my/feature-release分支:git checkout -b my/feature-release origin/my/master - 执行rebase命令,将
my/feature-dev中在abc123之后的所有功能提交迁移到my/feature-release上:
执行完成后,git rebase --onto my/feature-release abc123 my/feature-devmy/feature-release就只包含功能提交,配置提交被完全排除。 - 将分支推送到你的fork仓库:
git push origin my/feature-release
如果my/config有多个提交,只需找到这些提交的父提交(即my/master上的基准提交ID,比如def456),把命令中的abc123替换成def456即可。
方法2:使用git cherry-pick(适合挑选零散提交)
如果my/feature-dev中的功能提交是零散分布的,可以逐个挑选:
- 创建并切换到
my/feature-release分支:git checkout -b my/feature-release origin/my/master - 查看
my/feature-dev的提交历史,筛选出所有功能提交的ID(排除配置提交ID):git log --oneline my/feature-dev - 逐个将功能提交cherry-pick到当前分支:
git cherry-pick 提交ID1 提交ID2 ... - 推送分支到fork仓库:
git push origin my/feature-release
另外,还有更省心的长期方案:可以让Git直接忽略本地配置文件的变更,无需单独维护配置分支。比如对conf.h和advanced_conf.h执行:
git update-index --assume-unchanged conf.h advanced_conf.h
这样Git会忽略这些文件的本地修改,不会在git status中显示,也不会被提交。如果之后需要修改并提交这些文件,执行git update-index --no-assume-unchanged即可取消忽略。
内容的提问来源于stack exchange,提问作者filimonic
相关产品推荐
相关产品推荐

