git cherry-pick的使用

发布时间 2023-07-22 12:22:51作者: 大黑耗

git cherry-pick <commit id>

是用来将其他某个分支上的某次commit复制到当前分支

假设你的项目提交历史如下:(箭头相当于一个指针,表示当前这个commit是基于指向的那个commit修改的,HEAD也是一个这样的指针)

如果你希望将提交 e43a6 拉取到 master 分支,你可以执行:

$ git checkout master  # 第一步:想要将某次commit应用于master,则先切换到该分支
$ git cherry-pick e43a6  # 第二步:将ruby_client分支上的这个commit pick到当前分支(当然需要提前知道这个commit id)
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index
fails."
 3 files changed, 17 insertions(+), 3 deletions(-)

这样会拉取和 e43a6 相同的更改,但是因为应用的日期不同,你会得到一个新的提交 SHA-1 值。 现在你的历史会变成这样:

 

现在你可以删除这个特性分支(ruby_client),并丢弃不想拉入的提交(5ddae)。

需要说明的是,提取某次提交的“补丁”,这个补丁是基于其父提交的。也就是说,如果这个commit所在的分支在这个commit之前的父代码与当前分支当前的代码不一致,则有可能产生冲突。

例如下面的master比dev分支在同一个地方代码不一致,少了一次提交:

而dev分支上多了一次提交(多了注释more comment):

 

现在我们想把214ae这次提交pick到master,则会产生冲突:

需要手动解决冲突后再git add/git commit来将这次cherry-pick提交上去