如何将Git仓库A的指定提交应用到仓库B的对应目录?
将仓库A的指定提交应用到仓库B的对应目录
问题原因
你之前的操作失败,是因为在A_dir目录下生成的补丁,文件路径是相对于仓库A根目录的(比如A_dir/xxx.txt),而你在B_dir目录下执行git apply时,B仓库里的目标文件路径是相对于B仓库根目录的(比如B_dir/xxx.txt),路径不匹配导致Git找不到要修改的文件,所以补丁没生效,仅留下未跟踪的补丁文件。
解决方法
方法一:修正补丁路径后应用
适合不想添加远程仓库的场景:
- 进入仓库A的根目录,生成路径相对A_dir的补丁:
(cd /path/to/repoA git format-patch <commit_id> -1 --relative=A_dir -o /tmp--relative=A_dir让补丁里的文件路径仅保留A_dir下的相对路径,-o /tmp指定补丁输出到临时目录,避免污染仓库A) - 切换到仓库B的B_dir目录,复制并应用补丁:
cd /path/to/repoB/B_dir cp /tmp/0001.patch . git apply --check 0001.patch # 先检查补丁是否可正常应用 git apply 0001.patch # 应用补丁 - 确认生效后,删除补丁文件:
rm 0001.patch
方法二:用git cherry-pick(推荐,保留提交信息)
更可靠,还能完整保留原提交的信息:
- 进入仓库B的根目录,添加仓库A为临时远程:
cd /path/to/repoB git remote add temp-repoA /path/to/repoA - 拉取仓库A的提交记录:
git fetch temp-repoA - 切换到B_dir所在的目标分支(比如
main),执行cherry-pick并指定路径过滤:
(git checkout main git cherry-pick <commit_id> --strategy-option=theirs -- B_dir/--strategy-option=theirs表示如果有冲突,优先使用仓库A提交的内容;若需要手动解决冲突,可去掉该参数) - 完成后删除临时远程:
git remote remove temp-repoA
内容的提问来源于stack exchange,提问作者AllenHu
相关产品推荐
相关产品推荐

