Git Rebase 操作的分析与整理
来源:互联网 发布:sql with ur 编辑:程序博客网 时间:2024/06/07 03:44
图例中,有主干 master,支线分支 branch。
其中,master 提交 ID 记录为:C1 → C2 → C3 → C4。
branch 提交 ID 记录为:C1 → C2 → C5 → C6。
Merge 操作
在 branch 分支上执行 git merge master 命令。
将 master 代码与 branch 代码合并,那么需要处理两个分支之间的冲突,只需要处理一次,最终生成C7 提交。最终 branch 分支的提交 ID 记录为:C1 → C2 → C3 → C4 → C5 → C6 → C7。其中 C3、C4、C5、C6 提交记录中的顺序由提交的时间决定。
Rebase 操作
rebase 操作的前提是 工作区 和本地库 不能有任何修改存在。
rebase 分支前,先执行 fetch 下载最新的代码,否则可能会存在最终不能 push 的情况。
尽量少用 --force 或者 -f 参数,进行强制性操作。
首先会产生 rebase 分支(master)的备份,放到(no branch )临时分支中。再将支线分支(branch)的每一次提交修改,以补丁的形式,一个个的重新应用到主干分支上。这个过程是一个循环应用补丁的过程,期间只要补丁产生冲突,就会停止循环,等待手动解决冲突。这个冲突指的是上一个合并后版本与补丁之间的冲突。(例如:C5 补丁时,需要解决的是 C4 与 C5 的冲突,C6 补丁时,需要解决的是C4 + C5 版本与 C6 之间的冲突),手动解决冲突完成,通过 git add 命令更新内容,执行git rebase --continue 命令继续后续循环,通过 git rebase --skip 命令,可以跳过某一次补丁(存在上一轮冲突的解决方案中,已经包含了这一轮的补丁内容,这样会使补丁无效,需要跳过),通过git rebase --abort 命令,可以在循环执行过程中,进行回滚,循环完成后执行命令无效。
循环完成后会更新 branch 分支,删除(no branch)临时分支。最终 branch 分支提交 ID 记录为 C1 → C2 → C3 → C4 → C5' → C6'。之前的 C5 和C6 提交将被删除。
检查代码无问题后,通过 git push origin branch 命令更新提交内容。如果发现分支合并有错误,就只能删除本地分支,重新下载分支,重新进行rebase 操作。
使用 Rebase 的必要性和注意事项:
使得历史变得更加清晰,保持了良好的版本迭代,容易追溯,方便回滚。
公共分支并行开发,rebase 可能会引发本地历史 commit 记录与服务端历史记录不一致,rebase 之后,只能强行用--force 推送代码,这样做会进行非线性提交,强制更新服务端的历史记录,就很有可能会造成其他开发人员 commit 丢失的情况。因此一个分支多人维护情况下,尽量少用rebase。
快捷操作:
在 branch 分支上执行 git pull origin master --rebase 命令,相当于执行:git fetch + git rebase
每次都加 --rebase 似乎有些麻烦,可以指定某个分支在执行 git pull 时默认采用rebase 方式:
$ git config branch.master.rebase true
如果觉得所有的分支都应该用 rebase,那就设置:
$ git config --global branch.autosetuprebase always
这样对于新建的分支都会设定上面的 rebase=true 了。已经创建好的分支还是需要手动配置的。
高级应用:
可以使用 git rebase -i commitid 或者 git rebase --interactive commitid 进入 rebase交互模式。(从整个分支commit初始阶段置commitID设置位置)。
进入交互模式后,提供了一些交互命令。
#Commands:#p, pick = use commit#r, reword = use commit, but edit the commit message#e, edit = use commit, but stop for amending#s, squash = use commit, but meld into previous commit#f, fixup = like "squash", but discard this commit's log message
- 交互模式下,直接置换提交的顺序就能达到重新排序的效果。
- 如果判断不会发生冲突,使用 squash 命令,可以合并当前提交与前一个提交,并且会调用编辑器合并commit 信息。
- 如果指定 edit,可以修改当前 commit 信息或者提交的内容、分割当前分支。
- 交互模式下,可以直接删除提交。
- 交互修改完成后保存退出,通过 rebase --continue 完成rebase 操作。
作者:羽杰
链接:http://www.jianshu.com/p/0c9adba41313
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- Git Rebase 操作的分析与整理
- git merge 与 rebase 的使用场景分析
- Git rebase操作
- git rebase操作
- 图解git rebase 与merge的区别
- git操作之git rebase
- git rebase 与git merge
- git rebase 与 git merge
- 闲话git merge 与 git rebase 的区别
- Git rebase 的應用經驗
- git rebase 的活用
- git rebase 的作用
- git rebase 的使用
- Git rebase 的應用經驗 .
- git rebase 的活用
- git的rebase
- Git 操作之rebase、squash
- git的操作整理
- 软件版本中的Alpha,Beta,RC,Trial是什么意思?
- CentOS7.2搭建ownCloud私有云
- SpringBoot学习教程
- Web开发手册-w3resource
- 将外部jar打入到本地仓库
- Git Rebase 操作的分析与整理
- PyCharm2016.2.3专业版 2017.2.3专业版 注册码(亲测有效)
- c++ 宏、不可重载运算符、抽象类
- CentOS 6.7 静默安装Oracle 11g R2 详细操作总结
- uVision, MDK, realview的关系
- 剖析RAC中的@weakify、@strongify
- Android 集成阿里百川实现在线客服、聊天功能
- Java线程面试题(一)
- 搭建hadoop:配置ambari中SQL数据库