大家好,今天和大家聊聊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仓库的提交记录乱成一团,怎么办?的更多相关文章

  1. git log 查看提交记录

    git log 查看提交记录 1. git log 查看提交历史记录2. git log --oneline 或者 git log --pretty=oneline 以精简模式显示3. git log ...

  2. git log 查看提交记录,参数:

    git log 查看提交记录,参数:-n (n是一个正整数),查看最近n次的提交信息 $ git log -2 查看最近2次的提交历史记录 -- fileName fileName为任意文件名,查看指 ...

  3. 2.1获取Git仓库-2.2记录每次更新到仓库

    2.1 获取 Git 仓库 获取 Git 仓库通常有两种方式 将尚未进行版本控制的本地目录转换为 Git 仓库: 从其它服务器 克隆 一个已存在的 Git 仓库. 在已存在目录中初始化仓库 首先进入该 ...

  4. 如何向整个 Git 仓库补提交一个文件

    微软在 Reference Source 里开放了 .Net Framework 多个版本的源码.为了更方便地阅读这些源码,我们把每一个版本都下载下来后按顺序提交到 git 仓库中. 但是!!!居然忘 ...

  5. 在GIT中修改提交记录

    在SVN中,提交记录是无法修改的.比如说,当我们提交了某次修改后,发现该次提交中有错误时,只能将将补丁再次提交一遍.这样,就存在两次提交记录,没有保证提交的原子性. 在GIT中,由于提交是在本地进行的 ...

  6. git查看commit提交记录详情

    相关的命令: git log:查看所有的commit提交记录: git show: 查看提交的详情: 首先,需要通过git log打印所有commit记录,例如: 1.查看最新的commit:git ...

  7. Python - Git仓库忽略提交规则 & .gitignore配置

    Git 忽略文件提交的方法 有三种方法可以实现忽略Git中不想提交的文件. 在Git项目中定义 .gitignore 文件 这种方式通过在项目的某个文件夹下定义  .gitignore 文件,在该文件 ...

  8. 【重学Git】整理提交记录

    有时候我们在本分支做了一个很小的更改提交,其他分支想直接拿到这个更改提交,有没有一种不像merge或rebase这么正式的做法呢?也就是说:我仅仅是想获取其中一个小改变而已.cherry-pick就是 ...

  9. git修改已提交记录的注释

    已提交暂存区但还未提交远端仓库 命令:git commit --amend -m 已提交远端仓库 命令:git rebase 可以参考:http://www.cnblogs.com/dudu/p/47 ...

随机推荐

  1. 使用docker搭建redis服务器记录

    #mkdir /home/redishome#mkdir /home/redishome/data#chmod -R 777 /home/redishome把redis.conf传到/home/red ...

  2. mysql5.7.23 解压版 密码忘记了咋办??

    mysql 5.7.23  err文件: 查看log中保存的 密码 记下密码,重新启动MySQL服务,并进入CMD命令行,在此使用mysql -u root -p登陆,键入密码 进入数据库后,使用se ...

  3. MeteoInfoLab脚本示例:合并数组

    对于全球数据来说,经度要么是-180 - 180,要么是0 - 360,都会存在边界数据不连续的问题.比如0 - 360的数据,怎么得到 -20 - 30度的连续格点数据就是个问题(跨越了数据的经度边 ...

  4. UDP协议网络Socket编程(java实现C/S通信案例)

    我的博客园:https://www.cnblogs.com/chenzhenhong/p/13825286.html 我的CSDN博客:https://blog.csdn.net/Charzous/a ...

  5. 移动吉比特H2-2光猫超级用户与密码

    移动吉比特H2-2光猫超级用户与密码 超级用户名CMCCAdmin 密码aDm8H%MdA----------------版权声明:本文为CSDN博主「BenSon.Album」的原创文章,遵循CC ...

  6. 落地Azure CosmosDb的一个项目分享

    我们遇到了什么? 我们有这么一个业务场景,就是某供应商会去爬取某些数据,爬到后会发到一个FTP上,然后我们定时去获取这些数据 这个数据有大有小,小的30多M数据量百万级,大的数据量能到数百M上千万数据 ...

  7. kibana-安装-通过docker

      拉取镜像 docker pull kibana:7.9.1   创建用户自定义网络 docker network create esnet   运行Kibana docker run --name ...

  8. maven项目导入eclipse报错

    错误提示: 原因:未安装maven,缺少ojdbc6.jar包 解决: 一.安装maven 第一步百度搜索Maven官网,进去之后,下载apache-maven-3.5.3-bin.zip,下载完成之 ...

  9. Error:(4, 17) java: 程序包org.junit不存在

    内容:Error:(4, 17) java: 程序包org.junit不存在 场景:运行测试类的时候,IED新建一个自己的项目,并且不用maven的情况下 解决方案:File -> Projec ...

  10. JDBC Statement PrepareStatement

    1.JDBC中Statement接口和PrepareStatement接口关系与区别 Statement接口不能使用占位符?,需要拼sql,所以没有setInt,setString等方法:Prepar ...