1

前言

在我们使用Git进行日常开发的过程中,常常需要进行的操作就是代码合并了。常见的操做命令是 git merge branch-name,这个命令会合并的是整个分支的commit,然而有时候我们需要的可能是仅仅某一个 commit或者某几个commit,这时候就需要用到git cherry-pick了。

git cherry-pick的作用就如它的名字一样,精心挑选。我们可以精心挑选其他分支上的 commit 合并到当前的分支上来。

原理

git cherry-pick 可以把其他分支的某个commit应用到当前分支,并且自动生成一个新的 commit 进行提交,因此这两次commit的哈希值是不一样的,属于不同的commit

基本用法

单个commit合并

git cherry-pick commit-hash/branch-name

如果使用的是哈希值,则会把对应的commit合并过来,如果是分支名,则会把对应分支的最新一次commit合并过来。

多个commit合并

# 1、 分散的commit
git cherry-pick commit-hash1 commit-hash2

# 2、连续的commit
# Git 1.7.2 版本以后,新增了支持批量cherry-pick 
# 可以将一个连续的时间序列内的连续commit,进行cherry-pick操作。

# 合并(start,end]之间的提交,不包含start
git cherry-pick start-commit-hash..end-commit-hash 

# 合并[start,end]之间的提交,包含start
git cherry-pick start-commit-hash^..end-commit-hash 

注意
无论是对单个 commit 进行 cherry-pick ,还是批量处理,注意一定要根据时间线,依照 commit 的先后顺序来处理,否则会有意想不到的问题。

如何处理冲突

代码合并不可避免的就是会遇到代码冲突了,git merge会遇到冲突,同样的git cherry-pick也会遇到代码冲突,那么遇到代码冲突的时候,该如何处理呢?

遇到冲突的时候,Git会给出报错信息,并停下来,要求用户解決 conflict 的问题。Git会把所有冲突的文件列在Unmerged paths的地方,可以通过git status查看,如下图。
在这里插入图片描述
此时我们有以下处理方案:

  • 解决冲突

    • 修改冲突的地方,并通过命令git add .把文件重新加入暂存区。
    • 继续合并,git cherry-pick --continue
  • 回退所有修改:git cherry-pick --abort,此时会回到操作前的样子
  • 单纯退出cherry-pickgit cherry-pick --quit,此时不会回到操作前的状态

常用配置项

-e:修改提交信息,如果不修改,则使用合并过来的commit的提交信息
-x:标记来源commit,会在提交信息里标记来源的commit哈希,方便以后追查。
-n:只修改工作区和暂存区的代码,而不产生新的commit。这时候可以自己提交或者做其他修改后提交

Enjoy it !

版权声明

转载请注明作者和文章出处
作者: X先生
https://segmentfault.com/a/1190000023414791

X先生
317 声望786 粉丝

腾讯TEG研发管理部小小后台攻城狮一枚,负责腾讯敏捷产品研发平台TAPD的基础功能的开发和维护,热爱技术,喜欢分享,欢迎与我交流~