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 commit
git config --global alias.co checkout
git config --global alias.b branch
git config --global alias.ba 'branch -a'
之后的操作就可以用短指令了
# 提交代码 git commit -m
git ci -m 这是一次提交
# 查看分支 git branch
git 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 内容可能有这些
.idea
/out
有的时候我们只需要一个目录用来存放运行时数据,比如我们新建一个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非常适合用于企业自建代码库。
三、计划
后续会陆续写一些关于 撤销回滚、进阶的分支合并、冲突解决的相关技巧。