前言
在我们使用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-pick
:git cherry-pick --quit
,此时不会回到操作前的状态
常用配置项
-e:修改提交信息,如果不修改,则使用合并过来的commit的提交信息
-x:标记来源commit,会在提交信息里标记来源的commit哈希,方便以后追查。
-n:只修改工作区和暂存区的代码,而不产生新的commit。这时候可以自己提交或者做其他修改后提交
Enjoy it !
版权声明
转载请注明作者和文章出处
作者: X先生
https://segmentfault.com/a/1190000023414791
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。