网站首页 > 技术文章 正文
前言
git变基是什么,当然不是那个变基。之前我一直不理解git rebase命令,看了很多的文章都没有搞懂,一直不敢用,最近又重新的研究了一下,也应用在了项目上,用过之后就只有一个字,香。
由于某些历史原因导致的两个项目在本地电脑开发,需要拉至内网后才能访问远程仓库,这就导致了本地电脑仓库和内网仓库存在差异,需要先从远程仓库先pull最新的版本合并,然后再使用merge合并,这样就导致分支图就非常的难看了。所以就用了git rebase命令先进行变基,整个图就变成一条直线,撒花。
介绍
rebase(变基):改变当前分支的基础分支版本(父版本)(理解这句话就豁然开朗了)
基础分支的意思是当前从哪一个分支的哪一个版本创建出来。
新建分支命令:
git branch test 或者是 git checkout -b test # 创建并切换到test分支
执行分支命令后,从C2分支创建除了test分支C4,master分支在C2分支上做了修改然后提交得到分支C3。
现在如果想要将master分支和test分支进行合并,直接使用git merge命令,会得到下图:
C3分支和C4分支合并后会形成一个新的快照(分支)C5并提交。
这时候就形成了一个分叉,分支和分支版本变多以后,整个分支图就变得很难看了。
那么如何整理头发分叉呢?
你可以提取在 C4 中引入的补丁和修改,然后在 C3 的基础上应用一次。 在 Git 中,这种操作就叫做 变基(rebase)。 也就是说git自动的将你基于C2上的修改,在C3上进行合并,C2也是test分支和master分支的分叉处,基于这一点,这一个版本进行比较差异,然后自动的完成修改,当然,如果有冲突的话,需要手动的处理冲突,然后使用git rebase --continue继续完成变基。
你可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。
git checkout test # 切换回test分支 git rebase master # 变基
它的原理是首先找到这两个分支(即当前分支 test、变基操作的目标基底分支 master) 的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件, 然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。
这时C4的修改已经变基到了C3上形成了一个新的快照(版本)C4‘,这时的master还是指向C3版本的,接下来要进行一次快进合并。
git checkout master # 切回到master分支 git merge test
此时 ,C4' 指向的快照就和 直接使用merge进行合并的 C5 指向的快照一模一样了。 这两种整合方法的最终结果没有任何区别,但是变基使得提交历史更加整洁。 使得你的头发没有了分叉,看上去就更加漂亮了。变基和合并最终的结果都是一样的,只不过是提交的历史不同。
变基也不一定是最好的,变基存在着一定的风险,驾驶要谨慎。我们下次再来介绍变基的风险吧,敬请期待!
相关微信公众号:程序员储物箱
- 上一篇: 在 Git 中撤销更改的 6 种方法!
- 下一篇: 一看就懂:十几张动图教你快速学会Git命令!
猜你喜欢
- 2024-12-11 程序员必备的高效开发工具盘点与使用技巧
- 2024-12-11 每个开发人员都必须掌握的20个Git基本命令
- 2024-12-11 一起来用GIT吧!十分钟解读自动化测试中GIT的常见问题及解决方法
- 2024-12-11 使用 Git 命令去管理项目的版本控制(二)
- 2024-12-11 99%的时间里使用的14个git命令
- 2024-12-11 在游戏中学习git操作(六)
- 2024-12-11 一篇搞懂Git 和 SVN 的区别
- 2024-12-11 Git使用教程
- 2024-12-11 Git中常用指令原理解析
- 2024-12-11 一文读懂Git
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (87)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)