前言
在Git多分支开发场景下,常常会遇到把a分支的提交记录代码复制到b分支,将多次提交记录合并成一个提交等问题,以下将介绍使用IDEA如何快速的实现这些功能。
一、Cherry-Pick
cherry-pick的意思是挑选,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。使用场景就是,不想merge整个分支的代码到当前分支,就可以使用cherry-pick了。
以下展示IDEA中如何快速使用cherry-pick
1、如下图中,当前分支为dev2,目标分支为dev。这里将演示从dev分支cherry-pick部分提交记录到dev2分支中,cherry-pick的按钮是一个樱桃一样的小图标。
2、cherry-pick之后,dev2分支有绿色原点,待提交记录。这样就完成了cherry-pick的使用,非常简单。
二、Squash Commits
Squash Commits的作用能够将多次提交记录合并成一个。
重复第一个步骤,将dev中四次提交,全部cherry-pick到dev2。选中需要合并的记录,如下图。
Squash之后,会将多个提交信息展示出来,修改成自己需要的信息即可。
看Event Log可以发现,Commited Squashed成功了,右下角出现了蓝色和绿色的原点。这时不要去fetch/update分支代码,因为此时只是在local合并成功了,远程分支还是四个记录,所以就会出现远程分支有未获取的记录。此时,直接push合并的记录到远程分支即可。
未push合并后的分支前
打开git bash,输入命令强制push上去。
git push --force
看到远程分支的多次提交记录也合并成功了。
三、Rebase
以上cherry-pick的操作实际上是通过git的rebase命令去进行合并的。
git rebase -i 命令可以压缩合并多次提交
格式:git rebase -i [startpoint] [endpoint]
其中-i的意思是–interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。
- pick:保留该commit(缩写:p)
- reword:保留该commit,但我需要修改该commit的注释(缩写:r)
- edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
- squash:将该commit和前一个commit合并(缩写:s)
- fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
- exec:执行shell命令(缩写:x)
- drop:我要丢弃该commit(缩写:d)
参考:https://blog.csdn.net/w57685321/article/details/86597808
此处展示两种常用的使用方式:
// 合并最近的两次提交
git rebase -i HEAD~2
按i进入编辑,可以修改pick为fixup,表示使用commit,但是忽略掉comment。修改好后,按Esc退出,在wq保存即可。
观察提交记录和信息,可以看到合并两个请求成功了。
另一种方式如下:
// 合并从当前head到15f745b(commit id)
git rebase -i 3261b8f5
这里3261b8f5 是我first commit记录的hash值,同样出现vi编辑框,选择需要的信息wq保存退出即可。
效果如下图
总结
本文介绍了Cherry-Pick、Squash Commits、Rebase的使用,做一个记录。在使用rebase中,有可能出现冲突,按提示解决冲突。如操作失败,可以abort rebase重新弄,不影响分支信息。