如何把提交从一个分支复制到另一个分支
复制提交到其他分支用 cherry-pick:切到目标分支后 git cherry-pick <提交哈希>;连续一段用 A^..B 范围;整合分支历史用 merge,rebase 是重放当前分支。cherry-pick 通常产生新哈希,原分支不受影响。
用 git cherry-pick:切到目标分支,执行 git cherry-pick <提交哈希>,该提交的改动会以一个新提交落到当前分支。连续的一段用 git cherry-pick A^..B,不连续的列多个哈希。
基本流程
git checkout release-1.2 # 1. 切到目标分支
git log feature-x --oneline # 2. 找到要复制的提交哈希
git cherry-pick a1b2c3d # 3. 摘过来
git push
复制多个提交
git cherry-pick a1b2c3d^..e4f5a6b # 连续范围(含起点)
git cherry-pick a1b2c3d b2c3d4e c3d4e5f # 不连续的多个,换成真实提交 ID
git cherry-pick -n a1b2c3d b2c3d4e # -n:不提交,检查后用 git commit 合成提交
A^..B 在 A、B 位于同一条线性祖先链时表示含起点的连续段;有合并时应先核对范围中的实际提交,根提交没有 A^。
和其他方式怎么选
| 需求 | 命令 |
|---|---|
| 复制个别提交 | cherry-pick |
| 整合另一分支历史 | merge;rebase 重放当前分支提交,不是复制另一整条分支 |
| 复制单个文件 | git checkout 分支 -- 路径 |
| 复制未提交的改动 | stash + pop 或 patch |
注意事项
- cherry-pick 通常产生新提交(特殊快进或完全相同的元数据情形不能一概保证不同 ID),原分支原封不动;
- 同一提交摘到多个分支后,将来这些分支合并时可能出现"重复改动"冲突;
- 摘 merge 提交需按真实父链选
-m <父序号>,不一定是 1,一般不推荐。
常见问题(FAQ)
Q:cherry-pick 冲突了怎么办?
解决冲突文件 → git add → git cherry-pick --continue;放弃整个操作用 --abort,跳过当前用 --skip。
Q:能不能保留原提交的作者信息?
默认保留作者(author)和 author date,committer date 是新提交时间,committer 变为你。-x 参数还会在提交信息里追加来源哈希,方便追溯。
Q:复制过去后又想撤掉?
目标分支上 git revert <新提交哈希> 或仅当该提交位于顶端、未共享且确认可丢弃工作区改动时才考虑 git reset --hard HEAD^。