Git原理之时光机和分布式

2019-07-12 10:10:27 浏览数 (1)

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

Git是我们日常开发的必备工具,是团队协作的利器。Git使用广泛,而之所以如此流行,主要和它的一些突出的优点分不开。

真正的分布式

我们在使用Git时,无论是从远程仓库clone代码,还是把本地的代码推到远程的新仓库,都是完成的克隆一份代码。相当于是复制了一份代码到别的地方,也就是备份。

而且Git是去中心化的,这个去中心化简单理解就是每一份代码都是可以独立编辑使用的,不会因为某一个机器上的代码丢失了,而导致所有人都丢失代码或无法工作。

在 Git 中的绝大多数操作都只需要访问本地文件和资源。

举个极端的例子,假设公司的开发团队的代码都托管在GitLab上,如果有一天,GitLab突然挂了不能用了,会出现什么情况?实际上对我们开发影响不大,因为我们每个人的电脑上都有一份代码,代码并没有丢失,大家还是可以继续开发。

有影响的是团队协作,大家没法同步代码了,也就是把大家开发的代码合并在一起看效果。而这个也很容易处理,因为我们可以自己搭一个Git服务器,这个也是比较简单就能实现的。

Git是台时光机

Git存储了跟踪文件的每次提交的快照,我们每次提交一次(commit),Git就保存了一次。以后我们可以随时回到某一次提交(Commit)。使用git log命令可以查看当前分支的所有提交记录。

这里也引出了一个Git使用习惯,就是即时提交(Commit)。只有即时提交了,后续如果发现代码有bug,才能回滚到最理想的位置。当然也不是随便写几行就提交一下,那也是蛮累的。主要是一些必要的节点,比如完成一个小模块小功能等。

直接记录快照,而非差异比较

Git存储的是某一时刻所有文件的快照,而且存储的是整个文件的内容,而不是文件的差异。

图中可以看到,Git每次都记录的是文件的一个新的版本

其他分版本控制系统记录的是原始文件以及文件的差异

你执行的 Git 操作,几乎只往 Git 数据库中增加数据

很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。

我们提交数据到本地一般就2步,git addgit commitGit会记录你的每一次commit,以后任何时候你都可以把代码回到某一次commit,这就是时光机,也就是Git的回滚功能。

这里插播一个使用Git的好习惯,就是勤提交。尽量避免很长时间都不提交或是一次开发任务只最后提交一次这样的情况。

Git的使用

Git使用起来也比较简单,既可以用命令行也可以用第三方的工具,比如Android Studio自带的Git插件,Mac下的Sourcetree等。但是尽管像Sourcetree已经做得很人性化很简化了,在实际使用过程中我们还是难免碰到一些奇怪的问题,有时候是软件使用不熟悉,特别是使用一些相对高级一点的功能,比如回滚,合并冲突等。

我之前也是很依赖Sourcetree,一来是因为如果用命令行,需要记住很多的命令;二来是因为Sourcetree这样的软件相对来说比较直观,心里更踏实一些。

直到有一次,用Android Studio的Git插件推送的时候,推错分支了!然后为了回滚,在Sourcetree上忙了好一阵还是没有抹掉“犯罪证据”!后来还是同事帮忙弄的,很是尴尬!

这次教训让我慢慢开始切换到用Git命令行为主,Sourcetree为辅的路子上来。现在基本没有Git的问题困扰了。

用命令行的好处:

  1. 命令行其实熟悉了以后最简单,因为不用去熟悉新的软件工具,而且平时实际上也只需要其中几个常用命令,没有想象中的那么难
  2. 再也不会出现一些特殊的莫名其妙的意外,比如上面我碰到的,新建完分支直接被推到远程的老分支,因为远程找不到新分支。而如果用命令行推的话,Git就会报错,并提示你解决方法了
  3. 学会命令行其实是一件一劳永逸的事,不分平台和系统,统统都一样使用。
  4. 减少电脑负担,Mac上Android Studio多开几个工程就卡了,内存设置多大都没用,如果为了拉取推个代码还得再开个软件,那岂不是雪上加霜!万一卡住了,多点了几下误操作怎么办?(当然,我实际上还没遇到过)
  5. 高大上!哈哈...

几个建议:

  • 尽量过度到命令行,遇到问题,查一下对应的命令是啥,并记录下来便于后期查询,慢慢记录积累,坚持个把月妥妥就熟悉了
  • 养成随时提交(commit)的习惯,开发中完成一些小功能点就提交一下,避免几天都不提交的坏习惯
  • 用熟悉Git命令以后,可以尝试学习一下Git的原理,比如Git是如何记录每个文件的版本变化的?Git回滚是怎么回事?Git的本地仓库和远程仓库是怎么关联起来的?等等这些问题搞明白以后,后续使用过程中碰到一些问题就比较容易找到原因和解决办法。

正是基于以上的几点,我准备把自己最近学习到的一些Git知识总结记录下来,会分为几篇文章,希望自己以后碰到Git问题能快速的找到原因并解决,也希望对大家有所帮助。


0 人点赞