Git笔记与思考四:变基

概念

变基(Rebase)也是合代码的一种手段。
变基与合并(Merge)不同的是,他可以修改历史,使用rebase来代替merge合代码的话,得到的历史记录是一条直线提交历史,无分叉,很漂亮。
然而这也是它的缺点,它抹去了分支历史信息,无法追溯。

指令

变基指令和合并类似,也是对分支进行操作,所以需要指定一个分支名

git rebase 分支名

合并时所指定的分支,是被合进来的分支,意思是把别人的东西纳入给自己。
而变基的数据流向似是相反,变基指令所指定的分支,是自己将要注入的目的地。
变基指令发出时,是把自己接在目标分支的后面,所以变基变的是自己。

merge和rebase的数据流向

你可能会疑惑,当我要把两个分支合并时,或者变基时,是要站在分支1的角度合分支2,还是反过来?
为此,来做个实验,搞清楚它们的方向。这里我起了个名字叫数据流向,可能起得不恰当,将就着看,意思懂就行,不用执着文字相。

公共祖先

创建一个空仓库,默认得到一个master分支,任意放个文件,进行一次初始化提交。

git init
touch foo.txt
git add --all
git commit -m "init"

然后再创建一个分支feature

git branch feature
初次提交.png

这时,分支master和分支feature都指向初始提交,这个提交点作为两条分支的公共祖先。

并行开发

现在让master分支和feature分支有其各自的修改提交,且提交时间无序,我们来模拟这个情景。

### 在master分支提交MA
git checkout master
touch MA.txt
git add --all
git commit -m "MA"
### 在feature分支提交FA
git checkout feature
touch FA.txt
git add --all
git commit -m "FA"
### 在master分支提交MB
git checkout master
touch MB.txt
git add --all
git commit -m "MB"
### 在feature分支提交FB
git checkout feature
touch FB.txt
git add --all
git commit -m "FB"
并行开发.png

现在前置工作准备好了,可以把项目复制4份,以便进行几种合并结果的比较。

四种合代码方式

接下来,我们尝试四种合代码方式,分别是:

  • merge master
  • merge feature
  • rebase master
  • rebase feature

对复制的4份项目,分别执行指令,得到如下结果:

merge master.png

git merge master:在feature分支上发出合并指令,这样会把master分支的提交合到feature自己身上,然后再创建一次合并提交。

merge feature.png

git merge feature:在master分支上发出合并指令,这样会把feature分支的提交合到master自己身上,然后再创建一次合并提交。

rebase feature.png

git rebase feature:在master分支上发出变基指令,这样会把master分支异于feature分支的提交接在feature之后。

rebase master.png

git rebase master:在feature分支上发出变基指令,这样会把feature分支异于master分支的提交接在master之后。

比较几种合代码的情况,如果要进行merge操作的话,最好是在主分支上执行merge,把次分支的代码合进来;如果要进行rebase操作的话,最好是在次分支上进行,把自己变基合入主分支。

变基的工作原理

变基其实是复制要被变基的分支上的提交,然后在别的分支上把提交依次重演出来。
注意这是复制,而不是移动。也就是说,旧有分支的提交还是可以通过hash值找回来的,在没被gc清理的前提下。

由于变基的原理是复制,这导致产生新的提交。在上一小节的实验中,比如rebase master操作,从现实时间上来说,MB提交是迟于FA提交中,但变基结果是FAMB之后,为什么?
因为变基后的FA已经不是原feature分支上的FA了,它是在变基过程中新产生的一个复制结果,其提交信息也已经被改变。
再者,变基完成后,从版本库历史上,也已经看不出哪些提交是属于哪个分支的了。
可以说,变基修改了历史。

变基的冲突

在合并时会遇到的冲突情况,在变基时也一样不能避免。
由于变基过程,是一个一个新复制的提交在另一条分支上重演出来,所以可能会出现多次冲突的情况。
在提交重演的时候,每遇到一次冲突,变基过程就会暂停下来,这时,你需要手动处理冲突的文件,处理完后add到暂存区,然后使用如下指令让变基继续。

git rebase --continue

当然,如果你有很多个提交在重演时都冲突的话,意味着你需要多做几次continue...

移植分支

普通变基的指令是这样的: git rebase master
移植分支的指令是这样的:git rebase master --onto 另一分支名
怎么理解?
如果不加--onto选项,其实是把自己移植到了目标分支master上,如果加了--onto 分支名,就会把原本要接到目标master的提交,拐了个弯,接到了指定的另一个分支那里去。
就这么回事^ ^。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容