Git提效和需知
本篇内容如下:
- 通过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非常适合用于企业自建代码库。