自学教程 学编程从这里开始

git cherry-pick

git cherry-pick 命令

核心:git cherry-pick 可以挑选指定的某一条或几条提交,把它们的改动复制到当前分支,不会把整个分支合并过来。
和 merge / rebase 不一样:merge 是把一整个分支所有提交合进来;cherry-pick 只挑你想要的个别 commit。

适用场景:

  • 别的分支上有一个修复bug的提交,不想合并整个分支,只想把这个补丁拿过来
  • 误提交到别的分支,单独摘出来放到目标分支
  • 版本之间少量补丁移植

基础语法

# 挑选单个提交,复制到当前分支
git cherry-pick <commit-id>

示例流程:

# 先创建两个分支
git checkout main
echo "main v1" > app.txt
git add app.txt
git commit -m "main: v1"

git checkout -b feature
echo "feature add log" >> app.txt
git add app.txt
git commit -m "feature: add log"  # commit A

echo "feature fix bug" >> app.txt
git add app.txt
git commit -m "feature: fix login bug" # commit B(我们想要这个)

git checkout main
# 只把 commit B 这个修复拿到 main 分支
git cherry-pick B的commit哈希

执行后:

  • main 分支会新增一条 commit,内容和 commit B 的改动一样,但哈希值不一样(是新提交)
  • commit A 不会被带过来

挑选多个提交

# 挑选连续一段:commitA ~ commitB (包含两端)
git cherry-pick commitA..commitB

# 挑选多个不连续提交
git cherry-pick commit1 commit3 commit5

–no-commit 模式(只应用改动,不自动提交)

适合:拿到改动后,自己修改、再合并提交

git cherry-pick --no-commit <commit-id>
# 此时改动已经在暂存区,不会自动commit
# 可以修改文件、继续调整,然后手动提交
git commit -m "cherry-pick: 移植登录bug修复"

冲突处理

cherry-pick 遇到冲突时会暂停,和 merge/revert 流程类似:

# 1. 手动修改冲突文件,解决冲突
# 2. add 解决完的文件
git add xxx.txt
# 3. 继续完成 cherry-pick
git cherry-pick --continue

# 如果不想继续,放弃这次挑选
git cherry-pick --abort

常用参数

# -x 推荐!自动在commit备注里标记来源commit,方便追溯
git cherry-pick -x <commit-id>

# -m 1:挑选合并提交(merge commit),必须指定父分支,和revert的-m类似
git cherry-pick -m 1 <merge-commit-id>

-x 效果示例:commit message 末尾自动追加 (cherry picked from commit xxxxx),多人协作强烈建议带上。

常见坑

  1. cherry-pick 是复制提交,不是移动提交
    原来分支上的 commit 还在,会产生两条内容相同、hash不同的提交。后续合并容易出现重复改动冲突。
  2. 不要大量 cherry-pick 连续提交代替 merge
    批量挑大量提交,历史很乱,优先用 merge / rebase。cherry-pick 适合少量补丁移植。
  3. 被 revert 过的提交,cherry-pick 回来一样生效
    只要改动本身存在,不受之前 revert 影响。
  4. 跨分支 cherry-pick 时,依赖其他提交的改动会直接冲突
    比如 commit B 依赖 commit A 的代码,只 pick B,大概率冲突

reset / revert / cherry-pick 三者汇总对比

命令作用是否改写历史适合场景
git reset移动HEAD指针,丢弃后面提交✅ 改写历史本地未推送分支撤销提交
git revert新建反向提交,抵消改动❌ 历史保留已经推远程、公共分支撤销
git cherry-pick复制指定commit改动到当前分支❌ 新增提交跨分支挑选少量补丁移植

一句话速记

  • reset:回头擦掉后面的提交(本地私用)
  • revert:新增一条反向提交抵消代码(公共分支安全回退)
  • cherry-pick:摘一个提交,复制粘贴到当前分支(补丁移植)
标签:

0 条笔记