mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-11-15 05:33:49 +08:00
fix img & index.html & .md.html
This commit is contained in:
@@ -31,391 +31,391 @@
|
||||
<ul class="uncollapsible">
|
||||
<li>
|
||||
|
||||
<a href="/文章/AQS 万字图文全面解析.md.html">AQS 万字图文全面解析.md.html</a>
|
||||
<a href="/文章/AQS 万字图文全面解析.md.html">AQS 万字图文全面解析</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Docker 镜像构建原理及源码分析.md.html">Docker 镜像构建原理及源码分析.md.html</a>
|
||||
<a href="/文章/Docker 镜像构建原理及源码分析.md.html">Docker 镜像构建原理及源码分析</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/ElasticSearch 小白从入门到精通.md.html">ElasticSearch 小白从入门到精通.md.html</a>
|
||||
<a href="/文章/ElasticSearch 小白从入门到精通.md.html">ElasticSearch 小白从入门到精通</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/JVM CPU Profiler技术原理及源码深度解析.md.html">JVM CPU Profiler技术原理及源码深度解析.md.html</a>
|
||||
<a href="/文章/JVM CPU Profiler技术原理及源码深度解析.md.html">JVM CPU Profiler技术原理及源码深度解析</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/JVM 垃圾收集器.md.html">JVM 垃圾收集器.md.html</a>
|
||||
<a href="/文章/JVM 垃圾收集器.md.html">JVM 垃圾收集器</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/JVM 面试的 30 个知识点.md.html">JVM 面试的 30 个知识点.md.html</a>
|
||||
<a href="/文章/JVM 面试的 30 个知识点.md.html">JVM 面试的 30 个知识点</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Java IO 体系、线程模型大总结.md.html">Java IO 体系、线程模型大总结.md.html</a>
|
||||
<a href="/文章/Java IO 体系、线程模型大总结.md.html">Java IO 体系、线程模型大总结</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Java NIO浅析.md.html">Java NIO浅析.md.html</a>
|
||||
<a href="/文章/Java NIO浅析.md.html">Java NIO浅析</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Java 面试题集锦(网络篇).md.html">Java 面试题集锦(网络篇).md.html</a>
|
||||
<a href="/文章/Java 面试题集锦(网络篇).md.html">Java 面试题集锦(网络篇)</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Java-直接内存 DirectMemory 详解.md.html">Java-直接内存 DirectMemory 详解.md.html</a>
|
||||
<a href="/文章/Java-直接内存 DirectMemory 详解.md.html">Java-直接内存 DirectMemory 详解</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Java中9种常见的CMS GC问题分析与解决(上).md.html">Java中9种常见的CMS GC问题分析与解决(上).md.html</a>
|
||||
<a href="/文章/Java中9种常见的CMS GC问题分析与解决(上).md.html">Java中9种常见的CMS GC问题分析与解决(上)</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Java中9种常见的CMS GC问题分析与解决(下).md.html">Java中9种常见的CMS GC问题分析与解决(下).md.html</a>
|
||||
<a href="/文章/Java中9种常见的CMS GC问题分析与解决(下).md.html">Java中9种常见的CMS GC问题分析与解决(下)</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Java中的SPI.md.html">Java中的SPI.md.html</a>
|
||||
<a href="/文章/Java中的SPI.md.html">Java中的SPI</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Java中的ThreadLocal.md.html">Java中的ThreadLocal.md.html</a>
|
||||
<a href="/文章/Java中的ThreadLocal.md.html">Java中的ThreadLocal</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Java线程池实现原理及其在美团业务中的实践.md.html">Java线程池实现原理及其在美团业务中的实践.md.html</a>
|
||||
<a href="/文章/Java线程池实现原理及其在美团业务中的实践.md.html">Java线程池实现原理及其在美团业务中的实践</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Java魔法类:Unsafe应用解析.md.html">Java魔法类:Unsafe应用解析.md.html</a>
|
||||
<a href="/文章/Java魔法类:Unsafe应用解析.md.html">Java魔法类:Unsafe应用解析</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Kafka 源码阅读笔记.md.html">Kafka 源码阅读笔记.md.html</a>
|
||||
<a href="/文章/Kafka 源码阅读笔记.md.html">Kafka 源码阅读笔记</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理.md.html">Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理.md.html</a>
|
||||
<a href="/文章/Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理.md.html">Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL · 引擎特性 · InnoDB Buffer Pool.md.html">MySQL · 引擎特性 · InnoDB Buffer Pool.md.html</a>
|
||||
<a href="/文章/MySQL · 引擎特性 · InnoDB Buffer Pool.md.html">MySQL · 引擎特性 · InnoDB Buffer Pool</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL · 引擎特性 · InnoDB IO子系统.md.html">MySQL · 引擎特性 · InnoDB IO子系统.md.html</a>
|
||||
<a href="/文章/MySQL · 引擎特性 · InnoDB IO子系统.md.html">MySQL · 引擎特性 · InnoDB IO子系统</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL · 引擎特性 · InnoDB 事务系统.md.html">MySQL · 引擎特性 · InnoDB 事务系统.md.html</a>
|
||||
<a href="/文章/MySQL · 引擎特性 · InnoDB 事务系统.md.html">MySQL · 引擎特性 · InnoDB 事务系统</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL · 引擎特性 · InnoDB 同步机制.md.html">MySQL · 引擎特性 · InnoDB 同步机制.md.html</a>
|
||||
<a href="/文章/MySQL · 引擎特性 · InnoDB 同步机制.md.html">MySQL · 引擎特性 · InnoDB 同步机制</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL · 引擎特性 · InnoDB 数据页解析.md.html">MySQL · 引擎特性 · InnoDB 数据页解析.md.html</a>
|
||||
<a href="/文章/MySQL · 引擎特性 · InnoDB 数据页解析.md.html">MySQL · 引擎特性 · InnoDB 数据页解析</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL · 引擎特性 · InnoDB崩溃恢复.md.html">MySQL · 引擎特性 · InnoDB崩溃恢复.md.html</a>
|
||||
<a href="/文章/MySQL · 引擎特性 · InnoDB崩溃恢复.md.html">MySQL · 引擎特性 · InnoDB崩溃恢复</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL · 引擎特性 · 临时表那些事儿.md.html">MySQL · 引擎特性 · 临时表那些事儿.md.html</a>
|
||||
<a href="/文章/MySQL · 引擎特性 · 临时表那些事儿.md.html">MySQL · 引擎特性 · 临时表那些事儿</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 主从复制 半同步复制.md.html">MySQL 主从复制 半同步复制.md.html</a>
|
||||
<a href="/文章/MySQL 主从复制 半同步复制.md.html">MySQL 主从复制 半同步复制</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 主从复制 基于GTID复制.md.html">MySQL 主从复制 基于GTID复制.md.html</a>
|
||||
<a href="/文章/MySQL 主从复制 基于GTID复制.md.html">MySQL 主从复制 基于GTID复制</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 主从复制.md.html">MySQL 主从复制.md.html</a>
|
||||
<a href="/文章/MySQL 主从复制.md.html">MySQL 主从复制</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 事务日志(redo log和undo log).md.html">MySQL 事务日志(redo log和undo log).md.html</a>
|
||||
<a href="/文章/MySQL 事务日志(redo log和undo log).md.html">MySQL 事务日志(redo log和undo log)</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 亿级别数据迁移实战代码分享.md.html">MySQL 亿级别数据迁移实战代码分享.md.html</a>
|
||||
<a href="/文章/MySQL 亿级别数据迁移实战代码分享.md.html">MySQL 亿级别数据迁移实战代码分享</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 从一条数据说起-InnoDB行存储数据结构.md.html">MySQL 从一条数据说起-InnoDB行存储数据结构.md.html</a>
|
||||
<a href="/文章/MySQL 从一条数据说起-InnoDB行存储数据结构.md.html">MySQL 从一条数据说起-InnoDB行存储数据结构</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 地基基础:事务和锁的面纱.md.html">MySQL 地基基础:事务和锁的面纱.md.html</a>
|
||||
<a href="/文章/MySQL 地基基础:事务和锁的面纱.md.html">MySQL 地基基础:事务和锁的面纱</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 地基基础:数据字典.md.html">MySQL 地基基础:数据字典.md.html</a>
|
||||
<a href="/文章/MySQL 地基基础:数据字典.md.html">MySQL 地基基础:数据字典</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 地基基础:数据库字符集.md.html">MySQL 地基基础:数据库字符集.md.html</a>
|
||||
<a href="/文章/MySQL 地基基础:数据库字符集.md.html">MySQL 地基基础:数据库字符集</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 性能优化:碎片整理.md.html">MySQL 性能优化:碎片整理.md.html</a>
|
||||
<a href="/文章/MySQL 性能优化:碎片整理.md.html">MySQL 性能优化:碎片整理</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 故障诊断:一个 ALTER TALBE 执行了很久,你慌不慌?.md.html">MySQL 故障诊断:一个 ALTER TALBE 执行了很久,你慌不慌?.md.html</a>
|
||||
<a href="/文章/MySQL 故障诊断:一个 ALTER TALBE 执行了很久,你慌不慌?.md.html">MySQL 故障诊断:一个 ALTER TALBE 执行了很久,你慌不慌?</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 故障诊断:如何在日志中轻松定位大事务.md.html">MySQL 故障诊断:如何在日志中轻松定位大事务.md.html</a>
|
||||
<a href="/文章/MySQL 故障诊断:如何在日志中轻松定位大事务.md.html">MySQL 故障诊断:如何在日志中轻松定位大事务</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 故障诊断:教你快速定位加锁的 SQL.md.html">MySQL 故障诊断:教你快速定位加锁的 SQL.md.html</a>
|
||||
<a href="/文章/MySQL 故障诊断:教你快速定位加锁的 SQL.md.html">MySQL 故障诊断:教你快速定位加锁的 SQL</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 日志详解.md.html">MySQL 日志详解.md.html</a>
|
||||
<a href="/文章/MySQL 日志详解.md.html">MySQL 日志详解</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL 的半同步是什么?.md.html">MySQL 的半同步是什么?.md.html</a>
|
||||
<a href="/文章/MySQL 的半同步是什么?.md.html">MySQL 的半同步是什么?</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL中的事务和MVCC.md.html">MySQL中的事务和MVCC.md.html</a>
|
||||
<a href="/文章/MySQL中的事务和MVCC.md.html">MySQL中的事务和MVCC</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL事务_事务隔离级别详解.md.html">MySQL事务_事务隔离级别详解.md.html</a>
|
||||
<a href="/文章/MySQL事务_事务隔离级别详解.md.html">MySQL事务_事务隔离级别详解</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL优化:优化 select count().md.html">MySQL优化:优化 select count().md.html</a>
|
||||
<a href="/文章/MySQL优化:优化 select count().md.html">MySQL优化:优化 select count()</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL共享锁、排他锁、悲观锁、乐观锁.md.html">MySQL共享锁、排他锁、悲观锁、乐观锁.md.html</a>
|
||||
<a href="/文章/MySQL共享锁、排他锁、悲观锁、乐观锁.md.html">MySQL共享锁、排他锁、悲观锁、乐观锁</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/MySQL的MVCC(多版本并发控制).md.html">MySQL的MVCC(多版本并发控制).md.html</a>
|
||||
<a href="/文章/MySQL的MVCC(多版本并发控制).md.html">MySQL的MVCC(多版本并发控制)</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/QingStor 对象存储架构设计及最佳实践.md.html">QingStor 对象存储架构设计及最佳实践.md.html</a>
|
||||
<a href="/文章/QingStor 对象存储架构设计及最佳实践.md.html">QingStor 对象存储架构设计及最佳实践</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/RocketMQ 面试题集锦.md.html">RocketMQ 面试题集锦.md.html</a>
|
||||
<a href="/文章/RocketMQ 面试题集锦.md.html">RocketMQ 面试题集锦</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/SnowFlake 雪花算法生成分布式 ID.md.html">SnowFlake 雪花算法生成分布式 ID.md.html</a>
|
||||
<a href="/文章/SnowFlake 雪花算法生成分布式 ID.md.html">SnowFlake 雪花算法生成分布式 ID</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Spring Boot 2.x 结合 k8s 实现分布式微服务架构.md.html">Spring Boot 2.x 结合 k8s 实现分布式微服务架构.md.html</a>
|
||||
<a href="/文章/Spring Boot 2.x 结合 k8s 实现分布式微服务架构.md.html">Spring Boot 2.x 结合 k8s 实现分布式微服务架构</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Spring Boot 教程:如何开发一个 starter.md.html">Spring Boot 教程:如何开发一个 starter.md.html</a>
|
||||
<a href="/文章/Spring Boot 教程:如何开发一个 starter.md.html">Spring Boot 教程:如何开发一个 starter</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Spring MVC 原理.md.html">Spring MVC 原理.md.html</a>
|
||||
<a href="/文章/Spring MVC 原理.md.html">Spring MVC 原理</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Spring MyBatis和Spring整合的奥秘.md.html">Spring MyBatis和Spring整合的奥秘.md.html</a>
|
||||
<a href="/文章/Spring MyBatis和Spring整合的奥秘.md.html">Spring MyBatis和Spring整合的奥秘</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Spring 帮助你更好的理解Spring循环依赖.md.html">Spring 帮助你更好的理解Spring循环依赖.md.html</a>
|
||||
<a href="/文章/Spring 帮助你更好的理解Spring循环依赖.md.html">Spring 帮助你更好的理解Spring循环依赖</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Spring 循环依赖及解决方式.md.html">Spring 循环依赖及解决方式.md.html</a>
|
||||
<a href="/文章/Spring 循环依赖及解决方式.md.html">Spring 循环依赖及解决方式</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Spring中眼花缭乱的BeanDefinition.md.html">Spring中眼花缭乱的BeanDefinition.md.html</a>
|
||||
<a href="/文章/Spring中眼花缭乱的BeanDefinition.md.html">Spring中眼花缭乱的BeanDefinition</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/Vert.x 基础入门.md.html">Vert.x 基础入门.md.html</a>
|
||||
<a href="/文章/Vert.x 基础入门.md.html">Vert.x 基础入门</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/eBay 的 Elasticsearch 性能调优实践.md.html">eBay 的 Elasticsearch 性能调优实践.md.html</a>
|
||||
<a href="/文章/eBay 的 Elasticsearch 性能调优实践.md.html">eBay 的 Elasticsearch 性能调优实践</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/不可不说的Java“锁”事.md.html">不可不说的Java“锁”事.md.html</a>
|
||||
<a href="/文章/不可不说的Java“锁”事.md.html">不可不说的Java“锁”事</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/互联网并发限流实战.md.html">互联网并发限流实战.md.html</a>
|
||||
<a href="/文章/互联网并发限流实战.md.html">互联网并发限流实战</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/从ReentrantLock的实现看AQS的原理及应用.md.html">从ReentrantLock的实现看AQS的原理及应用.md.html</a>
|
||||
<a href="/文章/从ReentrantLock的实现看AQS的原理及应用.md.html">从ReentrantLock的实现看AQS的原理及应用</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/从SpringCloud开始,聊微服务架构.md.html">从SpringCloud开始,聊微服务架构.md.html</a>
|
||||
<a href="/文章/从SpringCloud开始,聊微服务架构.md.html">从SpringCloud开始,聊微服务架构</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/全面了解 JDK 线程池实现原理.md.html">全面了解 JDK 线程池实现原理.md.html</a>
|
||||
<a href="/文章/全面了解 JDK 线程池实现原理.md.html">全面了解 JDK 线程池实现原理</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/分布式一致性理论与算法.md.html">分布式一致性理论与算法.md.html</a>
|
||||
<a href="/文章/分布式一致性理论与算法.md.html">分布式一致性理论与算法</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/分布式一致性算法 Raft.md.html">分布式一致性算法 Raft.md.html</a>
|
||||
<a href="/文章/分布式一致性算法 Raft.md.html">分布式一致性算法 Raft</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/分布式唯一 ID 解析.md.html">分布式唯一 ID 解析.md.html</a>
|
||||
<a href="/文章/分布式唯一 ID 解析.md.html">分布式唯一 ID 解析</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/分布式链路追踪:集群管理设计.md.html">分布式链路追踪:集群管理设计.md.html</a>
|
||||
<a href="/文章/分布式链路追踪:集群管理设计.md.html">分布式链路追踪:集群管理设计</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/动态代理种类及原理,你知道多少?.md.html">动态代理种类及原理,你知道多少?.md.html</a>
|
||||
<a href="/文章/动态代理种类及原理,你知道多少?.md.html">动态代理种类及原理,你知道多少?</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/响应式架构与 RxJava 在有赞零售的实践.md.html">响应式架构与 RxJava 在有赞零售的实践.md.html</a>
|
||||
<a href="/文章/响应式架构与 RxJava 在有赞零售的实践.md.html">响应式架构与 RxJava 在有赞零售的实践</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/大数据算法——布隆过滤器.md.html">大数据算法——布隆过滤器.md.html</a>
|
||||
<a href="/文章/大数据算法——布隆过滤器.md.html">大数据算法——布隆过滤器</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/如何优雅地记录操作日志?.md.html">如何优雅地记录操作日志?.md.html</a>
|
||||
<a href="/文章/如何优雅地记录操作日志?.md.html">如何优雅地记录操作日志?</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/如何设计一个亿级消息量的 IM 系统.md.html">如何设计一个亿级消息量的 IM 系统.md.html</a>
|
||||
<a href="/文章/如何设计一个亿级消息量的 IM 系统.md.html">如何设计一个亿级消息量的 IM 系统</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/异步网络模型.md.html">异步网络模型.md.html</a>
|
||||
<a href="/文章/异步网络模型.md.html">异步网络模型</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/当我们在讨论CQRS时,我们在讨论些神马?.md.html">当我们在讨论CQRS时,我们在讨论些神马?.md.html</a>
|
||||
<a href="/文章/当我们在讨论CQRS时,我们在讨论些神马?.md.html">当我们在讨论CQRS时,我们在讨论些神马?</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/彻底理解 MySQL 的索引机制.md.html">彻底理解 MySQL 的索引机制.md.html</a>
|
||||
<a href="/文章/彻底理解 MySQL 的索引机制.md.html">彻底理解 MySQL 的索引机制</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/最全的 116 道 Redis 面试题解答.md.html">最全的 116 道 Redis 面试题解答.md.html</a>
|
||||
<a href="/文章/最全的 116 道 Redis 面试题解答.md.html">最全的 116 道 Redis 面试题解答</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/有赞权限系统(SAM).md.html">有赞权限系统(SAM).md.html</a>
|
||||
<a href="/文章/有赞权限系统(SAM).md.html">有赞权限系统(SAM)</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/有赞零售中台建设方法的探索与实践.md.html">有赞零售中台建设方法的探索与实践.md.html</a>
|
||||
<a href="/文章/有赞零售中台建设方法的探索与实践.md.html">有赞零售中台建设方法的探索与实践</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/服务注册与发现原理剖析(Eureka、Zookeeper、Nacos).md.html">服务注册与发现原理剖析(Eureka、Zookeeper、Nacos).md.html</a>
|
||||
<a href="/文章/服务注册与发现原理剖析(Eureka、Zookeeper、Nacos).md.html">服务注册与发现原理剖析(Eureka、Zookeeper、Nacos)</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/深入浅出Cache.md.html">深入浅出Cache.md.html</a>
|
||||
<a href="/文章/深入浅出Cache.md.html">深入浅出Cache</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/深入理解 MySQL 底层实现.md.html">深入理解 MySQL 底层实现.md.html</a>
|
||||
<a href="/文章/深入理解 MySQL 底层实现.md.html">深入理解 MySQL 底层实现</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="current-tab" href="/文章/漫画讲解 git rebase VS git merge.md.html">漫画讲解 git rebase VS git merge.md.html</a>
|
||||
<a class="current-tab" href="/文章/漫画讲解 git rebase VS git merge.md.html">漫画讲解 git rebase VS git merge</a>
|
||||
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/生成浏览器唯一稳定 ID 的探索.md.html">生成浏览器唯一稳定 ID 的探索.md.html</a>
|
||||
<a href="/文章/生成浏览器唯一稳定 ID 的探索.md.html">生成浏览器唯一稳定 ID 的探索</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/缓存 如何保证缓存与数据库的双写一致性?.md.html">缓存 如何保证缓存与数据库的双写一致性?.md.html</a>
|
||||
<a href="/文章/缓存 如何保证缓存与数据库的双写一致性?.md.html">缓存 如何保证缓存与数据库的双写一致性?</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/网易严选怎么做全链路监控的?.md.html">网易严选怎么做全链路监控的?.md.html</a>
|
||||
<a href="/文章/网易严选怎么做全链路监控的?.md.html">网易严选怎么做全链路监控的?</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/美团万亿级 KV 存储架构与实践.md.html">美团万亿级 KV 存储架构与实践.md.html</a>
|
||||
<a href="/文章/美团万亿级 KV 存储架构与实践.md.html">美团万亿级 KV 存储架构与实践</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/美团点评Kubernetes集群管理实践.md.html">美团点评Kubernetes集群管理实践.md.html</a>
|
||||
<a href="/文章/美团点评Kubernetes集群管理实践.md.html">美团点评Kubernetes集群管理实践</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/美团百亿规模API网关服务Shepherd的设计与实现.md.html">美团百亿规模API网关服务Shepherd的设计与实现.md.html</a>
|
||||
<a href="/文章/美团百亿规模API网关服务Shepherd的设计与实现.md.html">美团百亿规模API网关服务Shepherd的设计与实现</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/解读《阿里巴巴 Java 开发手册》背后的思考.md.html">解读《阿里巴巴 Java 开发手册》背后的思考.md.html</a>
|
||||
<a href="/文章/解读《阿里巴巴 Java 开发手册》背后的思考.md.html">解读《阿里巴巴 Java 开发手册》背后的思考</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/认识 MySQL 和 Redis 的数据一致性问题.md.html">认识 MySQL 和 Redis 的数据一致性问题.md.html</a>
|
||||
<a href="/文章/认识 MySQL 和 Redis 的数据一致性问题.md.html">认识 MySQL 和 Redis 的数据一致性问题</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/进阶:Dockerfile 高阶使用指南及镜像优化.md.html">进阶:Dockerfile 高阶使用指南及镜像优化.md.html</a>
|
||||
<a href="/文章/进阶:Dockerfile 高阶使用指南及镜像优化.md.html">进阶:Dockerfile 高阶使用指南及镜像优化</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/铁总在用的高性能分布式缓存计算框架 Geode.md.html">铁总在用的高性能分布式缓存计算框架 Geode.md.html</a>
|
||||
<a href="/文章/铁总在用的高性能分布式缓存计算框架 Geode.md.html">铁总在用的高性能分布式缓存计算框架 Geode</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/阿里云PolarDB及其共享存储PolarFS技术实现分析(上).md.html">阿里云PolarDB及其共享存储PolarFS技术实现分析(上).md.html</a>
|
||||
<a href="/文章/阿里云PolarDB及其共享存储PolarFS技术实现分析(上).md.html">阿里云PolarDB及其共享存储PolarFS技术实现分析(上)</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/阿里云PolarDB及其共享存储PolarFS技术实现分析(下).md.html">阿里云PolarDB及其共享存储PolarFS技术实现分析(下).md.html</a>
|
||||
<a href="/文章/阿里云PolarDB及其共享存储PolarFS技术实现分析(下).md.html">阿里云PolarDB及其共享存储PolarFS技术实现分析(下)</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/面试最常被问的 Java 后端题.md.html">面试最常被问的 Java 后端题.md.html</a>
|
||||
<a href="/文章/面试最常被问的 Java 后端题.md.html">面试最常被问的 Java 后端题</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/领域驱动设计在互联网业务开发中的实践.md.html">领域驱动设计在互联网业务开发中的实践.md.html</a>
|
||||
<a href="/文章/领域驱动设计在互联网业务开发中的实践.md.html">领域驱动设计在互联网业务开发中的实践</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/领域驱动设计的菱形对称架构.md.html">领域驱动设计的菱形对称架构.md.html</a>
|
||||
<a href="/文章/领域驱动设计的菱形对称架构.md.html">领域驱动设计的菱形对称架构</a>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<a href="/文章/高效构建 Docker 镜像的最佳实践.md.html">高效构建 Docker 镜像的最佳实践.md.html</a>
|
||||
<a href="/文章/高效构建 Docker 镜像的最佳实践.md.html">高效构建 Docker 镜像的最佳实践</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -495,12 +495,12 @@ function hide_canvas() {
|
||||
<li>本地主分支合并代码分支时产生</li>
|
||||
</ol>
|
||||
<p>下面我通过漫画的形式来演示两种场景。首先准备两个本地客户端和一个代码仓库,两个客户端为了好记,姑且就叫熊大熊二吧(简称A和B)。</p>
|
||||
<p><img src="assets/ff588160-e255-11eb-ba41-db0ddab65c9b" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/ff588160-e255-11eb-ba41-db0ddab65c9b.png" alt="img" /></p>
|
||||
<p>码云(gitee.com)代码提交仓库网络图展现很好,后面将代码托管在码云上演示。</p>
|
||||
<p>我这里提前在码云创建一个<code>git-conflict-demo</code>的项目,此时里面暂时没有任何内容。</p>
|
||||
<p><img src="assets/074aa790-e256-11eb-9ac8-8334dbfe7cef" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/074aa790-e256-11eb-9ac8-8334dbfe7cef.png" alt="img" /></p>
|
||||
<h3>本地仓库拉取远端仓库时产生</h3>
|
||||
<p><img src="assets/0f5537c0-e256-11eb-9839-c199edf90ba6" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/0f5537c0-e256-11eb-9839-c199edf90ba6.png" alt="img" /></p>
|
||||
<pre><code>git clone https://gitee.com/chandler2code/git-conflict-demo.git
|
||||
cd git-conflict-demo
|
||||
echo "apple">today-food-menu.txt
|
||||
@@ -509,9 +509,9 @@ git commit -m "熊大 add today-food-menu.txt"
|
||||
git push origin master
|
||||
</code></pre>
|
||||
<p>熊大添加了一个<code>today-food-menu.txt</code>文件,并在里面填入了apple,表示他今晚的食物想吃苹果。</p>
|
||||
<p><img src="assets/17c31da0-e256-11eb-ba41-db0ddab65c9b" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/17c31da0-e256-11eb-ba41-db0ddab65c9b.png" alt="img" /></p>
|
||||
<p>于此同时,熊二也和他大哥一样的想法,但是他呢稍微慢了一步,此时熊大已经将代码提交到远端仓库,所以此时仓库里面已经有了<code>today-food-menu.txt</code>文件,并且里面的食物清单是苹果。</p>
|
||||
<p><img src="assets/21469230-e256-11eb-8735-4b8052bf93fe" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/21469230-e256-11eb-8735-4b8052bf93fe.png" alt="img" /></p>
|
||||
<p>因为熊二不想吃苹果,所以他果断将<code>today-food-menu.txt</code>里面的内容改为了蜂蜜<code>honey</code>。</p>
|
||||
<pre><code>git clone https://gitee.com/chandler2code/git-conflict-demo.git
|
||||
sed -i 's/apple/honey/g' today-food-menu.txt
|
||||
@@ -519,9 +519,9 @@ git add .
|
||||
git commit -m 'update today-food-menu.txt'
|
||||
git push origin master
|
||||
</code></pre>
|
||||
<p><img src="assets/297d3b70-e256-11eb-ba41-db0ddab65c9b" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/297d3b70-e256-11eb-ba41-db0ddab65c9b.png" alt="img" /></p>
|
||||
<p>熊大在提交代码后就有点后悔了,他觉得昨天才吃过苹果,今天换换口味吃香蕉了。</p>
|
||||
<p><img src="assets/2f40c1d0-e256-11eb-8ae8-213f64a14867" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/2f40c1d0-e256-11eb-8ae8-213f64a14867.png" alt="img" /></p>
|
||||
<p>于是他将食物清单改为香蕉后再次提交。</p>
|
||||
<pre><code>sed -i 's/apple/banana/g' -i today-food-menu.txt
|
||||
git add .
|
||||
@@ -549,11 +549,11 @@ honey
|
||||
git commit -m 'merge conflic'
|
||||
git push origin master
|
||||
</code></pre>
|
||||
<p><img src="assets/38e775d0-e256-11eb-a751-c93d727cbe27" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/38e775d0-e256-11eb-a751-c93d727cbe27.png" alt="img" /></p>
|
||||
<p><strong>总结:这里我们可以看到,冲突的原因就是当本地的文件和远端的文件都做了修改时,本地拉取远端时首先会告知由于远端有变更,需要git pull,执行git pull之后 Git 迷糊了,心想你们到底想要哪个内容呢,算了我不管了,直接给你们算冲突吧,你们自己决定保留哪些内容。</strong></p>
|
||||
<h3>本地主分支合并代码分支时产生</h3>
|
||||
<p>熊大在有了上次的本地拉取远端代码冲突时有了新的思考。</p>
|
||||
<p><img src="assets/3fa8e430-e256-11eb-9ac8-8334dbfe7cef" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/3fa8e430-e256-11eb-9ac8-8334dbfe7cef.png" alt="img" /></p>
|
||||
<p>于是第二天在修改食物清单时,他选择自己先在本地创建分支,然后在自己的分支上修改,这样就可以时不时的切换到 master 分支拉取最新的代码。</p>
|
||||
<pre><code>#创建并切换到本地food分支
|
||||
git checkout -b food
|
||||
@@ -564,20 +564,20 @@ git add .
|
||||
git commit -m 'update today-food-menu.txt: eat apple'
|
||||
</code></pre>
|
||||
<p>熊二今天依旧想吃蜂蜜,于是他将昨天的更新改拉取到本地后,将其更改为honey。</p>
|
||||
<p><img src="assets/46f97330-e256-11eb-8735-4b8052bf93fe" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/46f97330-e256-11eb-8735-4b8052bf93fe.png" alt="img" /></p>
|
||||
<pre><code>git pull
|
||||
sed -i 's/banana/honey/g' -i today-food-menu.txt
|
||||
git add .
|
||||
git commit -m 'update today-food-menu.txt'
|
||||
git push origin master
|
||||
</code></pre>
|
||||
<p><img src="assets/4cfa29a0-e256-11eb-9ac8-8334dbfe7cef" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/4cfa29a0-e256-11eb-9ac8-8334dbfe7cef.png" alt="img" /></p>
|
||||
<p>熊大切换到master分支拉取,查看代码变化。</p>
|
||||
<pre><code>git checkout master
|
||||
git pull
|
||||
</code></pre>
|
||||
<p>熊大拉取代码后发现<code>today-food-menu.txt</code>被更改为了honey。</p>
|
||||
<p><img src="assets/5284c5b0-e256-11eb-b23b-e34e5b5fc461" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/5284c5b0-e256-11eb-b23b-e34e5b5fc461.png" alt="img" /></p>
|
||||
<p>熊大考虑到仓库的蜂蜜快坏了,所以他这下坚持要吃苹果,于是他将自己的 food 分支的更改合并到 master 分支。有两种方式可以做到,分别是<code>git merge</code>和<code>git rabase</code>,后面都会详细的做讲解。我这里先用<code>git merge</code>解决冲突。</p>
|
||||
<pre><code>git merge food
|
||||
</code></pre>
|
||||
@@ -597,33 +597,33 @@ apple
|
||||
git commit -m 'master merge food:eat apple'
|
||||
git push origin master
|
||||
</code></pre>
|
||||
<p><img src="assets/58b4f090-e256-11eb-83cb-07ac0d3b70bf" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/58b4f090-e256-11eb-83cb-07ac0d3b70bf.png" alt="img" /></p>
|
||||
<p><strong>总结:在前面我们看到,如果 master 分支上开发。由于 master 分支时刻保持最新的发行代码,所以变动频繁,因此拉取 master 分支非常容易造成冲突。因此这里是将更改在本地分支上进行,在需要合并时,切换到 master 分支拉取最新代码后,根据拉取的内容,再去合并分支。同时这种方式也是更受大家推崇的。</strong></p>
|
||||
<h2>分析 git merge 合并分支代码的特点</h2>
|
||||
<p>上一节演示了冲突是如何产生的,并演示了通过<code>git merge</code>方式合并分支冲突。这一章节我们来分析一下<code>get merge</code>合并分支代码冲突的特点。</p>
|
||||
<p>云端仓库查看 commit 记录</p>
|
||||
<p><img src="assets/5e09fdb0-e256-11eb-b23b-e34e5b5fc461" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/5e09fdb0-e256-11eb-b23b-e34e5b5fc461.png" alt="img" /></p>
|
||||
<p>熊二将食物清单更新为 honey 并提交到远端仓库后,此时熊大在本地 commit,所以我们看到熊大的 commit 时间在熊二提交更新之前。熊二提交更新后,熊大切换到 master 分支,并更新代码到本地后,在合并分支时产生了冲突。为了合并冲突,多出了一次 merge 的 commit 记录。</p>
|
||||
<p>我们再来云端看一下提交结构图:</p>
|
||||
<p><img src="assets/6368a7c0-e256-11eb-808b-51f805f15e47" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/6368a7c0-e256-11eb-808b-51f805f15e47.png" alt="img" /></p>
|
||||
<p>从图中可以看到,<code>master merge food: eat apple</code>这次commit将前面的两次提交进行了合并,因为前面的这两次commit的代码完全相同的点在<code>merge confilc</code>这次提交,所以从<code>merge confic</code>到<code>master merge food:eat apple</code>这里多出来一个分叉的历史记录(绿线)。</p>
|
||||
<p>在实际的生产开发过程中,采用这种方式会导致分叉的 commit 记录非常多,不利于开发人员代码审查。下面我们来看一下<code>git rebase</code>又是如何解决的呢?</p>
|
||||
<h2>git rebase 合并分支代码,并通过漫画的形式举例讲解</h2>
|
||||
<p>熊大在本机创建 food2 分支,在本地分支上将内容修改为 honey。</p>
|
||||
<p><img src="assets/68b0bc90-e256-11eb-b23b-e34e5b5fc461" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/68b0bc90-e256-11eb-b23b-e34e5b5fc461.png" alt="img" /></p>
|
||||
<pre><code>git checkout -b food2
|
||||
sed -i 's/apple/honey/g' -i today-food-menu.txt
|
||||
git add .
|
||||
git commit -m 'update today-food-menu.txt:honey'
|
||||
</code></pre>
|
||||
<p>在熊大还没有 push 到远端时,他想起之前答应了熊二要像请他喝咖啡,于是他又改变为喝咖啡了。</p>
|
||||
<p><img src="assets/6da24cf0-e256-11eb-b9fd-1da92bc1a30d" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/6da24cf0-e256-11eb-b9fd-1da92bc1a30d.png" alt="img" /></p>
|
||||
<pre><code>sed -i 's/honey/coffee/g' -i today-food-menu.txt
|
||||
git add .
|
||||
git commit -m 'update today-food-menu.txt:coffee'
|
||||
</code></pre>
|
||||
<p>就在熊二还没有 push 到远端的时候,熊二本来计划吃蜂蜜的,但是想到蜂蜜不多了,决定留着过年吃,今天还是吃香蕉。于是将修改后的内容推送到了远端。</p>
|
||||
<p><img src="assets/740d5df0-e256-11eb-a751-c93d727cbe27" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/740d5df0-e256-11eb-a751-c93d727cbe27.png" alt="img" /></p>
|
||||
<pre><code>git pull
|
||||
sed -i 's/apple/banana/g' -i today-food-menu.txt
|
||||
git add .
|
||||
@@ -685,16 +685,16 @@ git rebase --continue
|
||||
<p>Applying: update today-food-menu.txt:coffee</p>
|
||||
</blockquote>
|
||||
<p>此时没有提示任何的信息,所以 rebase 结束。其实版本高一点的 Git(2.22及以上),是有 rebase 进度条展示的,可以看到 rebase 的进度,如图所示:</p>
|
||||
<p><img src="assets/8542bb60-e256-11eb-8735-4b8052bf93fe" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/8542bb60-e256-11eb-8735-4b8052bf93fe.png" alt="img" /></p>
|
||||
<p>rebase 结束后切换到 master 分支合并分支代码,然后直接推送到远端即可(此时不用指定 commit)。</p>
|
||||
<pre><code>git checkout master
|
||||
git merge food2
|
||||
git push origin master
|
||||
</code></pre>
|
||||
<p><img src="assets/8b0cf880-e256-11eb-9839-c199edf90ba6" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/8b0cf880-e256-11eb-9839-c199edf90ba6.png" alt="img" /></p>
|
||||
<p>可以看到,一共有3次 commit 记录,分别是熊大2次和熊二1次。没有多出来 merge 的 commit 记录。</p>
|
||||
<p>我们再来云端看一下提交结构图:</p>
|
||||
<p><img src="assets/9067aaf0-e256-11eb-be77-f581c3259eef" alt="在这里插入图片描述" /></p>
|
||||
<p><img src="assets/9067aaf0-e256-11eb-be77-f581c3259eef.png" alt="img" /></p>
|
||||
<p>由于没有多出 merge 的 commit 记录,所以不会存在分叉的 commit 记录,代码记录都是以线性的方式,做代码审查一目了然。</p>
|
||||
<p><strong>总结:有的小伙伴可能会说,看着前面的演示步骤好复杂啊。确实是,rebase 其实相当于是 merge 的进阶使用方式,目的就是为了让代码 commit 呈线性记录。</strong></p>
|
||||
<h2>git merge 对比 git rebase 该如何选择?</h2>
|
||||
|
||||
Reference in New Issue
Block a user