目录
Git简介
git的安装和配置
新建仓库
工作区域和文件状态
git reset回退版本
使用git diff比较差异
Git简介
git是一个免费开源的分布式版本控制系统,它使用一个特殊的叫做仓库的数据库来记录文件的变化,仓库中的每个文件都有一个完整的版本历史记录,可以看到谁在什么时间修改了哪些文件的哪些内容。在需要的时候也可以将文件恢复到之前的某一个版本,如果没有版本控制系统,我们就只能通过最原始的方式来管理文件,原始的方式管理文件-将文件按照日期备份出多个副本,或者将整个项目的每个版本都保存到不同的文件夹中,而当许多项目成员在同时修改同一个项目的时候,就需要手工来合并两个人的内容,这样不但低效,管理起来也比较麻烦,版本控制系统就是为了解决这些问题而诞生的,有了版本控制系统,我们就可以跟踪每个文件的变化,让项目成员之间的协作变得更加高效。
目前市面上最流行的版本控制系统主要有两种,一种是集中式版本控制系统(SVN,CVS等),一种是分布式版本控制系统(Git、Mercurial等),集中式版本控制系统——所有的文件都保存在中央服务器上,每个人的电脑上都保存了一个副本,当你需要修改文件的时候,首先要从中央服务器上下载最新的版本,然后添加你想要的修改内容,修改完成之后再上传到中央服务器上,集中式版本控制系统的优点是使用起来非常简单,只需要从中央服务器上下载最新的版本,修改完成以后,再上传到中央服务器上就可以了。不需要考虑其他的问题,但是他的缺点也非常明显,就是中央服务器的单点故障问题,如果中央服务器出现故障·,或者网络连接出现问题,那么所有人都无法工作了,只能等待中央服务器或者网络恢复正常,而分布式版本控制系统就没有这个问题,每个人的电脑上都有一个完整的版本库,所以我们可以在本地上进行修改,不需要考虑网络问题,这样即使中央服务器出现故障,我们也可以继续工作,当需要将我们的修改内容分享给其他人时,只需要将仓库互相同步一下就可以了。
因为免费开源,速度快,功能强大,支持离线工作以及强大的分支管理等特性,Git已经成为了世界上最先进放入分布式版本控制系统。世界上超过90%的开源项目都在使用Git进行版本控制。GitHub GitLab Gitee等网站上托管的开源项目也都是使用Git来进行版本管理的,对于开发者来说,掌握Git是必不可少的技能。
git的安装和配置
首先进行git官网,Git (git-scm.com), 然后点击Downloads
win+R ,输入cmd,然后在命令框输入git-v,如果出现下边的版本号,则证明安装成功。
Git的使用方式,主要有以下三种:
- 命令行:推荐使用,效率高,理解深
- 图形化界面:通过一些专用的图像化界面来使用Git
- IDE插件/扩展: 在常用的IDEA或者VSCode这些IDE中,通过插件或者扩展方式来使用。
为了区别与linux中的命令,则git中所用的命令,都以git开头,后面跟着命令。
在开始使用git之前,第一步就是使用git config 命令来配置一下用户名和邮箱,这样在提交的时候,才能识别出来谁提交的内容。
git config --global user.name "zhangyu"
local参数:本地配置,只对本地仓库有效
这里global参数:全局配置,所有仓库生效。
system:系统配置,对所有用户生效。(一般不使用)
配置邮箱:如果没有空格,可以不使用 双引号
git config --global user.email zy507899@163.com
我们可使用下边命令来保存用户名和密码,这样就不需要每次都输入了
git config --global credential.helper
我们可以使用下列命令来查看git配置信息
git config --global --list
配置完成以后我们就可以用git来管理我们的代码了
新建仓库
我们可以把仓库理解成一个目录,在这个目录里面所有的文件都可以被Git管理起来,每个文件的修改,删除,添加等操作,Git都可以跟踪到,以便任何时候都可以跟踪历史或者还原到之前的某一个版本。只需要把一个目录变成Git可以管理的仓库就可以了
方式一:一种是在自己电脑本地创建一个仓库。
git init
方式二:从远程服务器上克隆一个已存在的仓库。
git clone
注:我们创建的仓库,是一个隐藏的,ls查看不了,需要ls -a 来查看,我们查看仓库中好多文件,这些文件和目录都是Git仓库中的重要组成部分。不要随意删除和修改,否则会破坏git仓库。这也是为什么要把这个目录隐藏起来的原因。
使用方式一在本地创建一个仓库
使用方式二使用git clone命令从Github或者Gitee这种远程服务器上来克隆一个已经存在的仓库。
git clone https://github.com/geekhall-l
工作区域和文件状态
Git的本地数据管理分为三个区域,分别是工作区(working directory),暂存区(staging Area/Index)和本地仓库(Local Repository),我们在资源管理器里边可以看到的文件夹就是工作区,暂存区是一种临时的存储区域用于保存即将提交到Git仓库的修改内容,暂存区是在Git进行版本控制时非常重要的一个区域,本地仓库就是通过git init命令创建的那个仓库,它包含了完整的项目历史和元数据,是Git存储代码和版本信息的主要位置,简单来说,工作区就是我们实际操作的的目录,暂存区就是一个中间区域,用于临时存放即将提交的修改内容,本地仓库就是Git存储代码和版本信息的主要位置,当你修改完工作区的文件后,需要将他们提交到暂存区,然后再将暂存区的修改提交到本地仓库中。这个过程中我们可以使用Git提供的命令来查看,比较或者撤销修改,来保证版本控制的准确性和完整性。
我们举一个形象的例子,来说明三个区域之间的关系
我们可以把仓库理解成工厂里边的仓库,这个仓库里边有许多的货物和产品,这些货物和产品就是我们的文件,比如说我们的代码文件,文本文件,图片文件等等,工作区就是生产这些货物的车间,对我们的货物进行生产、加工和修改,车间生产完这些产品之后需要运送到仓库里边保管起来,那么车间和仓库之间需要一个运输工具,比如我们使用小货车来运输,那么这个小货车里边就是暂存区,车间生产完产品之后,把产品放到小货车上,然后运输到仓库里边保存起来,联系到工作中,当我们的代码完成到一个阶段,需要存档备份的时候,就可以把这个版本放到本地仓库里面保存起来,在版本控制器中,这个保存到仓库的过程就叫做提交,但是,如果我们每次文件修改之后都需要一次提交的话就很麻烦,所以Git给我们提供了一种方式,也就是可以将修改的文件先添加到暂存区中,然后再将所有暂存区的文件统一执行一下提交操作,也就是车间生产完货物之后,并不需要每次都送到仓库里面,而是把这些货物放到小货车上,然后一次性的运送到仓库里面保存起来,相应的git中的文件也存在几种状态,分别是:未跟踪、未修改、已暂存和已提交。
- git init 创建仓库
- git status 查看仓库状态
- git add 添加到暂存区
- git commit 提交
①查看当前仓库的状态,比如可以查看当前仓库处在哪一分支,有哪些文件,并且这些文件当前处在一个怎样的状态。现在我们创建一个zy.txt,里边的内容是“这是我的第一个文件项目”,我们查看他的状态。我们可以看到,文件的状态是未被跟踪的。
②我们使用git add 将文件放到小货车里边,也就是暂存区,等待后续的提交操作。并且查看他的状态可知,zy.txt已经变成绿色,状态已经变成 committed.表示已经被添加到暂存区,并且等待提交。
③将文件提交到仓库中,使用命令git commit,只会提交暂存区中的文件,不会提交工作区的其他文件。比如我们再创建一个新的文件。git commit 这个命令在提交的时候需要使用-m参数来指定提交的信,这个信息会被记录到仓库中,如果不指定-m这个参数,那么git commit命令会进入中一个交互式的界面,默认会使用vim来编辑信息,提交完成之后,看一下仓库的状态。可以看到刚才绿色的已经不见了。这是因为我们将zy.txt已经提交到仓库里边保管起来了。因为yyq.txt不再暂存区,所以提交时候,不会被提交到仓库里边的。
④git add 命令还可以使用通配符来添加多个文件,git *.txt ,将txt结尾的文件名,都保存到赞存区去。可以看到以txt文件结尾的,都已经被添加到赞存区了。而zy.sh文件因为不是以txt结尾,所以没有被添加到暂存区,除了通配符之外,git add命令还可以接受文件夹作为参数,比如,想要添加所有文件的话,可以使用git add .把当前文件夹下的所有文件都添加到暂存区。
我们可以看到所有文件都被添加到暂存区。
接下来我们vim强大的文本编辑器来提交到仓库,也就是git commit 不加-m参数,vim编辑器中,使用i编辑,使用esc退出,:wq保存并退出。
⑤现在仓库中已经有了两次提交,可以使用git log命令来查看提交记录,可以看到我们已经有了两次提交,每次提交都有有个唯一的提交ID,其中git log --oneline可以查看简洁的提交记录。这样只显示每次提交的id和提交的信息。
git reset回退版本
我们经常会需要撤销之前的一些修改内容,或者回退到之前的某一个版本,这个时候git reset这个命令就配上用场了,reset命令可以退回到之前的某一个提交的状态,git reset的三种模式,也就是后边可以加上三种不同类型的参数,分别是 git reset --soft、git reset --hard、git reset --mixed。也就是软的、硬的、混合的。soft参数表示回退到某一个版本,并且保留工作区和暂存区中所有修改的内容。hard 参数表示回退到某一个版本,并且丢弃工作区和暂存区中所有修改内容。mixed 这个参数就是介于soft和hard这两个参数之间。回退到某一个版本,并且只保留工作区的修改呢内容,丢弃暂存区的的修改内容。
首先我们分三次上传文件到暂存区和仓库,其中上传记录如下:
我们分别复制三次,分别来执行不同的参数,
①我们来看soft参数, 我们执行git reset --soft +回退版本的ID,我们看到提交历史只剩下两次了。再看一下工作区和暂存区的内容,使用ls来查看一下。使用git ls-files来看暂存区的内容,可以知道,到存在,并且看一下仓库状态,提示我们是一个新文件,因为我们使用的是soft参数,所以回退到上一个版本时,工作区和暂存区不会被清空,所以“yyq3.txt”这个文件还是存在的。
②同理使用hard参数,我们可以看到暂存区还有工作区都没有‘yyq3.txt’这个文件了
③接下来看一下第三个参数,mixed参数,我们可以看到提交历史也是只有两次,我们看一下工作区中“yyq3.txt”已经不存在,而暂存区中’”。
如果我们不小心误操作,使用hard参数,将暂存区和工作区都删除了,不要担心,因为git中所有的的操作都是可以回溯的,可以使用git reflog来查看历史操作,找到误操作的版本号,然后使用 git reset --hard 版本号,回退到这个版本就可以了。
使用git diff比较差异
gitdiff后边不加参数,默认比较暂存区和工作区的差异。他会显示发生更改的文件以及更改的详细信息,我们可以看到已经变黄,说明我们修改了一些内容。git会将文件内容使用哈希算法生成一个40位的哈希值。这里只显示了哈希值的前7位,后边的100644,表示的是文件的权限,红色代表删除的内容,绿色是刚刚新加的。
接下来我们将修改以后的工作区,重新上传到暂存区,再比较差异。可以看到没有任何差异了。
我们还可以比较工作区和版本库之间的差异,在git diff HEAD
我们还可以比较暂存区和版本库之间的差异 git diff --cached
我们也可以比较不同版本ID的差异 使用git diff 版本1 版本2
HEAD表示当前版本,HEAD~表示上一版本,HEAD~2表示HEAD之前的两个版本
git diff HEAD~3 HEAD yyq3.txt,表示yyq3.txt当前版本和前三个版本的差异
未完待续~~~