这才是真正的Git——Git实用技巧详解

作者:lzaneli,腾讯 TEG 前端开发工程师

本篇是这个系列的最后一篇文章,之前的文章主要讲的是基础原理部分(见上方专辑),在理解原理的基础上,介绍一些实用的技巧给大家,希望能提高大家的开发效率。

这篇文章因为更多的是列举实际应用的技巧,所以文章结构会显得散乱一些,也不会像前两篇文章那样要求大家顺序阅读。每个点都是互相独立的,大家可以根据自己的需要学习。

在这篇文章里我会使用操作录屏的方式来介绍例子,希望这种方式可以让你更直观的了解命令的使用方法。

将几个commit压缩成一个

⚠️ 这里有一点要特别注意的是:rebase会导致新的commit节点产生,所以切记不要对多人共用的远端分支进行rebase。

rebase -i 是个很实用且应用广泛的工具,希望大家都学会它的使用。它还可以用来修改commit信息,抛弃某些commit,对commit进行排序等等。具体命令如下,操作方式跟动图一致,都是在vim里面进行编辑。这里不展开,感兴趣的同学可以自己操作一下。

# Commands:# p, pick <commit> = use commit# r, reword <commit> = use commit, but edit the commit message# e, edit <commit> = use commit, but stop for amending# s, squash <commit> = use commit, but meld into previous commit# f, fixup <commit> = like 'squash', but discard this commit's log message# x, exec <command> = run command (the rest of the line) using shell# d, drop <commit> = remove commit# l, label <label> = label current HEAD with a name# t, reset <label> = reset HEAD to a label# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]# . create a merge commit using the original merge commit's# . message (or the oneline, if no original merge commit was# . specified). Use -c <commit> to reword the commit message.

另外如果要合并的是最近的几个commit,我们还可以用git reset --soft HEAD~3 && git commit -m 'xxx'来实现。对这个有问题的同学可以参照Git内部原理强调的可视化方法思考一下。

找回丢失的commit节点或分支

像上一步rebase后发现不符合预期,如何恢复?不小心删除了一个分支,如何找回?

“学会这个技能,你的同事会请你喝奶茶的,而且说不定还能收获妹子。” —— 来自往期课程的某位同学

主要思路为:找到要返回的commit object的哈希值,然后执行git reset恢复

我们知道Git的出现就是为了尽量保证我们的操作不被丢失,在Git内部原理中我们讲过,git object一旦被创建,就不可变更,所以只要找到它对应的哈希值,就能找回。但是ref呢?在Git内部原理中我们也讲过,它是一个可变的指针,比如说你在master中提交了一个commit,那当前的master这个ref就会指向新的commit object的哈希值。reflog 就是将这些可变指针的历史给记录下来,可以理解成 ref的log,也可以理解成 版本控制的版本控制

获得一个干净的工作空间

当我们实验一种思路,或者跟朋友讲代码时,我们可能会随意的修改代码。而当我们回到正常的开发时,我们需要一个干净的工作目录,即保证目前工作目录跟Git最后一次commit的文件是一致的。我们可以怎么做?

尽量少用会丢失文件的操作,除非你能够确定不再需要这些文件。

修改最近一个commit

commit完发现有一些临时的log忘记去掉?有一些文件忘记添加?commit信息出现错别字?

也可以使用 git reset HEAD~,然后执行你需要的修改,再commit即可,同上面介绍的命令效果是相同的。

提交一个文件中的部分修改

Git interactive add 还有很多功能,也推荐大家有时间可以尝试一下。

禁止修改多人共用的远端分支

如果一条远端分支有多人共用,那么不要在上面执行reset、rebase等会修改这条分支已经存在的commit object的命令。

具体的解释参照这篇文章 Rebase and the golden rule explained 。

撤销一个合并

如果是一个本地分支,仅需git reset --hard <合并前的SHA1>即可。

如果这个分支已经被推送到远端,比如说合并进master,发到线上才发现有bug需要回滚。这时分支有可能已经被其他人所使用,根据“禁止修改多人共用的远端分支”,你需要执行git revert -m 1 <合并的SHA1>,新增一个revert节点,如下图中的E'。

但要注意不要在原特性分支继续开发,而应该删除原来的分支,从E'节点拉出新分支做bug修复等。

如果在原特性分支上继续开发,则在合并回master的时候需要做一次revert操作revert掉E'节点,变成E‘’(如下图),不然很容易出现丢失文件等问题。具体原因分析参照分支合并中的总结。

从整个历史中删除一个文件

代码要开源了,但发现其中包括密钥文件或内网ip怎么办?

git filter-branch --tree-filter 'rm -f passwords.txt' HEAD

可以使用filter-branch命令,它的实现原理是将每个commit checkout出来,然后执行你给它的命令,像上面的rm -f passwords.txt,然后重新commit回去。

⚠️ 这个操作属于高危操作,会修改历史变更记录链,产生全新的commit object。所以执行前请通知仓库的所有开发者,执行后所有开发者从新的分支继续开发,弃用以前的所有分支。

其他好用的命令

下面这些命令也是比较实用的命令,感兴趣的同学可以自己学习一下。

  • git bisect 二分查找出现问题的变更节点,比如你发现当前提前下测试是不通过的,但HEAD~10(10个提交前)的测试是可以通过的,就可以用git bisect 来帮你定位到出现问题的变更点。
  • git blame 查看某行代码最后是谁修改的。
  • git show-branch 直观的展示多条分支间的关系。
  • git subtree 拆分或合并仓库。

希望大家读完有所收获。感兴趣的同学可以阅读同系列的其他文章:

  • 这才是真正的Git——Git内部原理
  • 这才是真正的Git——分支合并

参考

  • 书籍 Scott Chacon, Ben Straub - Pro Git-Apress (2014)
  • 书籍 Jon Loeliger, Matthew McCullough - Version Control with Git, 2nd Edition - O’Reilly Media (2012)
  • Rebase and the golden rule explained
(0)

相关推荐

  • Git各指令的本质,真是通俗易懂啊

    作为当前世界上最强大的代码管理工具Git相信大家都很熟悉,但据我所知有很大一批人停留在clone.commit.pull.push--的阶段,是不是对rebase心里没底只敢用merge?碰见版本回退 ...

  • 学会这 11 条,你离 Git 大神就不远了!

    仅做学术分享,如有侵权,联系删除 转载于 :作者: Escape 链接: https://www.escapelife.site/posts/f6ffe82b.html Git Flow 主干分支 稳 ...

  • Excel多列数据查重复值,4种操作技巧详解,操作简单又实用

    Excel我们经常会做的一个数据处理动作,那就是数据重复值的复核,我们经常会需要对表格中单列或多列数据值,进行数据重复值的核对避免数据出错.今天我们就来学习Excel常见的几种简单实用的数据复核技巧. ...

  • BIAS指标使用技巧详解,简单又实用

    乖离率(BIAS)是由移动平均原理派生出来的一项技术指标,其功能主要是通过测算股价在波动过程中与移动平均线出现偏离的程度,从而得出股价在剧烈波动时因偏离移动平均趋势而造成的可能回档或反弹.那怎么用乖离 ...

  • 小学语文选词填空7大解题技巧详解,太实用了!(附闯关练习)

    . 01 选词填空的技巧 01 拿捏词义的轻重 学生应拿捏词语的程度来适应语义和语境. 近义词虽然表达的意思是相近的,但在表现事物的某种特征或程度上,往往有轻重之别.我们辨析时就要注意区别. 例如:& ...

  • 家中养鱼,实用风水详解!

    古人对添丁进口之事很重视,除了根脉传承的原因,还有一个重要原因是有人气(生机.生气)才有财气.现代对这个概念相对淡化了,但为增加生养之气,也还会养宠物等.是情感需求也是潜意识需求. 而居家养鱼根本目的 ...

  • 铅锤哥:CPU硅脂怎么涂才有用?正确涂硅脂的方法详解

    DIY中从不缺少高手,但也经常会有更多的小白级玩家加入.有些东西可能对高手而言已经是很平常不过的事情,例如选购硬件,处理器平台的安装.这些可能对于入门级的玩家还是一个比较繁琐的问题,今天铅锤哥来讨论下 ...

  • 「实用」详解切杆打法,两个练习让你不再啃地/打薄!

    在场下打球,切杆总是打不好,不是啃地就打薄.特别是在短距离攻果岭的时候,明明胜利在望,却因为切杆打不好,被狠狠地罚杆! 想要打好切杆?一起跟着普高技术总监Benson刘臻霖去了解一下是什么原因导致啃地 ...

  • 实用教程详解:用OpenCV的DNN模块部署YOLOv5目标检测

    作者丨nihate 审稿|邓富城 编辑丨极市平台 极市导读 本文中介绍的整套程序只依赖OpenCV库就能正常运行,彻底摆脱了对深度学习框架的依赖.文章讲述了作者在自己编写用OpenCV的dnn模块做Y ...

  • 建筑施工各分部工程实用图文详解,315页,学习吧

    本资料涵盖房建.桥梁.隧道三大专业各分项工程,工程实例照片加文字简介,有助于现场施工指导,很有实用意义. 建筑工程施工现场各分部工程实用图文详解,图文并茂,PDF格式,315页,包括土方工程.桩基础工 ...

  • 它被称为“草鱼收割机”,简单又实用。详解博大物利器:飞铅钓法

    在自然水域钓鱼,总是能够遇到各种各样的鱼情,通过不同鱼情可以调整出许多适合的钓法,来提高上鱼概率.钓鱼人都知道,鱼情的变化在很大程度上取决了天气,一个好的天气加上合理而又科学的钓法,往往为我们作钓带来 ...