Skip to content

git cherry-pick

有时, 我们只想把一条分支上一个或多个 commit, 而不是整个分支上的所有 commit 都合并到另一条分支上; 例如: 在 dev 分支上有3个超前于 main 分支的 commit, 而我们只想把 dev 分支上最新的一个 commit, 合并到 main 分支上, 就可以使用 cherry-pick 命令

git cherry-pick 命令的使用很简单, 例如, 把 hash 为 98a783651711 的 commit 合并到 main 分支上:

bash
git switch main # 保证检出的是想要 cherry-pick 的分支
git cherry-pick 98a7 # 将 hash 为 98a783651711 的 commit 合并到 main 分支上

lazygit 中, 只需要在对应的 commit 上按下 shift + c 以复制此条 commit, 然后在检出的分支的 commit 面板 上按下 shift + v 就可以完成 cherry-pick

可以在2个面板中查看 commit 信息, 一个是在 branch 面板 中, 在对应的分支上按下 Enter 即可查看该分支的所有 commit; 另一个是在 commit 面板

所以, shift + c 的操作可以在 branch 面板commit 面板 上进行, 而 shift + v 的操作就只能在 commit 面板 上进行

下面演示一下在 lazygit 中如何在 本地分支远程分支 进行 cherry-pick

本地分支 cherry-pick

1.可以看到在本地 dev 分支上有4超前于 main 分支的 commit

点击展开查看详情👀

2.我们在 dev 分支上的 commit 面板 上的 92208550ef5b 的 commit 在按下 shift + c, 再切换到 main 分支, 在 commit 面板 上按下 shift + v

此时 lazygit 会提示是否 cherry-pick, Enter 回车确认即可把 92208550ef5b 的 commit 合并到 main 分支上

点击展开查看详情👀

3.cherry-pick 多条也是一样操作, 只需要依次在每条 commit 上按下 shift + c, 最后一起 shift + v 就可以了

点击展开查看详情👀

远程分支 cherry-pick

当两个仓库有一些共同的模块,例如:repo1repo2 都有 admin 模块

当修改了 repo1 中的 adminrepo2 同时也需要这一部分的修改,我们不需要在 repo2 再写一次代码,只需要把 repo1 中关于 admin 的这次提交 cherry-pick 到 repo2

tree
cherry-pick
|-- repo1
|   `-- file.txt
`-- repo2
    `-- file.txt`

下面使用以上的两个仓库 repo1repo2 做演示,在 repo1 中修改了 file.txt,再把 repo1 作为 repo2 的远程仓库,在 repo2 中把 repo1 关于 file.txt 的修改 cherry-pick 到 repo2

1.我们在 repo1 修改了 file.txt 并提交

点击展开查看详情👀

2.在 repo2 中将 repo1 添加为远程仓库

branch 面板 按下 ] 切换到 Remotes tab下; 在 Remotes tab下按下 n 并填入 remote name(远程仓库名)remote url(远程仓库地址), 即可添加一个远程仓库; 再按下 f 以拉取远程仓库的所有信息

点击展开查看详情👀

3.我们在 repo2 本地仓库中选择 repo1 远程仓库的 1087a3e4fc98 这条 commit 进行 cherry-pick,如果合并过程中有冲突的话解决冲突即可

点击展开查看详情👀

更改与提交

从 cherry-pick 的功能可以看出, 最好还是对一个 commit 有一定的要求:

  1. 一个 commit 最好只针对该任务进行修改, 而不要带入其他任务的修改, 这样在 cherry-pick 时, 就不会带入一些无用的修改

  2. commit 信息同样是重要的, 这样便于找到对应的 commit 进行 cherry-pick, 也更便于版本的回滚, 这就可以参考 Conventional Commits 这个规范了