【Git】cherrypick教程

Jamil 发布于 2024-12-19 7 次阅读


git cherry-pick 是一个非常有用的 Git 命令,用来从某个分支中选择特定的提交,并将这些提交应用到当前分支。与 git mergegit rebase 不同,git cherry-pick 只会选择指定的提交,而不会将整个分支的历史迁移。


适用场景

  1. 需要迁移单个或多个特定改动到另一个分支
  2. 修复特定的 Bug 并将修复提交迁移到多个分支
  3. 从实验性分支提取某些稳定的功能到主分支

git cherry-pick 的基本用法

1. 基本语法

Bash
git cherry-pick <commit-hash>

其中 <commit-hash> 是要迁移的提交的哈希值。


2. 示例

场景 1:将单个提交迁移到另一个分支
  1. 查看当前分支的提交历史: git log --oneline 假设输出如下: a1b2c3e Fix login bug d4e5f6a Add new feature 9f8e7d6 Initial commit
  2. 假设你想将 a1b2c3e 的提交迁移到分支 main,可以执行以下操作: git checkout main git cherry-pick a1b2c3e
  3. main 分支现在就会包含 a1b2c3e 的改动。

场景 2:将多个提交迁移到另一个分支
  1. 假设你想迁移两个提交 a1b2c3ed4e5f6a,可以一次性迁移多个提交: git cherry-pick a1b2c3e d4e5f6a
  2. 如果想迁移一段连续的提交,可以用提交范围: git cherry-pick a1b2c3e..d4e5f6a 注意,范围语法会包含 a1b2c3e 的后一个提交到 d4e5f6a

3. 处理冲突

当 cherry-pick 操作遇到冲突时:

  1. Git 会提示冲突文件,并暂停 cherry-pick: CONFLICT (content): Merge conflict in file.txt
  2. 手动解决冲突后,标记文件为已解决: git add file.txt
  3. 继续 cherry-pick: git cherry-pick --continue
  4. 如果想放弃当前 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. 应用多个提交文件但不依赖提交历史

如果只想迁移代码改动,而不保留提交历史,可以用以下步骤:

  1. 创建补丁: git format-patch -1 <commit-hash>
  2. 在目标分支应用补丁: git apply <patch-file>

注意事项

  1. git cherry-pick 会创建一个新的提交: 即使是相同的改动,在目标分支上会生成新的提交哈希。
  2. 迁移的改动会破坏分支的线性历史: 如果你需要保持线性历史,考虑使用 git rebasegit merge
  3. 冲突处理时需谨慎: 如果多个提交相互依赖,先 cherry-pick 的提交可能导致冲突,需按顺序处理。

总结

git cherry-pick 是一种灵活且强大的工具,适合从分支中提取特定改动。在使用前,确保理解提交依赖关系,处理冲突时也需仔细检查。如果你的场景是迁移多个相关改动,可以考虑 git mergegit rebase 作为替代方案。