Git subtree场景下如何提取指定补丁提交至上游仓库
提取subtree子目录指定patch提交上游的操作方法
你可以按以下步骤操作,全程在parent仓库根目录执行即可:
- 第一步:拆分child子树的独立提交历史
执行命令将child/目录下的所有提交从parent仓库的整体历史中剥离,生成结构和child上游仓库完全对齐的独立本地分支:
这个命令不会改动你现有工作区的任何内容,只会生成一个名为git subtree split --prefix=child -b temp-child-splittemp-child-split的临时分支,分支上的所有提交都只包含child/目录的改动,提交哈希会和parent仓库里的原哈希不同。 - 第二步:定位目标提交
用日志命令找到你要贡献的那个patch在拆分分支上的对应提交哈希:
根据提交说明、改动内容匹配到对应的提交,记录它的哈希值即可。git log temp-child-split --oneline - 第三步:生成标准可提交的patch文件
执行命令提取单个patch,会自动保留原提交的作者信息、提交时间、提交说明:
生成的patch文件会存放在git format-patch -1 <上一步查到的拆分分支提交哈希> -o ./upstream-patches./upstream-patches目录下,你只需要切到本地克隆的child上游仓库,执行git am <对应的patch文件路径>就能把改动打进去,测试无问题即可贡献给上游。
快捷方案(不保留提交元信息)
如果你不需要保留原提交的作者、提交说明等信息,打算重新整理提交内容,可以不用拆分分支,直接导出子目录下的改动:
git show <parent仓库里目标patch的原哈希> -- child/ > child-upstream.patch
这个方式生成的patch只包含child/目录下的改动,你可以在上游仓库手动apply后重新提交。
注意:如果你的目标patch里混了parent仓库其他目录的无关改动,记得在拆分后的临时分支上用交互式rebase清理掉无关内容,再生成patch,避免给上游提交无效改动。操作完可以直接删掉临时分支
git branch -D temp-child-split,不会对原有仓库造成任何影响。
内容的提问来源于stack exchange,提问作者CLOVIS
相关产品推荐
相关产品推荐

