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

Git中如何提取两个提交之间未变更的共同代码?

提取两个Git提交间未改动代码并打包的方法

没问题!Git本身没有直接的git common-code命令,但我们可以用Git工具和shell命令的组合来实现你想要的效果——提取出5d7f469和0c13c1c这两个提交之间完全未改动的代码文件,并打包成common-code-only.tar.gz。

完整命令

你可以直接运行这条一站式命令,不需要生成临时文件:

git archive --format=tar.gz --output=common-code-only.tar.gz 5d7f469 --files-from=<(comm -23 <(git ls-tree -r --name-only 5d7f469 | sort) <(git diff --name-only 5d7f469 0c13c1c | sort))

命令拆解(每个部分的作用)

让我把这条命令拆解开,帮你理解每个环节:

  • git ls-tree -r --name-only 5d7f469 | sort:获取5d7f469提交中所有文件的完整路径,并排序。
  • git diff --name-only 5d7f469 0c13c1c | sort:获取两个提交之间所有改动过的文件(包括修改、新增、删除的文件),并排序。
  • comm -23 <(...) <(...):对比两个排序后的文件列表,只保留在第一个列表(5d7f469的所有文件)中存在,但不在第二个列表(改动的文件)中的内容——也就是两个提交中未改动且都存在的文件。
  • git archive ... --files-from=<(...):从5d7f469提交中提取上述筛选出的共同文件,打包成tar.gz格式的压缩包,输出为common-code-only.tar.gz。

注意事项

  • 这个命令会自动排除在5d7f469存在但在0c13c1c中被删除的文件,以及新增的文件,只保留两个提交中都存在且内容完全一致的文件。
  • 如果你的系统不支持进程替换(<(...)语法,比如某些老旧的shell环境),可以先手动生成临时文件,再执行打包命令:
    # 生成所有文件列表
    git ls-tree -r --name-only 5d7f469 | sort > all-files.txt
    # 生成改动文件列表
    git diff --name-only 5d7f469 0c13c1c | sort > changed-files.txt
    # 筛选共同文件
    comm -23 all-files.txt changed-files.txt > common-files.txt
    # 打包
    git archive --format=tar.gz --output=common-code-only.tar.gz 5d7f469 --files-from=common-files.txt
    # 清理临时文件(可选)
    rm all-files.txt changed-files.txt common-files.txt
    

内容的提问来源于stack exchange,提问作者alberto56

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:14:25