vlambda博客
学习文章列表

Git提效和灯下黑的知识

日常使用git,难免会遇到一些略微棘手的问题,如果在遇到这种问题后临时去搜索,或请教别人,只能零散地学习,而且很容易忘。

所以准备写个关于Git日常的系列,系统性的分享一下相关知识和技巧。

一、Git提效

主要是命令行操作的提效。

虽然现在Mac下的偏爱sourcetree,windows下的倾向使用IDE,但是只有理解命令行的操作,才知道在界面上的每一次点击,到底做了什么。

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

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

1.精简命令

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

  • Mac 下打开一个终端

  • Win 下打开一个Git的Bash

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

git config --global alias.ss 'status -s'git config --global alias.s 'status'git config --global alias.ci commitgit config --global alias.co checkoutgit config --global alias.b branchgit config --global alias.ba 'branch -a'

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

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

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

2.日志美化

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

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

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>

3. ignore

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

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

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

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

*!.gitignore

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

4.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非常适合用于企业自建代码库。

三、计划

后续会陆续写一些关于 撤销回滚、进阶的分支合并、冲突解决的相关技巧。