You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git subtree场景下如何提取指定补丁提交至上游仓库

提取subtree子目录指定patch提交上游的操作方法

你可以按以下步骤操作,全程在parent仓库根目录执行即可:

  • 第一步:拆分child子树的独立提交历史
    执行命令将child/目录下的所有提交从parent仓库的整体历史中剥离,生成结构和child上游仓库完全对齐的独立本地分支:
    git subtree split --prefix=child -b temp-child-split
    
    这个命令不会改动你现有工作区的任何内容,只会生成一个名为temp-child-split的临时分支,分支上的所有提交都只包含child/目录的改动,提交哈希会和parent仓库里的原哈希不同。
  • 第二步:定位目标提交
    用日志命令找到你要贡献的那个patch在拆分分支上的对应提交哈希:
    git log temp-child-split --oneline
    
    根据提交说明、改动内容匹配到对应的提交,记录它的哈希值即可。
  • 第三步:生成标准可提交的patch文件
    执行命令提取单个patch,会自动保留原提交的作者信息、提交时间、提交说明:
    git format-patch -1 <上一步查到的拆分分支提交哈希> -o ./upstream-patches
    
    生成的patch文件会存放在./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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:36:16