git的使用
目录
一、什么是git
二、git的使用方式
三、命令行的使用
(一)git config 配置用户名和邮箱
(二)新建版本库(仓库)
三、git的工作区域和文件状态
四、添加和提交文件
五、git reset 回退版本
六、git diff 查看差异
七、使用git rm 删除文件
八、.gitignore 忽略文件
一、什么是git
Git是一个免费开源的分布式版本控制系统,它使用一个特殊的叫做仓库(repository)的数据库来记录文件的变化。
仓库中的每个文件都有一个完整的版本历史记录,可以看到谁在什么时间修改了哪些文件的哪些内容,在需要的时候也可以将文件恢复到之前的某一个版本。
如果没有版本控制系统,那么我们就只能通过最原始的方式来管理文件,比如将文件按照多个日期备份出多个副本,或者将整个项目的每个版本都保存在不同的文件夹中,而当很多项目成员同时在修改用一个项目的时候,就需要手工来合并两个人的修改内容,这样不但低效,管理起来也很麻烦,版本控制系统就是为了解决这些问题而诞生的。
有了版本控制系统,我们就可以跟踪每个文件的变化,让项目成员之间的协作更加高效,目前世界上最流行的版本控制系统有两种,一种是集中式版本控制系统,比如SVN CVS 等等,另一种就是分布式版本控制系统,比如 Git Mercurial等等。
在集中式版本控制系统中,所有的文件都保存在中央服务器上,每个人的电脑上只保存一个副本,当你需要修改文件的时候,首先要从中央服务器上下载最新的版本,然后添加你想要修改内容,修改完成后再上传回中央服务器,集中式版本控制系统特点是使用起来比较简单,只需要从中央服务器上下载最新的版本,修改完成后再上传回中央服务器就可以了,不需要考虑其它的问题,但是缺点也很明显,就是中央服务器的单点故障问题,如果中央服务器出现故障或者网络连接出现问题,那么所有人都无法工作,只能等待中央服务器或者网络恢复正常。
在分布式版本控制系统中,每个人的电脑上都有一个完整的版本库,所有我们可以在本地进行修改,不需要考虑网络的问题,这样即使中央服务器出现故障,我们也可以继续工作,当需要将我们的修改内容分享给其他人的时候,只需要将仓库相互同步一下就可以了
二、git的使用方式
git的使用方式主要有三种,分别是 命令行,图形化界面和IDE插件,
命令行是最基本最常用的方式,就是在终端中输入Git命令的方式来使用Git;
图形化界面也叫GUI,就是通过一些专用的图形化工具软件来使用Git;
IDE插件就是在常用的IDEA或者VSCode这些IDE工具中,通过插件或者扩展的方式来使用git
三、命令行的使用
Git的所有命令都以git开头,后面跟着具体的命令,比如 git init 就是初始化一个仓库
(一)git config 配置用户名和邮箱
在使用git之前,第一步就是先使用 git config 命令配置一下用户名和邮箱,这样在提交的时候,才能够识别出来是谁提交的内容
git config --global user.name "caishucong"
省略(Local):本地配置,只对本地仓库有效
--global:全局配置,所有仓库生效
--sysytem:系统配置,对所有用户生效
git config --global user.email 234432523@qq.com//中间没空格就可以省略双引号
我们也可以使用下面这个命令来保存用户名和密码
git config --global credentail.helper store
我们也可以查看我们刚刚配置的用户名和邮箱
git config --global --list
配置完之后就可以使用git来管理我们的代码了
(二)新建版本库(仓库)
版本库可以对本地的代码进行管理,版本库又叫仓库(Repository),简称Repo
仓库可以理解成一个目录,这个目录里面所有的文件都可以被git管理起来,每个文件的修改,增加,删除,git都能跟踪到,以便任何时候都可以追踪历史或者还原到之前的某一个版本
创建一个仓库很简单,只需要把一个目录变成 git 可以管理的仓库就可以了
有两种方式创建仓库,第一种是自己电脑本地直接创建一个仓库 (git init) ,另一种就是从远程服务器克隆一个已经存在的仓库(git clone)
来个示例吧
mkdir learn-git //创建一个目录
cd learn-git
git init //创建仓库
git init 后面还可以指定目录的名称,如果指定了,就会在当前目录下面创建一个新的目录作为git仓库
git init my-xiaodan
这里my-xiaodan就是我们刚刚创建的仓库
刚刚还提到了另一种方式也可以创建一个Git仓库,就是使用 git clone 命令来从 GitHub 或者Gitee这种远程服务器上克隆一个已经存在的仓库,直接来看一个示例
git clone github.com//默认后面是网址,按回车即可
三、git的工作区域和文件状态
Git 的本地数据管理分为三个区域,分别是工作区(Working Directory)暂存区(Staging Area/Index)和本地仓库(Local Repsitory)
- 工作区(Working Directory):也叫工作目录或者本地工作目录,就是我们自己电脑上的目录,在资源管理器里面能够看到的文件夹就是工作区
- 暂存区(Staging Area/Index):也叫索引,是一种临时存储区域,用于保存即将提交到Git仓库的修改内容
- 本地仓库(Local Repsitory):就是我们上面通过git init 命令创建的那个仓库,它包含了完整的项目历史和元数据,是Git 存储代码和版本信息的主要位置
简单来说,工作区就是我们实际操作的目录,暂存区就是一个中间区域,用于临时存放即将提交的修改内容,本地仓库就是Git 存储代码和版本信息的主要位置。
但你修改完工作区的文件之后,需要将它们添加到暂存区,然后再将暂存区的修改提交到本地仓库中,这个过程中我们可以使用Git提供的命令来查看,比较或者撤销修改内容,来保证版本控制的准确性和完整性
相应的 Git中的文件也存在几种状态,分别是未跟踪(Untrack),未修改(Unmodified),已修改(Modified),已暂存(Staged)
- 未跟踪就是我们新创建的,还没有被Git管理起来的文件
- 未修改就是我们已经被Git管理起来,但是文件的内容没有变化,还没有被修改过
- 已修改就是我们已经修改的文件,但是还没有添加到暂存区里面
- 已暂存就是我们已经修改完之后,并且已经添加到暂存区域内的文件
四、添加和提交文件
怎样将文件添加到仓库里面,涉及下面四个命令
git init 创建仓库
git status 查看仓库的状态
git add 添加到暂存区
git commit 提交
- git status :这个命令的作用就是可以用来查看当前仓库的状态,比如可以查单当前仓库处在哪个分支,有哪些文件以及这些文件当前处于什么一个状态。
- git add:这个命令的作用就是将文件添加到暂存区,等待后续的提交操作
- git commit:commit就是提交的意思,我们的文件只有被提交到仓库中,才算真正的被保管起来,这个命令只会提交暂存区的文件,而不会提交工作区的其他文件
git add 添加到暂存区
可以使用通配符,例如:git add *.txt //添加所有txt类型的文件
也可以使用目录,例如:git add. //添加当前目录的所有文件
git commit 这个命令在提交的时候需要使用 -m 参数来指定提交的信息,这个信息会被记录到仓库中,如果不指定 -m 这个参数,那么git commit 命令会进入一个交互式的界面,默认使用vim来编辑提交信息
(ps:其实就是提交的备注)
所有文件提交完后,可以使用 git log 来查看提交记录
也可以使用 git log -- oneline 来查看简洁的提交记录,就只显示每次提交的ID和提交信息
五、git reset 回退版本
在日常开发的时候,我们经常会需要撤销之前的一些修改内容,或者回退到之前的版本,这个时候git reset 就派上用场了
reset 命令有三种用法,也就是后面可以加上三种不同类型的参数,分别是soft,hard,mixed。
- soft 参数表示回退到某一个版本,并且保留工作区和暂存区的所有修改内容
- hard 参数表示回退到某一个版本,并且丢弃工作区和暂存区的所有修改内容
- mixed 参数就是介于soft和hard两个参数之间,回退到某一个版本,并且只保留工作区修改的内容,mixed也是reset命令的默认参数
示例一下
ls //查看工作区git ls-files //查看暂存区git reset --soft b270efb //加入版本号即可回退还可以使用git reflog 来查看操作的历史记录
六、git diff 查看差异
它可以用来查看文件在工作区,暂存区以及版本库之间的差异,它还可以查看文件在两个特定版本之间的差异,或者文件在两个分支之间的差异
git diff 后面什么都不加的话,是默认比较工作区和暂存区之间的差异内容,它会显示发生更改的文件以及更改的详细信息
git diff 后面加HEAD的话,就会比较工作区和版本库(仓库)的内容
git diff HEAD
还可以后面加 cached 比较暂存区和版本库(仓库)内容
git diff --cached
还可以比较两个提交版本的差异,用法就是在后面加上两个提交版本的ID就可以了
git diff 5af90b8 b270efb
如果每次都查看版本号比较麻烦,所以我们还可以比较当前版本和现在的版本
git diff HEAD~ HEAD或者git diff HEAD^ HEAD//HEAD~ 和 HEAD^ 都代表是上一个版本
//HEAD 代表是最新提交版本以此类推HEAD~2 就代表是之前提交的前两个版本或者我们只查看某一个文件,比如file3git diff HEAD^ HEAD file3.txt
七、使用git rm 删除文件
删除文件有两种常用的方式,第一种就是直接删除文件提交
rm file1.txt
这种方式只是在本地工作区删除了文件,而暂存区的文件还没删除
第二种就是 git rm 这个命令,删除文件,在本地和暂存区都被删除了
接着记得提交文件,否则删除的文件在版本库还是存在的,
rm file;git add file 先从工作区删除文件,然后再暂存删除内容
git rm<file> 把文件从工作区和暂存区同时删除
git rm --cached<file> 把文件从暂存区删除,但保留在当前工作区
git rm -r* 递归删除某个目录下的所有子目录和文件
删除后不要忘记提交
八、.gitignore 忽略文件
这个文件的作用也就是可以让我们忽略掉一些不应该被加入到版本库中的文件,这样可以让我们的仓库体积更小,更加干净,那哪些文件是不应该被纳入版本库里面的?
- 第一个就是一些系统自动生成的文件,比如一些工具和一些软件产生的临时文件
- 第二个就是编译生成的一些中间文件 可执行文件等等,也就是一个文件是通过另一个文件自动生成的,那自动生成的文件就没有必要放到版本库里面,比如Java生成的.class文件,C语言编译生成的.o文件
- 第三个就是系统运行过程中自动生成的一些文件,比如日志文件,缓存文件或者临时文件等等,
- 最后一个就是涉及身份,密码,口令,密匙等敏感信息文件的一些配置文件
忽略日志文件和文件夹
忽略所有的 .class / .o 文件
忽略所有的 .env 文件
忽略所有的 .zip 和 tar 文件
忽略所有的 .pem 文件
在 .gitigonre可以做出这样修改
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a ,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 sudbir/TODO
(不忽略所有子目录的TODO文件)
/TODO
( 在规则的最前面加上了斜线来表示根目录)
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
(忽略doc文件夹下的所有的以txt结尾的文件,但不会忽略doc下面的子目录下面的txt文件)
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
(忽略所有doc目录下以及它下面的所有子目录下的 .pdf 结尾的文件)
doc/**/*.pdf