git checkout --patch 是最轻量可控的局部变更提取方式,不依赖提交哈希、不改分支历史;需工作区干净,交互式选择变更块,支持指定文件夹路径。

git checkout --patch 合并指定文件夹的变更
直接 cherry-pick 或 merge 整个分支无法只取其中几个文件夹,git checkout --patch 是最轻量、最可控的方式——它不依赖提交哈希,也不改变当前分支历史,适合从其他分支“摘取”局部改动。
操作前确保工作区干净(无未提交修改),否则 git checkout --patch 可能误操作当前暂存区或工作区内容。
- 先切换到目标分支(比如
main):git switch main - 执行:
git checkout --patch feature-branch -- path/to/folder1 path/to/folder2 - 每遇到一个变更块,输入
y(应用)、n(跳过)、s(拆分块)——注意:这里选的是「变更块」,不是整个文件;如果只想拿某个文件夹下所有变更,就对每个相关文件都按y - 完成后,这些路径下的变更已进入工作区,用
git add提交即可
git restore --source= 分离提取特定路径
git restore(Git 2.23+)比 checkout --patch 更语义清晰,且支持直接从任意 ref 提取路径,避免交互式选择干扰。
它本质是“覆盖当前工作区对应路径”,不涉及暂存区自动更新,所以必须显式 git add,这点容易漏掉。
GitHub 智能代码审查与 CI/CD 自动化工作流。收到 PR 或代码提交时,自动进行 AI 代码审查(bug/安全/逻辑),并根据审查结果智能生成或推荐 GitHub Actions 工作流。触发词:代码审查、review PR、生成 CI/CD、GitHub Actions。
- 提取单个文件夹:
git restore --source=feature-branch -- path/to/folder1 - 提取多个路径:
git restore --source=feature-branch -- path/to/folder1 path/to/folder2 - 加
--staged可同时恢复暂存区(相当于一步到位):git restore --staged --source=feature-branch -- path/to/folder1 - ⚠️ 注意:
--source后不能带冒号(如feature-branch:),否则报错fatal: invalid treeish 'feature-branch:'
git read-tree + git checkout-index 避免工作区污染
当目标分支有大量冲突风险、或你只想提取文件内容而不触发任何钩子(如 pre-commit)时,git read-tree + git checkout-index 是最底层但最干净的方式——它绕过工作区合并逻辑,纯文件级拷贝。
适合 CI 脚本或自动化场景,手动操作稍繁琐,但绝对可控。
- 临时读入目标分支的树对象:
git read-tree --prefix=tmp/ -u feature-branch(--prefix防止覆盖当前文件) - 导出指定子目录:
git checkout-index -f -a --prefix=./extracted/ --path=tmp/path/to/folder1 - 再手动
cp -r extracted/path/to/folder1 .到目标位置,最后git add - 完成后清理:
git reset --hard(因为read-tree修改了 index)
为什么不用 git merge --no-commit + 手动 reset?
有人试过 git merge --no-commit feature-branch 再 git reset HEAD path/to/ignore,看似可行,但实际踩坑多:
- merge 会自动处理递归合并逻辑,哪怕你只想要两个文件夹,Git 仍可能把其他路径的冲突标记为 “both modified”,导致
reset后状态混乱 - 如果
feature-branch和当前分支在共通父提交之后有重叠修改,git reset某些路径会留下 unmerged 状态,git status显示异常 - 某些 Git 版本(特别是 Windows 上的 msysgit)在 partial reset 后
git commit会报错error: your index file is in an unmerged state - 不如直接用
restore或checkout --patch,语义明确、副作用少
真正要小心的是路径拼写和斜杠方向——Windows 用户用 path\to\folder 会被 Git 忽略,必须统一用正斜杠 /;另外,路径开头不加 /(即不能写 /path/to/folder),否则匹配失败。

















