作者: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

这才是真正的Git——Git实用技巧相关推荐

  1. Git实用技巧36招

    本文适合作为一个速查手册使用,希望深入了解 git 的同学,请前往 Pro Git 中文版 下载 <Pro Git>手册进行学习 Cherish作为一名菜鸟程序员在刚刚接触git时,虽然仔 ...

  2. 视频教程-Git 实用技巧-研发管理

    Git 实用技巧 汤青松,中国婚博会PHP工程师,擅长安全测试工具的研发及web参透测试.在处理web漏洞方面有大量实战经验,曾负责乌云众测研发,P2P平台网利宝的研发及安全建设工作;2017PHP全 ...

  3. 初中高级的 git 和 gerrit 技巧【大型项目实战总结 CR 经验】

    序 前半部分属于基础,后半部分属于进阶.从初级到中级再到我都 hold 不住的高级.全文共 12000 余字,超干超干的那种. 然而,写完一半的时候,我突然虎躯一震,我是不是在造轮子?随后我悄悄的搜了 ...

  4. Git使用方法技巧大全

    目录 Git 安装配置 用户信息配置 Git流程图 使用Git定位到待推送的项目目录 创建Git仓库 仓库的代码推送 上传远程代码并合并 下载远程代码并合并 版本回退 克隆别人的项目仓库到本地 空白文 ...

  5. git: git add --ignore-removal git add --all 区别

    遇到的问题 在仓库中删除文件后,试图直接用 git add . 将所有删除工作提交暂存区,结果遇到了报错: $ git add . warning: You ran 'git add' with ne ...

  6. 初探Git git基本用法

    Git 是当前最流行的版本控制程序之一,文本包含了 Git 的一些基本用法 创建 git 仓库 初始化 git 仓库 mkdir project # 创建项目目录 cd project # 进入到项目 ...

  7. 手把手教你入门Git --- Git使用指南(Linux)

    手把手教你入门Git - Git使用指南(Linux) 系统:ubuntu 18.04 LTS 本文所有git命令操作实验具有连续性,git小白完全可以从头到尾跟着本文所有给出的命令走一遍,就会对gi ...

  8. git git 查看远程库_如何从Git远程存储库中提取

    git git 查看远程库 Note: This the fourth video in the Git for beginners series. Watch the first video her ...

  9. 你可能不知道的关于 Git stash 的技巧

    简评:如果你用过一段时间的 Git,你可能会用过 Git stash 命令.它是 Git 最有用的功能之一. 以下是一些我在上周学的关于 Git stash 的技巧. Git stash save G ...

最新文章

  1. Java Socket编程 - 基于TCP方式的二进制文件传输【转】http://blog.csdn.net/jia20003/article/details/8248221...
  2. PowerDesigner使用教程 —— 概念数据模型详解
  3. 前端全栈大佬是如何使用javaScript实现一个无缝轮播
  4. 骑车与走路(信息学奥赛一本通-T1050)
  5. JDK源码(11)-Long、Short
  6. uni-app 七牛云上传文件
  7. 《TCP/IP详解》读书笔记
  8. 华为将联合京东举办线上发布会 或发布折叠屏手机
  9. 事实证明了 平台识别算法适应性还是很强的
  10. python代码写好了怎么运行-python的代码写在哪里,怎么样运行python代码
  11. 基于ssm整合的web考勤管理系统
  12. Extjs图书管理系统源码 智能化图书管理系统源码
  13. Latex笔记:IEEE Access模板
  14. 08_Flask ORM 利用SQLAlchemy进行数据库增删改查
  15. 如何保存android app日志(转载)
  16. 关于北京市电气火灾综合治理实施方案通知的解读
  17. 写给自己——瞎写瞎画坑规(自己挖坑自己填啊!!)
  18. 如何搭建SPA-单页面应用
  19. 是不正确的python语句_关于Python的if else语句,调用else不正确的问题
  20. 锐速ServerCheck序列号生成原理

热门文章

  1. Hackthissite realistic 6解密题后的记录
  2. 【网络知识点】防火墙主备冗余技术
  3. AtCoder - arc120_c Swaps 2(思维+线段树+模拟)
  4. POJ - 1201 Intervals(差分约束+最短路)
  5. PAT (Advanced Level) 1007 Maximum Subsequence Sum(最大连续子段和)
  6. spring和mybatis结合做简单的增删查改系统_如何从零开始设计权限管理系统
  7. PyCharm编写shell脚本无法运行
  8. 安卓入门系列-06常见布局之ConstraintLayout(约束布局)
  9. im4java profile_GraphicsMagick+im4java
  10. AJAX DELETE