Git仓库的提交记录乱成一团,怎么办?
大家好,今天和大家聊聊git当中一个非常好用的功能——区间选择,它可以帮我们处理看起来非常复杂的提交记录。从而帮助我们很快找到我们需要的内容。
如果大家有参与过多人协同的项目开发,比如十几个人甚至更多的成员的时候,会发现一些分支的记录非常的混乱,比如master。因为其中包含了太多的提交信息,比如各种分支的merge记录,以及线上bugfix等。这个时候使用区间选择就非常有必要,它会帮助我们过滤掉不需要的提交记录,快速找到我们想要的结果。
区间选择
关于区间选择我们之前在介绍rebase的时候曾经提到过一次:
git rebase --onto master feature bugFix
当我们执行这条命令之后,git会将在bugFix分支当中但是不在feature分支里的内容rebase到master分支。这其实就是一种区间选择,我们把两个分支之间的差集选择了出来。当然这是在rebase当中的应用,那么我们能不能把这种形式应用在日志搜索上呢?
当然是可以的,最常用指明区间的语法是双点。它的用法是两个英文句号,它可以让git选出在一个分支但是不在另外一个分支当中的提交,比如:
git log master..experiment
这个语句的含义就是筛选出在experiment当中但是不在master当中的提交。我们来看一张图,会更加地直观:

我们执行上面的命令之后,得到的结果就是C和D这两个节点的提交记录。
如果我们想要反其道而行之,想要获得在master,但是不在experiment,也就是查看我们在开发experiment这个分支的过程当中master进行了哪些改动,我们可以将前后两个分支名交换顺序。
git log experiment..master
这样我们得到的结果是E、F两个节点。
另外一个使用场景是在我们进行push之前进行检查,查看我们究竟做了哪些改动,哪些commit会被更新到远端。这个时候我们比较的是当前节点以及远程push的分支之间的差别,我们可以这样:
git log origin/master..HEAD
对于这个功能Git进行了优化, 我们可以省去最后的HEAD,git会默认使用HEAD代替留空的情况。
三点及多点
除了上面使用的双点语法之外,git当中还提供了三点以及多点的语法,我们先来说说三点的语法。
三点
其实三点的功能本质上和双点是一样的,可以认为是在双点的基础上做了一点优化,让我们使用起来更加方便。在真实的使用场景当中,我们往往既需要知道我们正在开发的feature带来的提交,也需要知道master后来进行的改动。这样的话,我们会需要执行git log两次,所以git提供了三点的语法,将两次执行压缩成了一次,通过使用三点语法,我们可以只需要执行一次就可以获得的结果。
git log master...experiment
当我们执行这个命令之后,git会展示这两个分支各自独有的提交,以上图举例,它的执行结果应该是C、D、E、F这四个节点。
但是这有一个问题,我们光看其实是不知道这四个节点分别属于哪个分支的,我们可以加上参数,--left-right,它会用箭头表明这些提交分别被哪个分支独有。
git log --left-right master...experiment
< F
< E
> D
> C
多点
有的时候我们的提交情况可能会比较复杂,可能有多个分支糅杂在一起,你可能未必确定某一个改动的源头。这个时候我们可能需要一个复杂的表达式才能把我们想要查看的提交记录表达清楚。
比如说我们现在有A、B、C三个分支,我们想要查看在A或和B当中,但是不在C当中的提交。我们可以这样写:
git log A B ^C
git log A B --not C
上面的两条语句都是可以的,第一条我们用^表示了not的意思,第二条比较直观,我们直接加上前缀来表示。这就是多点的用法,它支持我们定义多个来源,这样一些复杂的情况就会非常方便。git默认多个来源之间是或的关系,这也是非常符合实际的。大家可以思考一下这个问题。
多点同样也兼容双点的情况,双点操作有一个问题是我们经常会搞混比较的主体,这个时候我们完全可以使用多点的语法来代替。
git log A ^B
git log A --not B
掌握了多点和双点之后,我们就可以应付各种复杂场景下的log排查了,再加上之前介绍过的git show等功能,对于提升我们搜索git log的速度非常有帮助。这么几个命令掌握下来,使用起来的气质就不一样,会给你一种自己已经是技术大牛的感觉。
今天的文章就到这里,希望大家都能有这种感觉。如果还喜欢本文的话,请来个三连支持吧!(点赞、关注、转发)
{{uploading-image-952910.png(uploading...)}}
Git仓库的提交记录乱成一团,怎么办?的更多相关文章
- git log 查看提交记录
git log 查看提交记录 1. git log 查看提交历史记录2. git log --oneline 或者 git log --pretty=oneline 以精简模式显示3. git log ...
- git log 查看提交记录,参数:
git log 查看提交记录,参数:-n (n是一个正整数),查看最近n次的提交信息 $ git log -2 查看最近2次的提交历史记录 -- fileName fileName为任意文件名,查看指 ...
- 2.1获取Git仓库-2.2记录每次更新到仓库
2.1 获取 Git 仓库 获取 Git 仓库通常有两种方式 将尚未进行版本控制的本地目录转换为 Git 仓库: 从其它服务器 克隆 一个已存在的 Git 仓库. 在已存在目录中初始化仓库 首先进入该 ...
- 如何向整个 Git 仓库补提交一个文件
微软在 Reference Source 里开放了 .Net Framework 多个版本的源码.为了更方便地阅读这些源码,我们把每一个版本都下载下来后按顺序提交到 git 仓库中. 但是!!!居然忘 ...
- 在GIT中修改提交记录
在SVN中,提交记录是无法修改的.比如说,当我们提交了某次修改后,发现该次提交中有错误时,只能将将补丁再次提交一遍.这样,就存在两次提交记录,没有保证提交的原子性. 在GIT中,由于提交是在本地进行的 ...
- git查看commit提交记录详情
相关的命令: git log:查看所有的commit提交记录: git show: 查看提交的详情: 首先,需要通过git log打印所有commit记录,例如: 1.查看最新的commit:git ...
- Python - Git仓库忽略提交规则 & .gitignore配置
Git 忽略文件提交的方法 有三种方法可以实现忽略Git中不想提交的文件. 在Git项目中定义 .gitignore 文件 这种方式通过在项目的某个文件夹下定义 .gitignore 文件,在该文件 ...
- 【重学Git】整理提交记录
有时候我们在本分支做了一个很小的更改提交,其他分支想直接拿到这个更改提交,有没有一种不像merge或rebase这么正式的做法呢?也就是说:我仅仅是想获取其中一个小改变而已.cherry-pick就是 ...
- git修改已提交记录的注释
已提交暂存区但还未提交远端仓库 命令:git commit --amend -m 已提交远端仓库 命令:git rebase 可以参考:http://www.cnblogs.com/dudu/p/47 ...
随机推荐
- 将本地代码初始化上传到gitlab仓库
首先你已经安装了git. 1.在本地代码目录,鼠标右键Git Bash Here: 2.执行git命令,此命令会在当前目录下创建一个.git文件夹, git init 3.将项目的所有文件添加到仓库中 ...
- S3C2440 LCD驱动(FrameBuffer)实例开发<二>(转)
开发板自带的LCD驱动是基于platform总线写的,所以如果要使其它的LCD能够在自己的开发板上跑起来,那么就先了解platform驱动的架构,下面简单记录下自己看platform驱动时体会,简单的 ...
- 安装ipython
安装ipython,首先系统上已安装python 在这里,我们已安装python3 在windows下: pip intsall ipython 在linux下: sudo apt install p ...
- 0基础如何更快速入门Linux系统?学完Linux有哪些就业方向?
Linux系统是使用Linux内核及开源自由软件组成的一套操作系统,是一种类UNIX系统,其内核在1991年10月5日由林纳斯·托瓦兹首次发布. 它的主要特性:Linux文件一切皆文件.完全开源免费. ...
- phpstorm 注解路由插件
idea-php-annotation-plugin 设置 插件 搜索 安装 重启
- spring boot:swagger3的安全配置(swagger 3.0.0 / spring security / spring boot 2.3.3)
一,swagger有哪些环节需要注意安全? 1,生产环境中,要关闭swagger application.properties中配置: springfox.documentation.swagger- ...
- JavaScript的9大排序算法详解
一.插入排序 1.算法简介 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. ...
- 单片机串口通信电平不匹配的解决电路,5V 3.3V串口通讯
很早的时候调试串口通讯遇到单片机和模块电压不匹配,信号无法传输,所以整理后来遇到的转换电路.1.最简单的用转换电平IC,可以去淘宝上搜索,有四路的有两路的,比如这个双向电平转换模块 2.根据接触的开发 ...
- kong in kubernetes
网关 这里提到的网关特指API网关.API网关是在微服务架构的演进过程中产生的,其核心功能是聚合后端服务,为客户端调用提供统一的门户.由于网关的集中式管理,在其上又衍生了限流.负载.路由管理.安全防护 ...
- configfs_sample.c 理解
1. 编译运行 代码从如下链接获得: https://github.com/torvalds/linux/blob/master/samples/configfs/configfs_sample.c ...