git 如何比较不同分支的差异_git 对比差异
wptr33 2025-10-02 09:03 21 浏览
前两天,良许在做集成的时候碰到了一件闹心事。事情是这样的,良许的一位同事不小心把一个错误的 dev 分支 merge 到了 master 分支上,导致了良许编译不通过。于是,我们需要将版本回退到 merge 之前的状态。
如果是下面这个状态,那很好处理:
这种情况下,我们只需一个 git reset 命令即可:
git reset --hard HEAD~
但是,如果下面这种状态,情况就没那么简单了:
这种情况下,就不能简单使用 git reset 命令了。这就是良许这次碰到的问题。为了解决这个问题,我们就需要找出合并后的分支与合并前的分支的差异,再进行版本回退。这种情况下的版本回退,就不能单用 git reset 了,而是要配合 git revert 了,在后面我们将详细介绍如何优雅的进行版本回退。
回到正题,我们如何找出合并后的分支与合并前分支的差异呢?这里我们需要使用到 git log 命令了。我们先模拟出这两个分支的提交情况:
- dev 分支提交情况:
[alvin@VM_0_16_centos git-log]$ git log dev
commit b191410906ae20a865fde3f163bb01fd6cfc1f11
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 21:03:13 2018 +0800
[dev] 版本6
commit 793c9582ab0a45c4f8f548be36c06bc5ca427c62
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 21:02:30 2018 +0800
[dev] 版本5
commit dbe54166608772486408c1dea05304de45dba430
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 21:00:27 2018 +0800
[both] 版本3
commit 31894364b1396b00d2935373387397ef930416e4
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 20:59:26 2018 +0800
[both] 版本2
commit 4872f653a8fd7c8541abb4a292d628dc7625884b
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 20:58:05 2018 +0800
[dev] 版本4
commit fac6c60ed28c5acfcd01284336d4201cc55ee2e7
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 20:57:01 2018 +0800
[both] 版本1
- master 分支提交情况:
[alvin@VM_0_16_centos git-log]$ git log master
commit c690054c67b833b22dce4120899526743b20d36d
Author: Liangxu <yychuyu@163.com>
Date: Sun Dec 9 07:31:47 2018 +0800
[master] 版本7
commit dbe54166608772486408c1dea05304de45dba430
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 21:00:27 2018 +0800
[both] 版本3
commit 31894364b1396b00d2935373387397ef930416e4
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 20:59:26 2018 +0800
[both] 版本2
commit fac6c60ed28c5acfcd01284336d4201cc55ee2e7
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 20:57:01 2018 +0800
[both] 版本1
在这些提交里 [both] 表示两个分支都有的提交, [dev] 表示只有在 dev 分支的提交,[master] 表示只在 master 分支的提交
1. 查看dev有,而 master 分支没有的提交
- 方法一
命令:
git log dev ^master
结果:
[alvin@VM_0_16_centos git-log]$ git log dev ^master
commit b191410906ae20a865fde3f163bb01fd6cfc1f11
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 21:03:13 2018 +0800
[dev] 版本6
commit 793c9582ab0a45c4f8f548be36c06bc5ca427c62
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 21:02:30 2018 +0800
[dev] 版本5
commit 4872f653a8fd7c8541abb4a292d628dc7625884b
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 20:58:05 2018 +0800
[dev] 版本4
很明显看到,版本4,5,6这三个提交只在 dev 分支里。
相反,如果想看到 master 分支有,而 dev 分支没有的提交,就可以使用如下命令:
git log master ^dev
结果:
[alvin@VM_0_16_centos git-log]$ git log master ^dev
commit c690054c67b833b22dce4120899526743b20d36d
Author: Liangxu <yychuyu@163.com>
Date: Sun Dec 9 07:31:47 2018 +0800
[master] 版本7
- 方法二
使用如下命令:
git log master..dev
如果想查看只在 master 分支,而不在 dev 分支的提交,则将 master 与 dev 对调过来即可:
git log dev..master
这两条命令的执行结果与上述相同,故不重复贴结果了。
2. 提前未知两个分支提交情况,如何查看两个分支的差异?
在这种情况下,上述的几个命令都跑一遍,其实也可以知道个大概了。但有没有更简单的办法呢?git 同样为你想到了这个问题,也提供了解决办法:
git log master...dev
结果:
[alvin@VM_0_16_centos git-log]$ git log master...dev
commit c690054c67b833b22dce4120899526743b20d36d
Author: Liangxu <yychuyu@163.com>
Date: Sun Dec 9 07:31:47 2018 +0800
[master] 版本7
commit b191410906ae20a865fde3f163bb01fd6cfc1f11
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 21:03:13 2018 +0800
[dev] 版本6
commit 793c9582ab0a45c4f8f548be36c06bc5ca427c62
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 21:02:30 2018 +0800
[dev] 版本5
commit 4872f653a8fd7c8541abb4a292d628dc7625884b
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 20:58:05 2018 +0800
[dev] 版本4
请注意,在这里,master 与 dev 之间有三个点,有别于之前的命令(两个点)。而且,这个命令的执行结果与 git log dev...master 完全一样。
我们这里是为了方便演示,加了 [master] 、 [dev] 、 [both] 这样的记号,但在实际开发过程中,很少会这样操作。那我们在执行 git log master...dev 时,怎么知道有差异的提交是在 master 分支里,还是 dev 分支里?我们只需加上 --left-right 选项即可。
git log --left-right master...dev
结果:
[alvin@VM_0_16_centos git-log]$ git log --left-right master...dev
commit < c690054c67b833b22dce4120899526743b20d36d
Author: Liangxu <yychuyu@163.com>
Date: Sun Dec 9 07:31:47 2018 +0800
[master] 版本7
commit > b191410906ae20a865fde3f163bb01fd6cfc1f11
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 21:03:13 2018 +0800
[dev] 版本6
commit > 793c9582ab0a45c4f8f548be36c06bc5ca427c62
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 21:02:30 2018 +0800
[dev] 版本5
commit > 4872f653a8fd7c8541abb4a292d628dc7625884b
Author: Liangxu <yychuyu@163.com>
Date: Sat Dec 8 20:58:05 2018 +0800
[dev] 版本4
我们会发现,在 commit 与哈希值之间多了个 < 或 > ,其中 < 表示只在 master 分支的提交, > 表示只在 dev 分支的提交。
> 2020 精选 阿里/腾讯等一线大厂 面试、简历、进阶、电子书「**良许Linux**」后台回复「**资料**」免费获取
#### 看完的都是真爱,点个赞再走呗?您的「三连」就是良许持续创作的最大动力!
1. 关注**原创**「**良许Linux**」,第一时间获取最新Linux干货!
2. 后台回复【资料】【面试】【简历】获取精选一线大厂面试、自我提升、简历等资料。
3. 关注我的博客:[lxlinux.net](http://www.lxlinux.net)
相关推荐
- 深度剖析 MySQL 数据库索引失效场景与优化策略
-
在互联网软件开发领域,MySQL数据库凭借其开源、高效等特性被广泛应用。而索引,作为提升MySQL查询性能的关键利器,能大幅加速数据检索。然而,在实际开发中,即便精心创建了索引,却常常遭遇索引失...
- 15分钟,带你了解indexedDB,这个前端存储方案很重要!
-
原文来源于:程序员成长指北;作者:Django强哥如有侵权,联系删除最近在给前端班授课,在这次之前的最后一次课已经是在2年前,2年的时间,前端的变化很大,也是时候要更新课件了。整理客户端存储篇章时模糊...
- MySQL 面试总被问到的那些问题,你都懂了吗?
-
事务的四大特性是什么?首先得提一下ACID,这可是数据库事务的灵魂所在:原子性(Atomicity):要么全部成功,要么全部失败回滚。一致性(Consistency):确保数据在事务前后都处于一致状态...
- Java 字符串常见的操作_java字符串总结
-
在Java当中,为字符串类提供了丰富的操作方法,对于字符串,我们常见的操作就是:字符串的比较、查找、替换、拆分、截取以及其他的一些操作。在Java中,有String,StringBuffer和St...
- java学习分享:Java截取(提取)子字符串(substring())
-
在String中提供了两个截取字符串的方法,一个是从指定位置截取到字符串结尾,另一个是截取指定范围的内容。下面对这两种方法分别进行介绍。1.substring(intbeginIndex)形...
- 你必须知道的 7 个杀手级 JavaScript 单行代码
-
1.如果你需要一个临时的唯一ID,请生成随机字符串。这个例子将为你生成一个随机字符串:constrandomString=Math.random().toString(36).slice(2)...
- MySQL 索引失效:原因、场景与解决方案
-
在互联网软件开发领域,MySQL作为一款广泛使用的关系型数据库,其性能优化至关重要。而索引,作为提升MySQL查询性能的关键手段,一旦失效,会导致查询效率大幅下降,影响整个系统的性能。今天,就来...
- Axure9 教程:可模糊搜索的多选效果
-
一、交互效果说明1.点击话题列表中的话题选项,上方输入框内显示选择的话题标签,最多可选择5个标签,超出将有文字提示。2.点击输入框内已选择的话题标签的删除按钮,可以删除已选择的话题标签,并且该标签返回...
- JavaScript字符串操作方法大全,包含ES6方法
-
一、charAt()返回在指定位置的字符。...
- 为什么MySQL索引不生效?来看看这8个原因
-
在数据库优化中,最让人头疼的事情之一莫过于精心设计的索引没有发挥作用。为什么会出现这种情况?这篇文章带大家一起探讨一些常见原因,方便大家更好地理解MySQL查询优化器是如何选择索引的,以及在出现类...
- Kettle实现rabbitMQ的生产与消费_rabbitmq不支持顺序消费
-
文章目录一、Kettle为什么可以读取流数据?...
- MySQL高频函数Top10!数据分析效率翻倍,拒绝无效加班!
-
引言:为什么你的SQL代码又臭又长?“同事3行代码搞定的事,你写了30行?”“每次处理日期、字符串都抓狂,疯狂百度?”——不是你不努力,而是没掌握这些高频函数!本文精炼8年数据库开发经验,总结出10个...
- mysql的截取函数用法详解_mysql截取指定字符
-
substring()函数测试数据准备:用法:以下语法是mysql自动提示的1:substirng(str,pos):从指定位置开始截取一直到数据完成str:需要截取的字段的pos:开始截取的位置。从...
- MySQL函数:字符串如何截取_mysql 字符串截取函数
-
练习截取字符串函数(五个)mysql索引从1开始...
- 数据集成产品分析(一)_数据集成工具有哪些
-
编辑导语:数据集成产品是数据中台建设的第一环节,在构建数据中台或大数据系统时,首先要将企业内部各个业务系统的数据实现互联互通,从物理上打破数据孤岛。本文作者对数据集成产品进行了分析,一起来看一下吧。数...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
如何将AI助手接入微信(打开ai手机助手)
-
SparkSQL——DataFrame的创建与使用
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
Java面试必考问题:什么是乐观锁与悲观锁
-
redission YYDS spring boot redission 使用
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)