git cherry-pick
是一个非常有用的 Git 命令,用来从某个分支中选择特定的提交,并将这些提交应用到当前分支。与 git merge
和 git rebase
不同,git cherry-pick
只会选择指定的提交,而不会将整个分支的历史迁移。
适用场景
- 需要迁移单个或多个特定改动到另一个分支。
- 修复特定的 Bug 并将修复提交迁移到多个分支。
- 从实验性分支提取某些稳定的功能到主分支。
git cherry-pick
的基本用法
1. 基本语法
Bash
git cherry-pick <commit-hash>
其中 <commit-hash>
是要迁移的提交的哈希值。
2. 示例
场景 1:将单个提交迁移到另一个分支
- 查看当前分支的提交历史:
git log --oneline
假设输出如下:a1b2c3e Fix login bug d4e5f6a Add new feature 9f8e7d6 Initial commit
- 假设你想将
a1b2c3e
的提交迁移到分支main
,可以执行以下操作:git checkout main git cherry-pick a1b2c3e
main
分支现在就会包含a1b2c3e
的改动。
场景 2:将多个提交迁移到另一个分支
- 假设你想迁移两个提交
a1b2c3e
和d4e5f6a
,可以一次性迁移多个提交:git cherry-pick a1b2c3e d4e5f6a
- 如果想迁移一段连续的提交,可以用提交范围:
git cherry-pick a1b2c3e..d4e5f6a
注意,范围语法会包含a1b2c3e
的后一个提交到d4e5f6a
。
3. 处理冲突
当 cherry-pick 操作遇到冲突时:
- Git 会提示冲突文件,并暂停 cherry-pick:
CONFLICT (content): Merge conflict in file.txt
- 手动解决冲突后,标记文件为已解决:
git add file.txt
- 继续 cherry-pick:
git cherry-pick --continue
- 如果想放弃当前 cherry-pick:
git cherry-pick --abort
高级用法
1. 使用 --no-commit
默认情况下,git cherry-pick
会在迁移改动后自动提交。如果你只想迁移改动但不提交,可以使用 --no-commit
:
Bash
git cherry-pick <commit-hash> --no-commit
改动会被保留在暂存区,允许你手动修改后再提交。
2. 使用 -x
在合并提交信息时,-x
会在提交信息中添加原始提交的引用(方便追溯历史):
Bash
git cherry-pick <commit-hash> -x
提交信息将包含:
(cherry picked from commit <commit-hash>)
3. 忽略空提交
当 cherry-pick 的提交已经包含在当前分支时,Git 会提示 “空提交”。你可以使用 --allow-empty
来保留空提交,或者使用 --skip
跳过:
Bash
git cherry-pick --skip
4. 应用多个提交文件但不依赖提交历史
如果只想迁移代码改动,而不保留提交历史,可以用以下步骤:
- 创建补丁:
git format-patch -1 <commit-hash>
- 在目标分支应用补丁:
git apply <patch-file>
注意事项
git cherry-pick
会创建一个新的提交: 即使是相同的改动,在目标分支上会生成新的提交哈希。- 迁移的改动会破坏分支的线性历史: 如果你需要保持线性历史,考虑使用
git rebase
或git merge
。 - 冲突处理时需谨慎: 如果多个提交相互依赖,先 cherry-pick 的提交可能导致冲突,需按顺序处理。
总结
git cherry-pick
是一种灵活且强大的工具,适合从分支中提取特定改动。在使用前,确保理解提交依赖关系,处理冲突时也需仔细检查。如果你的场景是迁移多个相关改动,可以考虑 git merge
或 git rebase
作为替代方案。
Comments 2 条评论
工作中会经常使用到!
@mer 没错!