IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 简话git rebase -> 正文阅读

[开发工具]简话git rebase

基本功能

git 的rebase相信很多同学都有耳闻,但是可能一直没有尝试过如何使用。

base顾名思义,是基线的意思,一个完整的代码提交历史,就如果时间上的历史,是一条直线,

在这里插入图片描述

上图的时间线表示了古欧洲的历史,可见是一条直线,没有分支。

但是实际上在版本开发过程中,实际上这样是过于理想的。实际上的情况如下:

在这里插入图片描述
我们在版本中,提交了D-E,此时我们需要一个特性分支topic,单独开发;于是我们就有了topic分支和master两个;

有强迫症的同学,肯定希望最终的版本主干还是一条直线,于是想把A-B-C强压入master中。

这时候rebase就派上用场了。


强拉一根线——强扭的瓜,至少看上去舒服

这里我们不讨论将topic分支压入主干是否合理,如果要这样做,我们应该这么操作呢?

首先,git checkout两个分支到本地,

其次,git pull保证两个分支都是最新

最后,执行git rebase master topic,

如果你当前正在topic分支上,可以省略最后一个参数,即git rebase master

在这里插入图片描述

执行后(假设没有任何冲突),主干就变成如下的直线了。 这里的A’,B’,C’虽然还是之前的三笔提交,但是他们的hashcode已经变化,对于git来说他们是新的节点,只是内容还是之前的A,B,C,所以这里加上一撇来标记。

不过,当前你的分支还是topic,只是历史从 D-E-A-B-C变成了 D-E-F-G-A’-B’-C’,(没有冲突的情况)代码没有任何变动,但是提交跟远端的完全不一样了。

所以在提交远端时,需要强行推送。

如果你就像修改master,让master保持一根线,那么命令如下,

git push -f origin topic:master

但是不要轻易执行这种命令,尤其是在master上,这里只是出于示例目的!!!

清理被污染的提交记录

当然rebase的另外一个重要作用是,清理被污染的提交记录。

比如,某分支,存在大量如下提交记录。

在这里插入图片描述
对于这种重复commit内容,是一种很不好的习惯,首先它对其他开发人员,甚至是自己来说,都是没有任何帮助的。另外大量的无用内容,就是一种污染。

对于这种情况,强迫症的福音又来了,rebase。

这种情况下,只需要操作一个分支,
所以直接执行

git rebase -i <HEAD~n>

这个标识从HEAD往前数n个提交记录需要rebase

或者 直接找一些要rebase的提交记录id

git rebase -i <commit-id> 

执行后会出现一个交互界面,下面是所有的提交,同git log --oneline,但是顺序是反的,这里是按时间升序。第一行是最远的提交。
在这里插入图片描述

每一行提交前面有一个pick,这里的含义在交互界面的最下方也有介绍。
在这里插入图片描述

  • pick 是使用该commit
  • reword 是使用,但是修改提交记录
  • edit 是使用,但会停下来做amending
  • squash 是使用,但把提交记录合入到上一个commit中
  • fixup 是使用,但丢弃提交记录

这里根据你的需求,比如大量重复的log,就选fixup。 注意一下,第一条记录,也就是最远的提交,必须是pick。

修改好,就wq退出。退出后开始执行rebase操作。这里如果遇到冲突,rebase会停下,等你合并完冲突后,执行rebase --continue继续。 如果你发现操作有问题,可以执行rebase --abort停止rebase操作,一切会回复原样。

这里需要讨论一下两种情况。

  1. 所有提交都是在你本地,你的rebase其实不会与远端分支有任何冲突,所以rebase后,你可以直接普通push
  2. 所有的提交或者部分提交在远端,那么你的rebase必然跟远端是不一致的,所以需要git push -f来覆盖你远端的分支。
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:55:18  更:2022-10-17 12:58:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 4:56:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计