前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Git 分支 – 变基

Git 分支 – 变基

作者头像
Yiiven
发布2022-12-15 14:47:07
5190
发布2022-12-15 14:47:07
举报
文章被收录于专栏:怡文菌怡文菌

Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase。 在本文将说明什么是“变基”,以及怎样使用“变基”。

git rebase

整合分支最容易的方法是 git merge 命令。 它会把两个分支的最新的快照(commit)以及二者最近的共同祖先进行三方合并,合并的结果是生成一个新的快照(并提交)。

还有一种方法:你可以提取在一个分支中最新引入的补丁和修改,然后在另一个分支上应用一次。这种操作就叫做“变基”。 你可以使用 git rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。

示例:

现在有这样一个分支结构,我们运行下面的命令;

代码语言:javascript
复制
$ git checkout experiment
$ git rebase master

它的原理是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master)的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用,执行上述命令后,分支结构就变成了下面这样;

现在回到 master 分支,进行一次快进合并。

代码语言:javascript
复制
$ git checkout master
$ git merge experiment

两种整合方法的最终结果没有任何区别,但是变基使得提交历史更加整洁。你在查看一个经过变基的分支的历史记录时会发现,尽管实际的开发工作是并行的,但它们看上去就像是串行的一样,提交历史是一条直线没有分叉。

一般我们这样做的目的是为了确保在向远程分支推送时能保持提交历史的整洁。 在这种情况下,你首先在自己的分支里进行开发,当开发完成时你需要先将你的代码变基到 origin/master 上,然后再向主项目提交修改。 这样的话,该项目的维护者就不再需要进行整合工作,只需要快进合并便可。

请注意,无论是通过变基,还是通过三方合并,整合的最终结果所指向的快照始终是一样的,只不过提交历史不同罢了。 变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。

git rebase --onto

在对两个分支进行变基时,所生成的“重放”并不一定要在目标分支上应用,你也可以指定另外的一个分支进行应用。

示例:

你创建了一个分支 server,在该分支上做了一些修改,提交了 C3 和 C4。 然后从 C3 上创建了新的分支 client,又在client分支上做了一些修改,提交了 C8 和 C9。 最后,你回到 server 分支,又提交了 C10,如图:

现在我们希望将client中的修改合并到主分支master并发布,但暂时并不想合并server中的修改,可能它们还需要经过更全面的测试。 这时就可以使用git rebase命令的--onto选项,选中在client分支里但不在server分支里的修改(即 C8 和 C9),将它们在 master 分支上重放:

代码语言:javascript
复制
$ git rebase --onto master server client
# 说明:git rebase --onto 目标分支 修改不在的分支 修改在的分支

上面这条命令的意思是:“取出 client 分支,找出处于 client 分支和 server 分支的共同祖先之后的修改,然后把它们在 master 分支上重放一遍”,结果如图:

现在可以快进合并 master 分支了。

代码语言:javascript
复制
$ git checkout master
$ git merge client

然后我们决定将 server 分支中的修改也整合进来。 使用git rebase [basebranch] [topicbranch]命令可以直接将特性分支(server)变基到目标分支(master)上。这样做能省去你先切换到 server 分支,再对其执行变基命令的多个步骤。

代码语言:javascript
复制
$ git rebase master server

如图所示,这时候server 中的代码已经被“续”到了 master 后面。现在就可以快进合并主分支 master 了;

代码语言:javascript
复制
$ git checkout master
$ git merge server

至此,client 和 server 分支中的修改都已经整合到主分支里了,你可以删除这两个分支,最终提交历史会变成下图中的样子:

代码语言:javascript
复制
$ git branch -d client
$ git branch -d server

git rebase -i

作用:进入交互模式

适用场景:本地仓库,我们可能在某一次产品迭代时在同一个功能上进行反复的调试,这样我们就有可能在修改同一个功能时产生多次提交历史,如果我们直接将这些历史全部保存下来,那么当我们产品迭代次数多了之后,历史提交次数将被无限放大,这对于我们检查代码以及溯源是非常可怕的事情,使用git rebase -i命令可以有效的减少历史提交次数,让我们的提交历史更加整洁,项目维护更加轻松。

命令:git rebase -i HEAD~2

命令解析:这里的 HEAD~2 表示合并最近两次的提交,如果想合并最近三次的提交修改为: git rebase -i HEAD~3

操作步骤

1、执行命令git rebase -i HEAD~2

2、这时会进入vim编辑器,将最后一次提交的HEAD前的pick修改为ssquash然后保存

命令说明:

  • p, pick = use commit —— 保留该commit
  • r, reword = use commit, but edit the commit message —— 保留该commit,但要修改该commit的注释
  • e, edit = use commit, but stop for amending —— 保留该commit, 但要停下来修改该它(不仅仅修改注释)
  • s, squash = use commit, but meld into previous commit —— 将该commit和前一个commit合并
  • f, fixup = like “squash”, but discard this commit’s log message —— 将该commit和前一个commit合并,但不要保留该commit的注释信息
  • x, exec = run command (the rest of the line) using shell —— 执行shell命令
  • d, drop = remove commit —— 丢弃该commit

3、这时将再次进入vim编辑器,这次是填写提交注释,Git会列出历次提交的注释以供参考

4、注释修改完毕之后保存退出,操作完毕

5、现在可以执行git log来查看提交历史,你会发现之前的两次提交已经被合并了

变基的风险

嗯,变基很可爱,但她也并非完美无缺,要用她得遵守一条准则:不要对在你的仓库外有副本的分支执行变基。

本文采用 「CC BY-NC-SA 4.0」创作共享协议,转载请标注以下信息:

原文出处:Yiiven https://cloud.tencent.com/developer/article/2193222

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-10-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • git rebase
  • git rebase --onto
  • git rebase -i
  • 变基的风险
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档