如何有选择地合并(摘取)另一个分支的改动
选择性合并的手段:整个提交用 git cherry-pick;单个文件用 git checkout 分支 -- 路径;文件内部分改动用 git checkout -p 交互挑选;不想提交先合试用 git merge --no-commit --no-ff。
按粒度选工具:要整个提交 → git cherry-pick;要单个文件 → git checkout 分支 -- 路径;要文件里的部分改动 → git checkout -p 分支 -- 路径 交互挑选;要试合整个分支但先不提交 → git merge --no-commit --no-ff。
粒度一:摘提交
git cherry-pick a1b2c3d
git cherry-pick A^..B # 连续一段
粒度二:拿文件
git checkout feature-x -- src/utils.js # 整文件覆盖
git checkout feature-x -- src/config/ # 整目录
粒度三:挑改动块
git checkout -p feature-x -- src/app.js
# 逐块选择 y/n,只把选中的改动应用到工作区
粒度四:试合再裁剪
git merge --no-commit --no-ff feature-x
# 合并结果停在暂存区,手工删掉不要的部分
git restore --staged --worktree src/不要的部分/
git commit -m "选择性合入 feature-x"
常见问题(FAQ)
Q:这些方式后续 merge 整个分支时会冲突吗?
可能。cherry-pick/checkout 拿走的改动,之后整体 merge 时 Git 会再次遇到它们,相同内容通常自动跳过,略有出入就报冲突。
Q:想看两个分支差异再决定摘什么?
git diff main...feature-x(三点语法)看该分支引入的全部改动,挑好目标再动手。
Q:能不能"反着摘"——合并但排除某文件?
可以:merge 后 git checkout origin/main -- 要排除的路径 把该文件还原,再提交。