Git是目前世界上最先进的分布式版本控制系统(没有之一),是程序员在公司工作必须具备的技能。
Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。
Git易于学习,占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CVS、Perforce和 ClearCase等版本控制工具。
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制最重要的功能是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
用最贴近我们的一个例子来理解,当我们在写毕业论文的时候,一般来说都会经过十几次修改才会达到导师的要求,然而在修改的过程中,我们并不知道下一次修改是否会比原论文优秀,有可能经过我们修改的反而更差,所以,我们一般不会直接在原论文上进行修改,而是会新建一个副本,对副本进行操作,到最后我们会发现,完成一篇毕业论文我们会写十几个甚至是几十个.docx文件,这就是版本控制的思想。
我们知道,在公司中,一个项目通常是由一个团队来协作开发的,就比如一个项目由小红、小花、小李、小美四个人组成的团队来合作开发,有一天,小红完成了项目的一个小功能,并把它上传到了公司服务器上,但是小花觉得这个功能中的一部分代码可以优化,于是她从服务器上下载了小红的代码并对其进行修改,同时小李也从服务器上下载了该代码进行优化,那么这时候就会发生两个问题:第一,修改完成上传后,小李修改后的代码会直接覆盖掉小花修改的代码,导致小花的努力白费;第二:小李修改后发现代码出现了一个bug,想要退回到小红完成的代码版本,但是这时候小红的代码已经被覆盖掉回不去了;上面这种情况在公司项目开发的过程中是十分普遍的;所以,我们需要一个能够记录代码变化的版本控制工具来帮助我们管理代码。
版本控制工具可以分为两类:分布式版本控制工具和集中式版本控制工具。
集中式版本控制工具:
常见的集中式版本控制工具:CVS、SVN(Subversion)、VSs。
集中化的版本控制系统诸如CVS、SVN等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。
这种方式的好处是每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限(安全),并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松容易。
分布式版本控制工具:
常见的集中式版本控制工具:Git、 Mercurial、Bazaar、Darcs。
像Git这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:1.服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的);
2.每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全);
我们知道,Linus在1991年创建了开源的Linux,Linux创建之后,吸引了全世界众多的程序员和操作系统爱好者参与到Linux的完善和壮大中来,那么,这么多人在世界各地为Linux编写代码,这些Linux的代码该如何管理呢?
事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码。
你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。
不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
但是在2005年的时候,开发Samba的Andrew试图破解BitKeeper的协议,被BitMover公司发现了,于是BitMover公司为了自己的公司利益,收回了Linux社区的免费使用权。
于是Linus花了两周时间自己用C语言写了一个分布式版本控制系统,也就是Git,一个月之后,Linux系统的源码已经全部由Git管理了。(什么是大神啊!)
Git由于其Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。(参考资料:https://www.liaoxuefeng.com/wiki/896043488029600/896202815778784)
我们可以直接通过Git官网进行安装 Git官网链接:Git (git-scm.com)
但是我们发现,直接通过Git官网下载的话非常慢,速度只有几十KB每秒,所以我们一般会通过国内的镜像网站,比如阿里的淘宝,来进行下载(当然会另说) 淘宝镜像下载地址
找到里面的最新版本,然后根据自己的电脑位数选择对应安装包。把安装包下载好之后,我们双击运行.exe文件进行安装,在安装过程中我们只需要改动一个地方,即软件的安装路径就可以了,把软件放在自己想要的路径下面,比如我就是放在D盘下的software的Git文件夹内,其余的地方无脑下一步即可。Git安装完毕后,我们在任意位置单击鼠标右键,只要出现了Git Bush Here和Git GUI Here两个选项就说明安装成功了,在Git Bash Here中输入"git --version" 可以查看当前Git版本。
Git可分为三个区域:工作区、暂存区以及本地库。
工作区:指代码所在的文件夹,我们可以通过 “git add” 命名把工作区里的代码添加到暂存区里,使得该文件被git追踪。
暂存区:用来临时存储代码,我们可以通过 “git commit” 命名把暂存区里的代码提交到本地库里,从而生成对应的历史版本。
注:一旦把代码提交到本地库,那么代码的历史记录就会永久存在,不能被删除,即使你把代码从V1版本更新到了V2版本,然后重新add
commit,仍然是可以重从V2版本退回到V1版本的,所以骂老板的话尽量不要commit到本地库,否则就只能删库跑路了(doge)。
Git的更多命名:Git指令大全
Tips:Git的语法和Linux是一样的,所以我们在输入Git命名的时候,只需要输入前几个字母,然后双击table键,系统就会自动补全命名。
用户签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git首次安装必须设置一下用户签名,否则无法提交代码。(注意:这里设置用户签名和将来登录GitHub(或其他代码托管中心)的账号没有任何关系)
我们可以在Windows的家目录下找到.gitconfig配置文件,里面就保存着刚才设置的用户签名。
在你管理Git的文件夹下打开Git Bash Here,然后执行 “git init” 命名,此时就会出现一个.git文件夹,这代表初始化成功。(注:.git默认是隐藏的,需要把隐藏文件打开才能看到)
在Git的管理目录下,输入 “git status” 可以查看本地库状态。第一行代表你目前所处的分支,第二行代表你提交的次数,第三行代表你需要提交的文件。
当我们在Git-Space目录下新建文件,并在文件中写入内容后,本地库状态就会随之发生改变。
添加暂存区,就是把代码通过 “git add” 命名添加到暂存区里面,使得代码被git追踪。
指令形式:git add 文件名
我以我临时写的一份代码为例,我的测试代码存放路径是 “e->code_2022->c.code->git_test”,我的Git管理路径是 “e->Git-Space”,现在我们要把git_test添加到暂存区里面,需要两步:
图示:注:这里可能会出现一个 The LF will be replaced by CRLF,不用在意。
在代码成功提交到暂存区后,我们也可以通过 “git rm --cached git_test” 命名来删除暂存区中我们刚刚添加的代码。
提交本地库:我们可以通过 “git commit” 命名把暂存区中的代码提交到本地库中,从而生成对应的历史版本,实现版本控制。
指令形式:git commit -m “日志信息” 文件名 (日志信息内容自定义)
我们还是以上面的git_test为例,之前我们已经把git_test添加到暂存区里面了,现在我们需要把它提交到本地库。其中的 “1cb81f5” 是我们本次提交所对应的版本号。
我们可以通过 “git reflog” 命令来查看日志信息,通过 “git log” 命令来查看详细的日志信息:
“git reflog” 中:依次显示的是版本号、所处分支、日志信息;
“git log” 中:依次显示的是完整版本号、所处分支、提交者/用户签名、提交时间、日志信息;
如果已经提交本地库的文件经过了修改,则需要重新把该文件复制到Git-Space文件内,然后添加到暂存区、提交到本地库,这时该文件会重新拥有一个版本号,并且之前的版本号并不会被删除,而是会一直存在,从而达到版本控制的效果。
Git还有一些其他的操作,比如:版本穿梭,查看、创建与切换分支,合并分支,团队协作等;由于本人目前大一,而这些操作在大学中完全不会用到,所以这里我就不展开叙述,而是会在大三下学期或者大四的时候创作关于Git进阶的知识,望谅解。