在协同开发时,有很多代码管理的方式,这里我列举我与同事协同开发时的方案
- 从 develop 分支拉取代码,创建自己的分支
- 完成本日开发任务后推送到 GitHub 上自己的分支,发合并申请,由同事相互检查错误代码【】,合并完成并删除自己分支(第二天开发时在创建自己分支)
- 使用
git rebase develop
分支变基,将上游分支 develop 分支上的最新代码合并到自己分支,并解决冲突 - 继续后续开发
本篇主要聊聊在使用 git rebase
时的流程、采坑
1. git rebase 合并代码、分支变基
因为同样是合并分支,所以就会有一个疑问,为什么不用 merge
,merge
和 rebase
有什么差别?
那么首先我们聊聊这个问题
观察这两种命令的 commit 记录,可以梳理出他们的流程,如下图:
由此,我们可以得出merge
和 rebase
的区别,merge 是将所有人的 commit 记录按时间合并排列,rebase 是按提交人的操作顺序将主线按线性排列。一个是按 commit 时间排,一个是按人排
图片来源:http://gitbook.liuhui998.com/4_2.html
接下来,就是开始使用 git rebase
第一种情况
$ git checkout xxx-dev
$ git rebase develop
或者不用切换分支,采用 git rebase [basebranch] [topicbranch]
的方式,basebranch是目的分支(即本例的 develop 分支),topicbranch是源分支(即本例的 xxx-dev 分支),总的意思是将 xxx-dev 分支中的修改变基到 develop 分支上。这样做能省去你先切换到 xxx-dev 分支,再对其执行变基命令的多个步骤。
即:
$ git rebase develop xxx-dev
得到 Successfully 则分支变基成功
在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决 冲突;在解决完冲突后,用 git add
命令去更新这些内容的索引(index),然后无需执行 git commit
,只要执行:
$ git rebase --continue
这样git会继续应用(apply)余下的补丁。
在任何时候,你可以用–abort参数来终止rebase的行动,并且"xxx-dev" 分支会回到rebase开始前的状态。
$ git rebase --abort
第二种情况
在对两个分支进行变基时,所生成的“重放”并不一定要在目标分支上应用,你也可以指定另外的一个分支进行应用。
假设你希望将 next 中的修改合并到主分支并发布,但暂时并不想合并 dev 中的修改。 这时,你就可以使用 git rebase 命令的 --onto 选项,选中在 next 分支里但不在 dev 分支里的修改(即 B5 和 B6),将它们在 master 分支上重放:
$ git rebase --onto master dev next
以上命令的意思是:“取出 next 分支,找出处于 next 分支和 dev 分支的共同祖先之后的修改,然后把它们在 master 分支上重放一遍”。
现在回到 master 分支,进行一次快进合并。
$ git checkout master
$ git merge next
接下来还可以把 dev 分支的修改也整合进来,这里就不演示了,方法和示例一是一样的。
最后,分支中的修改都已经整合到主分支里了,你可以删除这两个分支:
$ git branch -d dev
$ git branch -d next
第二种情况借鉴于:Git:合并分支----git rebase命令的使用
注意:在使用git rebase dev
命令时,可能会出现合并冲突,需要先解决冲突之后再使用git add
缓存,然后使用git rebase --continue
继续合并,如果出现 You are currently rebasing branch ‘tiansi-dev’ on ‘ff87463’ ,则重新打开 git bash 将刚才缓存的文件commit一次,然后git rebase --continue
继续合并
2. git rebase -i 合并多个 commit
我们开发的过程中,可能会有多次的修补提交,就会出现多条提交记录和备注信息,此时我们可以使用 git rebase -i
来合并多个commit,以简化提交记录
1.使用git log
查看提交记录,查询完毕后按q
键退出查询
$ git log
2.使用 git rebase -i
合并commit
git rebase -i [startpoint] [endpoint]
- -i 的含义是:–interactive, 即弹出交互式的界面让用户编辑完成合并操作
- [startpoint] 指的是合并区间的起点。
- [endpoint] 指的是合并区间的终点,默认是当前分支 HEAD 所指向的 commit。
- 注意:这里的区间是一个前开后闭的区间。
例如:
$ git rebase -i d2bf14b495fe57583371be8d0a48c927a2da7eb9 7fc6da429881c5bca2705f61aac0e3a1a3c0b1c7
或使用 git rebase -i HEAD~2
在终端输入:git rebase -i HEAD~2
这里的 HEAD~2 表示合并最近两次的提交,
如果想合并最近三次的提交修改为: git rebase -i HEAD~3
进入到 commit 信息编辑版面
- p, pick = 保留该commit(缩写:p)
- r, reword = 保留该commit,但我需要修改该commit的注释(缩写:r)
- e, edit = 保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
- s, squash = 将该commit和前一个commit合并(缩写:s)
- f, fixup = 将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
- x, exec = 执行shell命令(缩写:x)
- b, break = 停在这里(稍后使用“git rebase—continue”继续rebase)
- d, drop = 丢弃该commit(缩写:d)
- l, label
- t, reset
- m, merge [-C | -c ]
修改完成后,按Esc
键回到最下方命令行,输入:wq
完成保存并退出
ps:中途出现 rebase 可按照提示操作,如果可以忽略,则使用 git rebase --continue
来继续
3.执行完成后将弹出修改备注版面
完成编辑后,按Esc
键回到最下方命令行,输入:wq
完成保存并退出
待程序运行,最后得到Successfully的结果,即完成合并
4.最后再使用 git log
查看,之前的提交信息就都合并成了我们编辑的最后一条
合并之后再推送的远程仓库,信息条目就清晰很多,条数也会相对较少
vim 编辑器部分语法
进入编辑模式:
小写i
:在光标所在行位置停止不动开始写入内容
大写I
:在光标所在行行首开始写入内容
小写a
:在光标所在行当前字符后开始写入内容
大写A
:在光标所在行行尾开始写入内容
小写o
:在光标所在行下一行开始写入内容
大写O
:在光标所在行上一行开始写入内容
退出编辑模式:
:w
:保存文本
:q
:退出编辑模式
:w!
:强制保存,在root用户下即使文本只读也可以强制保存
:q!
:强制退出,所有改动不生效
:wq
:保存并退出
参考:
巧用 git rebase 合并多个 commit:https://www.cnblogs.com/yxhblogs/p/10527271.html
【Git】rebase 合并 commit 用法小结:https://www.jianshu.com/p/4a8f4af4e803
Git:合并分支----git rebase命令的使用:https://blog.csdn.net/qq_42780289/article/details/98078717
git rebase 合并分支命令:http://gitbook.liuhui998.com/4_2.html
git commit --amend 以及退出 vim 编辑器:https://blog.csdn.net/Cathence/article/details/80529488