git 如何比较不同分支的差异
前两天,良许在做集成的时候碰到了一件闹心事。事情是这样的,良许的一位同事不小心把一个错误的 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 分支的提交。
公众号:良许Linux

有收获?希望老铁们来个三连击,给更多的人看到这篇文章
git 如何比较不同分支的差异的更多相关文章
- ###Git 基础图解、分支图解、全面教程、常用命令###
一.Git 基础图解 转自:http://www.cnblogs.com/yaozhongxiao/p/3811130.html Git 图解剖析 git中文件内容并没有真正存储在索引(.git/in ...
- git 使用笔记(三)-分支的使用
简单介绍 之前说过,每次修改之后,Git 并不是保存这些修改之后的差异变化,实际上就像一个照相机一样,将修改后的文件拍下作为文件快照,记录在一个微型的文件系统中.在 Git 中提交时,会保存一个提交对 ...
- git log 查看 当前分支的 提交历史
git log 查看 当前分支的 提交历史 在提交了若干更新之后,想回顾下提交历史,可以使用 git log 命令查看 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排 ...
- Git&Github基本操作与分支管理
Git的原理涉及快照流.链表.指针等,这里不作过多叙述. 1.基本操作 git init 创建一个 Git 仓库 git clone [url] 拷贝一个 Git 仓库到本地 git add [fil ...
- [Git01]Pro Git 第三章 分支 读书笔记
[git]分支 Git 的分支模型称为“必杀技特性”,而正是因为它,将 Git 从版本控制系统家族里区分出来. Git 有何特别之处呢?Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在 ...
- Git系列五之分支管理
1.Git分支管理 分支即是平行空间,假设你在为某个手机系统研发拍照功能,代码已经完成了80%,但如果将这不完整的代码直接提交到git仓库中,又有可能影响到其他人的工作,此时我们便可以在该软件的项目之 ...
- git入门五(分支合并冲突和衍合)
分支合并冲突的处理 合并分支的冲突时在不同的分支中修改了同一个文件的同一部分,程序无法把两份有差异的文件合并,这时候需要人为的干预解决冲突.当前处于master 分支,当dev 分支和master ...
- Git详解之分支使用
前言 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本 ...
- VS2013中使用git发布解决方案master分支的时候出现错误
VS2013GIT基础用法请自行参考:不会Git命令,照样玩转Git 环境:VS2013+ 码云错误描述:在VS2013中使用git发布解决方案master分支的时候出现“无法将本地分支 master ...
随机推荐
- idea如何打war包(不使用maven)
用多了maven的小伙伴,应该快忘了怎么不用maven打war包了吧,我也快忘了,所以趁我还记得,赶紧记录下来,多年后,当我回忆起往事........ 而且网上的教程也太坑了吧,牛头不搭马嘴,这害死多 ...
- 吐血整理:二叉树、红黑树、B&B+树超齐全,快速搞定数据结构
前言 没有必要过度关注本文中二叉树的增删改导致的结构改变,规则操作什么的了解一下就好,看不下去就跳过,本文过多的XX树操作图片纯粹是为了作为规则记录,该文章主要目的是增强下个人对各种常用XX树的设计及 ...
- 基于注解的DI
目录 一.使用注解的步骤 二.@Component 三.@Value 四.@Autowired 五.@Qualifier 六.@Resource 七.XML和注解对比 通过spring的注解完成对ja ...
- C#经典算法实践,回顾往生,更是致敬《算法导论》
该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/666 访问. 概述 本系列博文将会向大家介绍本人在钻研<算法导论 ...
- Android Studio Gradle build 报错:Received status code 400 from server: Bad Request
错误提示如下 Could not GET 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.2/ ...
- [源码解析] Flink UDAF 背后做了什么
[源码解析] Flink UDAF 背后做了什么 目录 [源码解析] Flink UDAF 背后做了什么 0x00 摘要 0x01 概念 1.1 概念 1.2 疑问 1.3 UDAF示例代码 0x02 ...
- Kubernetes基于haproxy实现ingress服务暴露
HAproxy Ingress控制器 HAproxy Ingress简介 HAProxy Ingress watches in the k8s cluster and how it builds HA ...
- 汇编 | x86汇编指令集大全(带注释)
做mit-6.828的时候遇到了很多汇编知识,但是无奈学校还没学汇编,只能狠心啃啃硬骨头,在网上查到了很多的资料,归档!方便查看 ----------------------------------- ...
- 编译gawk出现问题,没有安装gawk。
今天编译kernal的时候出现了一个错误:GNU awk is required for lib/memtype.h made by memtypes.awk..查了资料,原来是没有安装gawk的缘故 ...
- Docker-Docker容器跨主机通信
Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信.这种端口映射方式对很多集群应用来说极 ...