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
相关产品推荐
相关产品推荐

