暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关于Git的一些概念

一十二章经 2021-09-03
368

Git是一款「分布式」版本控制系统(Version Control System),与之相对应的就是集中式版本控制工具的代表SVN。当然,从这两款工具的title可以看出分布式的肯定比集中式的更强大。本篇主要介绍Git的一些理论的东西,不会涉及很多实操

Git 和 SVN的区别

这两款工具最大的区别就是对文件进行版本的控制的地方不一样,SVN必须依赖中央服务器进行版本管理,也就是当项目中有文件添加或修改时必须commit到中央SVN服务器进行版本的更新

从图片中可以看出,假设SVN中央服务器挂了,那么所有项目成员就无法commit本地修改的文件,即无法进行项目的版本控制。这种模式也称之为集中式版本控制

而Git就不一样了,Git将版本控制操作交给每一个项目成员的机器自己去操作,做到真正的“去中心化”。如下图所示,每一个成员在本地添加或者修改文件后直接commit由本地Git服务做版本控制。

在团队合作中,另一个成员从远端仓库(e.g GitHub)将项目拉取下来后就能够看到该项目以前的所有版本提交记录了。即使与远端断开连接也还是能看到全部的提交记录。而SVN就不行,只要与SVN中央服务器一断开就无法查看提交的log,SVN所有的版本操作和记录都依赖中央服务器。

Git版本回滚的本质

Git为用户定义了3个区域:工作区(working tree)、暂存区(index)、本地仓库(repository)。我们修改一个文件首先是在工作区中修改,然后利用git add
命令将修改的内容添加到暂存区,接着利用git commit
将暂存区的内容添加进本地仓库中。

文件的修改一旦commit到了本地仓库就表示该项目进行了一次版本控制,这条记录是无法被抹除的。此时Git会生成一个40位散列值标记整个版本。这个40位的散列值会生成一个文件存储在.git/object/下。


看到这里有些路子比较野的就会想,假设某一次版本提交我不想要了那么直接删除object目录下对应的文件就好了吧?答案也确实如此,我直接删除版本文件,提交记录确实可以被抹除,Git也能正常运行。但这种方式极其不建议,对于版本的控制从来都不是说采用删除哪一个版本记录的手段进行回滚。Git提供了git reset
方式用于将本地工作区的版本回滚到指定的版本。只要object目录下存在的版本就都能回滚到,例如

git reset --hard 0a1db2e1af75a15b5605db868db31ddea33424e9 # 开头的oa是目录名称,后面1d...是文件名称

由此可知Git回滚的本质是根据object目录下记录的文件进行版本回滚

Git玩的还是指针

Git的分支切换和版本回滚的可以用上面这张图说明白:目前项目已经有6个版本,但可能采取了版本回滚,master分支处于版本4而dev分支处于版本5中,HEAD指向的是dev分支表示目前工作区(working tree)是dev分支下的内容,即我们工作在dev分支下面。

借助intellij IDEA帮助理解这一过程:

在.git目录下的HEAD文件就是记录了当前的工作区是在那个分支,然后根据HEAD文件中记录的分支名称从.git\refs\heads目录下找到对应的分支后即可查出当前工作区的版本号

终端运行git reflog查看当前版本信息可以看到当前版本的散列值就是dev记录的散列值(git reflog只显示前7位)

文章转载自一十二章经,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论