Git变基

前言

git变基是什么,当然不是那个变基。之前我一直不理解git rebase命令,看了很多的文章都没有搞懂,一直不敢用,最近又重新的研究了一下,也应用在了项目上,用过之后就只有一个字,香。

由于某些历史原因导致的两个项目在本地电脑开发,需要拉至内网后才能访问远程仓库,这就导致了本地电脑仓库和内网仓库存在差异,需要先从远程仓库先pull最新的版本合并,然后再使用merge合并,这样就导致分支图就非常的难看了。所以就用了git rebase命令先进行变基,整个图就变成一条直线,撒花。

介绍

rebase(变基):改变当前分支基础分支版本(父版本)(理解这句话就豁然开朗了)

基础分支的意思是当前从哪一个分支的哪一个版本创建出来。

新建分支命令:

git branch test
或者是
git checkout -b test # 创建并切换到test分支

 

Git变基_第1张图片

执行分支命令后,从C2分支创建除了test分支C4,master分支在C2分支上做了修改然后提交得到分支C3。

现在如果想要将master分支和test分支进行合并,直接使用git merge命令,会得到下图:

 

Git变基_第2张图片

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, 最后以此将之前另存为临时文件的修改依序应用。

 

Git变基_第3张图片

这时C4的修改已经变基到了C3上形成了一个新的快照(版本)C4‘,这时的master还是指向C3版本的,接下来要进行一次快进合并。

git checkout master # 切回到master分支
git merge test

 

Git变基_第4张图片

此时 ,C4' 指向的快照就和 直接使用merge进行合并的 C5 指向的快照一模一样了。 这两种整合方法的最终结果没有任何区别,但是变基使得提交历史更加整洁。 使得你的头发没有了分叉,看上去就更加漂亮了。变基和合并最终的结果都是一样的,只不过是提交的历史不同。

变基也不一定是最好的,变基存在着一定的风险,驾驶要谨慎。我们下次再来介绍变基的风险吧,敬请期待!

你可能感兴趣的:(问题笔记,git)