使用 git rebase 合并多次 commit
-
git rebase 交互模式
git rebase -i <base-commit> -
可以看到,我们目前有两个commit,我们尝试将其进行合并
-
参数
base-commit就是指明操作的基点提交对象,基于这个基点进行 rebase 的操作,对于上述提交历史的例子,我们要把最后的一个提交对象(44dc4b9 )之前的提交压缩成一次提交,我们需要执行的命令格式是:git rebase -i 44dc4b9此时会进入一个 vim 的交互式页面,编辑器列出的信息像下列这样,
可以看到其中分为两个部分,上方未注释的部分是填写要执行的指令,而下方注释的部分则是指令的提示说明。指令部分中由前方的命令名称、commit hash 和 commit message 组成
-
当前我们只要知道
pick和squash这两个命令即可。pick的意思是要会执行这个 commitsquash的意思是这个 commit 会被合并到前一个commit
- 将需要合并的前面改成
s/squash即可,按下esc进入退出编辑模式,进入命令模式 ,然后输入:wq以保存并退出
- 之后就会进入新的编辑界面,需要我们修改新的 commit信息
- 你需要做的就是将其修改成新的commit 信息,然后保存
注意事项: 如果这个过程中有操作错误,可以使用 git rebase --abort来撤销修改,回到没有开始操作合并之前的状态。
git rebase 合并分叉
- 在开发中,我们可能会从master拉一个新的feature分支,如果在开发的过程中,我们的分支进行的commit,master也合入了其他开发同学的commit,那么我们的master分支就不是最新的,我们可以使用rebase 实现将最新的master分支合并进来,并且以最新的master分支提交点作为我们feature分支的起始点
示例图:
在合并之前:
在合并之后: (master分支的最新提交点会作为我们feature的新的起始点,这里是4.js文件)
十分重要的一个点: 但是大部分情况下,rebase 的过程中会产生冲突的,此时,就需要手动解决冲突,然后使用依次 git add 、git rebase --continue 的方式来处理冲突,完成 rebase 的过程,如果不想要某次 rebase 的结果,那么需要使用 git rebase --skip 来跳过这次 rebase 操作。
git cherry-pick 获取指定的 commit
git cherry-pick可以理解为”挑拣”提交,和 merge 合并一个分支的所有提交不同的是,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,那么就要使用git cherry-pick了。- 语法: 直接指定对应的commit-hash即可
git cherry-pick [commit-hash] - 如果产生了冲突:手动解决冲突后, 进行
git add,接着执行git cherry-pick --continue - 如果需要多个 cherry-pick 需要同步到目标分支,可以简写为
git cherry-pick <first-commit-id>...<last-commit-id>,这是一个左开右闭的区间,也就时说first-commit-id提交带来的代码的改动不会被合并过去,如果需要合并过去,可以使用git cherry-pick <first-commit-id>^...<last-commit-id>,它表示包含first-commit-id到last-commit-id在内的提交都会被合并过去。
git stash 暂存修改
- 在开发过程中,我们在feature上开发新的功能,但是突然有个很紧急的bug需要我们进行修复,我们要切换到fix分支,那么,我们就可以先使用
git stash进行暂存/ 隐藏补充的代码,后面就可以切换到fix分支进行修改,改完之后我们切换回 feature分支,然后使用git stash pop将其恢复即可。 - 当然还有
git stash applygit stash list等命令,我个人觉得git stash和git stash pop够用了