Git提效和需知

9/14/2022

本篇内容如下:

  • 通过git 别名设置快捷键
  • 命令行日志美化
  • gitignore文件介绍
  • gitkeep文件介绍
  • 为什么git是分布式
  • 两种仓库地址
  • git、github和gitlab

# 一、命令行操作提效

如果经常使用 Git 命令行,会发现命令敲起来稍微有些浪费时间。

所以一部分提效就在这里。

# 1.精简命令

Git支持设置指令别名,通过 git config alias 就可以把长指令变成短指令。

  • Mac 下打开一个终端
  • Win 下打开一个Git的Bash

然后复制下面的别名配置:

git config --global alias.pl 'pull'
git config --global alias.ps 'push'
git config --global alias.ss 'status -s'
git config --global alias.s 'status'
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.b branch
git config --global alias.ba 'branch -a'
git config --global alias.mg 'merge'
git config --global alias.mgs 'merge --squash'
git config --global alias.hide 'update-index --assume-unchanged'
git config --global alias.unhide 'update-index --no-assume-unchanged'

之后的操作就可以用短指令了

# 提交代码 git commit -m 
git ci -m 这是一次提交
# 查看分支 git branch
git b

这些配置会写到~/.gitconfig 文件中,如果不想用或者想修改,打开这个文件就能很直观的看到。

# 2.日志美化

git log 提供的交互实在是太差了,以至于我们只能跑去GUI软件里去看日志。

但有时候,在命令行配合一些指令来查找日志,也是很有必要的,所以我们需要把日志做一些美化。

Git提供了很多参数,都在官网可以看到,我从网上收集了一个配置,我觉得用起来很方便。

#每次展示10条
git config --global alias.ll "log -10 --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

#每次展示所有日志
git config --global alias.la "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%ci) %C(bold blue)<%an>%Creset' --abbrev-commit"

提供了两个短指令,对日志做了美化:

  • git ll 意为 log latest,只展示最近10条日志
  • git la 意为 log all,支持分页

执行的效果如下

会在一行里展示:提交时间、提交人、备注、commitId、分支。

如果我们需要按关键字排查,如下就是效果:

$ git la | grep kong | grep 2021
| * fc49250ec - 增加ci线上切换kong脚本 (2021-06-05 19:25:51 +0800) <zhangsan>

# 二、ignore文件和keep文件

# 1. ignore

ignore是指在git代码库下的 .gitignore 文件,这个文件可以放到各个地方,是为了告诉git哪些文件不想提交。

一个项目常见的.gitignore 内容可能有这些

# IDE文件不提交
.idea
# 项目根目录的out不提交
/out
# 所有 .iml 文件不提交
# 项目根路径的 logs 目录下所有文件不提交

有的时候我们只需要一个目录用来存放运行时数据,比如我们新建一个runtime目录,我们希望这个目录在代码库,但是不希望提交里面的东西。那么会在runtime里放一个 .gitignore文件

*
!.gitignore

上述文件第一行标识忽略该目录下所有文件,第二行添加了一个例外——除了.gitignore文件。

# 2.keep

git 是不允许提交空目录上去的,有时候我们又的的确确需要提交一个目录上去,尤其在项目初始化的时候。

后续这个目录可能还会放别的文件,放一个.gitignore不太搭配。所以就会新建一个完全为空的 .gitkeep 文件。

# 三、关于git本身

# 1.为什么git是分布式

在介绍Git的时候,都会说git是分布式版本控制,还会拿SVN来对比,说SVN是集中式版本控制软件。

因为SVN的历史提交都在远程服务器,但是Git不同,Git的仓库就在本地。

# git 仓库

打开一个项目,看到的 .git 目录,就是Git仓库。

正常情况下,所有提交历史都会保存在这里,我们通过 git log 看到的所有的历史记录都来自这个目录。所以这里注定会越来越大。

如果某同事先把一个大文件误提交了,然后删除之后又提交了一次。这个大文件会一直保存在Git仓库里,历史记录里会一直存在。除非通过特殊手段把这个文件处理掉。

# 分布式

所以即便没有集中的仓库,我们也可以在本地提交。而svn如果连不上远程服务器,连日志都无法查看。

而我们执行的 pull 和 push ,其实是在用自己的仓库和远端的仓库交互:push是把自己本地的仓库变动记录同步到服务器,pull则是做相反的操作。

# 2.git 仓库地址为什么有两种

在GitHub 上自己的仓库有两种clone方式,这是因为服务器提供了两种不同的通信和认证方式,其中一种是基于HTTP协议的通信和认证,另外一种是基于SSH。

特别建议用SSH的方式与自己仓库通信。

如果用https的方式,并且选择了记住密码,那么git会把密码记录到本地,而且是明文。如果将来密码修改,还需要同步修改密码。

而用SSH的方式不仅安全,而且方便,关于这些网上有很多。

这里就想说一句:只要自己的私钥保护的好,是可以用在所有可用的地方,并且一直用下去的。

笔者的这一对秘钥从毕业一直在用,换了公司,换了服务器,从GitHub到码云,用的始终是同一对秘钥。

# 3.Git和GitHub和GitLab

很奇妙,尽管Git和GitHub就像老婆和老婆饼,但的确很多人不了解。

Git和GitHub关系比较好区分:

  • Git只是一个软件,用来管理代码的
  • GitHub是一个网站,提供一个存放代码的地方。用来跟这个网站交互的软件就是Git。

GitHub和GitLab就有点类似了。

  • GitHub是一个平台,大家都把代码放到这里,由GitHub官方提供服务运维。
  • GitLab 是一套系统,一套支持自己部署、部署完成后类似于部署了一套GitHub的系统。

自己部署的系统,当然会有更多的权限。不仅如此,GitLab还提供了一整套代码部署的机制。

所以GitLab非常适合用于企业自建代码库。