我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2n55ocfzqhogk
前言:
Git 是一个开源的分布式版本控制系统,最初由林纳斯·托瓦兹(Linus Torvalds)于2005年开发,目的是为了更好地管理Linux内核的开发过程。与传统的集中式版本控制系统(如SVN)不同,Git允许开发者在本地进行完整的版本控制操作,包括提交、分支和合并,而无需依赖网络连接到中央服务器。
Git的核心概念包括仓库(Repository)、工作目录(Working Directory)、暂存区(Staging Area)和提交(Commit)。开发者在本地仓库中工作,修改文件后可以将这些变更添加到暂存区,然后通过提交操作将这些变更记录到仓库的历史记录中。
Git还支持分支和合并操作,使开发者能够在不影响主分支稳定性的情况下进行新功能开发或实验性修改。分支操作是轻量级的,几乎可以瞬间创建和切换,这极大地提高了开发效率和灵活性。
此外,Git还具有强大的网络功能,支持通过HTTP、SSH等协议进行仓库的克隆、推送和拉取操作,使得多个开发者可以协同工作,共享代码变更。
总之,Git以其分布式的设计、高效的分支和合并操作以及强大的网络功能,成为了现代软件开发中不可或缺的版本控制工具。
基本操作
由前言的介绍,我们知道git强大的地方来源于版本控制,那么除了版本控制,我们要学习的基本操作有:
认识三个区域->添加文件->修改文件->版本回退->撤销修改的三种情况->删除文件。
这是本文的目标。
检查是否存在git
开始之前,我们应该先检查自己的机器里面是否存在git这个工具:
命令:git --version,可以查看git的版本,
ubuntu的系统下,删除git的命令是:sudo apt remove git -y,此时查看:
那么ubuntu重新安装git的命令为:sudo apt install git。
初始化仓库
那么有了git这个工具,我们应该新建一个仓库,并且要对仓库初始化,在图形化界面中,我们新建仓库的时候往往也是需要初始化的:
使用的命令是git init,此时初始化了仓库之后,在当前目录下就会创建本地仓库,标志是.git。
此时.git创建好了之后,比较重要的是我们最好配置名字,以及邮箱等:
通过命令git config user.name 等,初始化自己的信息。
那么我们如何看对应的配置信息呢?输入命令:git config -l即可:
此时对应的配置信息就打印出来了。
那么我们既然已经创建了.git,我们不妨使用tree看一下这究竟是个什么玩意儿:
这就是对应git的树状图,当然,里面有很多东西我们目前都不知道,不用急,咱也就先看看而已。
初始化配置的时候,我们还可以使用--global参数,表示全局的,也就是这台机器上的所有仓库都可以使用这个配置:
那么为了测试,我们再创建一个仓库:
验证成功。
那么删除对应的配置也很简单,使用unset即可:
但是不能一次性删除多个,只能一个一个删除:
仓库的初始化配置就到这里。
认识三个区域
git中的三个区域:
在git中,这三个区域,分别是工作区,暂存区,版本库,三个区域的取名还是比较生动形象的。
工作区,也就是平时我们存储代码的地方,暂存区,也就是经过一次add操作之后,代码的临时改动被存储到了暂存区,版本库,代码的更改都会放在这里面,并且是永久存储的。
其中,工作区到暂存区,需要Add,暂存区到版本库,需要commit,但是我们平常使用图形化界面的时候,上传到远端仓库还需要一个操作是push,目前我们学习的操作都没有涉及push,都是在add和commit。
对于暂存区,也有一种说法叫做索引,并且在暂存区和版本库里面还有一种区域,叫做objects,没错,就是这个:
objects也就是对象的意思,这实际上是个对象库,修改的工作区的内容会写入其中的git对象.
添加文件
我们添加文件有两种方式,一种是git add 修改的文件名 ,一种是git add . ,这个.就是当前目录的所有意思,也就是当前目录的所有修改都要加上,add之后,通常伴有git commit ,但是commit通常需要选项-m,-m的意思是提交日志,也就是:
这里需要注意的是,-m之后的描述是比较重要的,比如boss让你写了500个版本,如果每次commit的日志都是1,那么是很难进行版本回退的,因为都是1,没有描述具体添加还是删除了哪些功能,版本控制就变得麻烦起来了。
commit之后,有对应的介绍,1file changed ,一个文件改动了,0 insertions,代表没有行数增加,0 deletions代表没有行数减少。
我们也可以一次性,多添加多个文件:
这里需要再介绍一个命令,叫做git log,一般的软件都是有日志的,可以理解为日记的意思,它会记录该软件发生的所有事:
其中HEAD -> master是什么我们暂时不用管,前面的很大的16进制的数字是根据某种规则生成的,我们知道即可。
后面有对应的Author,Email,以及对应的日期,最后的就是提交的描述的。如果我们嫌打印出来的东西太多了,我们可以输入git log --pretty=oneline:
也就是将每次的提及以一行的方式打印。
那么在add commit操作里面我们看到了极其庞大的式子,还有HEAD -> master,我们可以通过查看.git文件来了解它们。
查看.git文件
根据最开始的git图:
我们现在不妨对比一下已经commit两次之后的git:
为什么暂存区还有一个名字叫做索引,就是因为我们commit之后,git之后新增了一个index,也就是暂存区的索引。
关于HEAD指针的问题,我们可以打印HEAD出来看看:
可以发现HEAD指针指向的就是master,那么master里面又有什么呢?再看看:
是一串很大的16进制的数字,那么这串数字又是啥?我们可以使用指令来查看:
指令git cat-file -p [数字]:
出现了我们熟悉的信息,第一个是tree,不管先,parent是我们上次提交对应的commit id,author等就不用介绍了,那么tree对应的是什么呢?我们使用指令再看看:
这些就是对应提交过的文件了,那么里面的数字又是什么意思呢?实际上是我们add之后,在文件里面进行了修改的内容,因为博主add的时候没有加东西,所以各位同学可以自行演示哦。
在git里面,对象库里面存在的13的是对应的对象。
修改文件
这里的修改文件并不是我们在git里面修改文件,我们查看修改文件之后git对应的状态,我们现在在file1新增内容:
此时使用指令git status:
此时file1文件变红,图形化界面也会有一个红色提示符,此时,nothing added to commit ...也就是说暂存区没有内容需要commit的,那么此时我们使用指令git diff:
其中index索引后面的我们不管,a/file1表示改动前的fie1,b就是改动后的。
---也是改动前,那么-0,0, +1是代表的行数变化,后面打印出来了对应的行增加了什么。
0,+1代表从改动后的0行开始新增1行。
这是修改文件。
这就是看的在暂存区和工作区之间的内容区别,当然也有暂存区和版本库的,各位同学可以自己试试哦。
版本回退
版本回退作为git最重要的一个功能,现在就揭开对应的荧幕,那么我们新造一个场景,重新提交一下文件,从file1到 file5 ,修改file1为Hello git ,到加上Hello world:
为了进行版本回退,使用的函数是reset,对应的选项有 --soft --mixed --hard,默认使用指令reset的时候选项是mixed,从soft到mixed到hard的,回退的情况是由轻到重的:
使用soft只会修改版本库的内容,mixed会修改暂存区和版本库的内容,hard会修改三个区的内容,所以hard一定是要慎用的。因为可能别人正在工作区写代码呢,你一个hard,框的一下给人代码全部干没有了,这就是一件很悲催的事儿。
那么我们现在演示一下hard,其他两个自然也就会了:
表示现在在当前版本。
我们也可以直接用HEAD指针,HEAD^表示上个版本,^^代表上上个,也可以使用~ + 数字表示,~ + 1代表上一个版本:
当我们成功回退到了上个版本,我们看看修改的file1的内容是怎么样的:
此时只有Hello git了,那么我们可以吃后悔药不呢?可以的,我们如果系统还没有退出来,可以看到对应的commit id,就可以:
此时:
那么如果我们的系统已经退出来了,看不到对应的id怎么办?我们可以:
此时有个缩短的commit id,也可以直接用的,我们可以利用该commit id直接回退,那么为什么git的版本回退那么快呢?
这是因为:
每次commit之后,返回的commit id实际上是不同的git对象,master指针只需要改变一下指向即可。
撤销操作
撤销操作分为三种,新增的代码还没有add,新增的代码已经add了但是没有commit,新增的代码不仅add了还commit了,对应只有这三种情况。
第一种情况:
如果我们还没有add,并且新增的代码并不是很多的情况下,我们不妨手动删除,但是在企业中,代码量都是比较多的,我们不能保证我们可以手动删除完全正确,我们希望代码回到最近一次add的时候,所以我们可以使用指令git checkout -- [filename]:
第二种情况:
已经add了,但是还没有commit,那么我们需要修改的就是暂存区,这就有意思了,我们可以直接使用版本回退的指令,mixed,修改暂存区的内容,但是不修改工作区的内容,此时就变成了如何修改工作区的内容,这不就回到了情况一了吗?
第三种情况:
那就更简单了,直接hard指令即可,只能说庆幸没有push到远程仓库吧,push了可就真的麻烦了,这里就相当于版本回退的操作,就不做实例了。
删除文件
删除文件就简单多了,我们对于普通的文件可以直接rm -rf,但是git里面,我们可以直接git rm filename:
这样可以在工作区删除对应的文件。如果直接rm,代表的只是本地删除了而已,仓库没有删除,
此时git的状态也会发生变化。
那么仓库删除了之后,commit一下:
此时,就干净了许多。
感谢阅读!
版权归原作者 _lazy. 所有, 如有侵权,请联系我们删除。