git变基

我们已经使用过git的合并(merge)功能,与之功能类似的是rebase(变基)。

开始前请记住:不要对在你的仓库外有副本的分支进行变基。

变基的实质是丢弃一些现有的提交,并且新建一些内容一样但实际上不同的提交。所以如果你的分支上的内容已经被共享,进行变基之后就会有一部分现有提交被丢弃,这会给其他用户带来麻烦与困惑。

合并是将两个分支的最新快照以及共同祖先进行三方合并,并且生成一个新的快照。比如下图是将C7、C6和C4进行三方合并。

合并是三方合并

还有另外一种方法,就是变基。变基将提取C5和C6中的补丁和修改,并且将其在C7上重新作用一次,然后生成一个新的提交。

变基会生成内容一样但实际不同的提交

如上图所示,在testing分支进行变基操作到master后,git会进行如下操作:

  • 找到testing分支和master分支的共同祖先,即C4。
  • 收集共同祖先C4到目前提交C6的所有修改和补丁,放到临时文件中。
  • 将目前的分支testing指向目标基底master
  • testing上依次应用临时文件中所有的修改和补丁。本例中为将C5和C6的修改和补丁依次应用。
  • 生成一个新的提交,即C8。

三方合并和变基生成的新提交C8内容是一致的,不同的是提交历史:三方合并能够清楚地看到合并的历史,而变基只有一条串联的历史。

如果你要向他人维护的项目贡献代码,就可以将自己的修改都变基到master上,推送之后,维护者只需要进行快进操作。

现在让我们实践一下。

我们创建一条分支testing,并且在该分支上进行两次提交。

然后回到master分支,进行一次提交。

再次切换到testing分支。

提交历史大致如下:

* c36bdf6 (master) i see you there
| * c5a1cc4 (HEAD -> testing) i see you here
| * 86a451c water water everywhere
|/  
* af05578 (origin/master) We all love git.

如果现在从testing变基到master,那么86a451cc5a1cc4中所做的修改会依次重演到master。如果遇到冲突,那么会依次需要人工解决冲突。为了避免多次修改冲突,我们将86a451cc5a1cc4合并为一次提交:

$ git reset --soft af05578
$ git commit -m "i see water here"
[testing cf6dc96] i see water here
 1 file changed, 4 insertions(+)
$ git log --oneline --decorate --graph --all
* cf6dc96 (HEAD -> testing) i see water here
| * c36bdf6 (master) i see you there
|/  
* af05578 (origin/master) We all love git.

现在执行变基到master的操作:

$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: i see water here
Using index info to reconstruct a base tree...
M   README.md
Falling back to patching base and 3-way merge...
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
error: Failed to merge in the changes.
Patch failed at 0001 i see water here
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

在执行变基操作时,git提示我们README.md有冲突,解决冲突后使用git rebase --continue继续执行变基操作。现在请解决冲突,将文件添加到暂存区后表示该文件冲突解决完成。解决后继续执行变基操作:

$ git rebase --continue 
Applying: i see water here

git告诉我们更改已经被应用到master分支。提交历史如下:

* c148ffd (HEAD -> testing) i see water here
* c36bdf6 (master) i see you there
* af05578 (origin/master) We all love git.

可以看到,git帮我们生成了一个新的提交,并且testing指向该提交。提价历史变成了一条串联的线。

最后,将master快进到testing即可:

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

推荐阅读更多精彩内容

  • 一、电脑本地初始化一个仓库 1. git init: 初始化一个电脑上本地仓库 终端进入项目目录,输入: 该命令将...
    dragon_li阅读 2,908评论 1 4
  • 四、 分支开发工作流 现在你已经学会新建和合并分支,那么你可以或者应该用它来做些什么呢? 在本节,我们会介绍一些常...
    常大鹏阅读 2,101评论 3 24
  • 人为什么喜欢说谎? 因为真相往往藏在谎言里
    蕾蕾陈阅读 276评论 0 0
  • 因为习惯阅读之后,要写读后感,所以也了解下有关一些读后感的一些格式和写法。因此记录下来。 一、格式和写法 读后感通...
    依米Nina阅读 895评论 0 1
  • 我已经试着让自己不再回答“2016年你做了什么”这样的问题。这些貌似正能量的设问其实就在暗暗期许着你一定给不出一个...
    月亮先生MrMoon阅读 289评论 0 1