git是一个分布式版本控制工具,主要用于管理开发过程中的源代码文件(Java类、xml文件,html文件页面等),通过git仓库来对这些文件进行存储和管理
git仓库分为
本地仓库:开发人员自己电脑上的git仓库
远程仓库:远程服务器上的git仓库
git具有哪些强大的功能,为什么值得我们去掌握?
commit:提交,将本地文件和版本信息保存到本地仓库
push:推送,将本地仓库文件和版本信息上传到远程仓库
pull:拉取,将远程仓库文件和版本信息下载到本地仓库
官网下载地址:http://git-scm.com/download
安装成功后在任意目录点击鼠标右键可以看到如下菜单表示安装完成
Git GUI Here:打开Git图形界面
Git Bash Here:打开Git命令行 (最为常用,我们之后都用这种形式)
常用的git代码托管服务
这里我们将会用码云(gitee)代码托管服务来学习
使用码云的操作流程如下
1、注册码云账号
2、登录码云
3、创建远程仓库
4、邀请其他用户成为仓库成员
这个仓库就是远程仓库
下面我们将通过这个远程仓库,来练习一下常用的git命令
设置用户信息
git config --global user.name "keke" 设置全局用户名
git config --global user.email "[email protected]" 设置邮箱地址
查看配置信息
git config --list
获取git仓库的方式有两种
具体操作如下
1.在任意目录下创建一个空目录(例如repo1)作为我们本地git仓库
2.进入这个目录中,点击右键打开git bash窗口
3.执行命令git init
如果在当前目录中看到.git文件夹(为隐藏文件夹)说明git仓库创建成功
git clone 远程仓库地址
之前我们在gitee上创建过一个仓库,我们现在把那个仓库克隆到我们本地,注意不能和刚才创建的本地git仓库嵌套
版本库:前面看到的.git文件夹就是版本库,版本库中存储了许多配置信息、日志信息和文件版本信息
工作区:包含.git文件夹的目录就是工作区,也称为工作目录,主要存放开发的代码
暂存区:.git文件夹中有许多文件,其中一个index文件就是暂存区,也可以叫做stage。暂存区是一个临时保存修改文件的地方
git工作区中文件存在两种状态:
untracked未跟踪(未被纳入版本控制)
tracked已跟踪(被纳入版本控制):
注意:这些文件的状态随着我们执行git命令发送变化
在代码仓库中,未执行add命令,文件状态就是untracked未跟踪状态,即未被git所管理,当执行过add命令后,状态变成staged已暂存状态
git status //查看工作区中文件状态
git add 文件名 //将文件的修改加入暂存区
git reset 文件名 //将暂存区的文件取消暂存或者切换到指定版本
git commit -m "提示信息" 文件名 //将暂存区的文件修改提交到版本库
git log //查看日志
git reset --hard 版本号 //回到某一版本
演示如下
第一步在工作区中手动创建一个user.java文件,并用gitbash在这个目录下打开
执行git status命令 查看文件状态为untracked
执行git reset命令,将暂存区中文件取消暂存
执行git commit -m "提示信息" 文件名
注意刚才提交的user.jave应该是处于unmodified未修改状态,现在我们手动修改该文件,保存,然后查看该文件的状态
对文件修改了,但是未放进暂存区,就是这种红色的modified的提示,下面把他加入到暂存区,用git add命令。可以看到modified变绿,意味着已修改并且放入暂存区状态
提交这个已修改并且放入暂存区状态的user.java
执行git log命令,查看日志信息
可以看到我们有两次commit,后面有这个版本的唯一标识,在"提交"版本中,我们还没有编辑user.java文件,接下来我们回到这个版本
git remote //查看远程仓库
git remote add //添加远程仓库
git clone //从远程仓库克隆
git pull //从远程仓库拉去
git push //推送到远程仓库
查看远程仓库
添加远程仓库
我们之前创建的repo1仓库是我们本地初始化的一个仓库,没有关联任何一个远程仓库,我们现在用以下命令给其添加一个远程仓库
git remote add origin 远程仓库地址
第一步创建一个远程仓库
添加完远程仓库后,远程仓库有更新的内容,就可以克隆到本地仓库,同时本地仓库新增的内容也可以推送到远程仓库
克隆远程仓库
初始化repo1的readme文件,然后克隆到本地的repo2目录下
推送至远程仓库
在刚才克隆远程仓库里新增一个user.txt文件,交给git管理,然后推送到远程仓库中
练习,修改user.txt文件,push到远程仓库
第一步:修改user.txt文件
第二步:git add交给git去管理,然后commit提交到本地仓库,再git push到远程仓库
注意必须仓库成员才可以进行推送代码,还需要进行相应的权限认证
远程仓库拉取
git pull short-name branch-name
注意如果当前本地仓库步是从远程仓库克隆,而是本地创建的仓库,并且仓库中存在文件,此时再从远程仓库拉取文件的时候会报错
解决:可以在git pull命令后加入参数 --allow-unrelate-histories
分支是git使用过程中非非常重要的概念。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线
同一个仓库可以有很多分支,各个分支相互独立,互不干扰
通过git init命令创建本地仓库时默认会创建一个master分支
git branch //查看分支
git branch [name] //创建分支
git checkout [name] //切换分支
git push [shortName] [name] //推送至远程仓库分支
git merge [name] //合并分支
下面我们在码云上创建一个远程仓库,在这个仓库中演示这些命令
第一步:创建远程仓库
第二步:克隆到本地
第三步:查看分支
git branch //查看本地所有分支
git branch -r //查看远程所有分支
git branch -a //查看本地和远程所有分支
第四步:创建分支
git branch [name]
第五步:切换分支
git checkout [name]
第六步:推送本地分支到远程仓库
git push [shortName] [name]
第七步:分支合并
git merge [name]
我们希望b1和b2分支下的b1.txt和b2.txt都合并到主分支master中
首先切换至master分支
git checkout master
然后合并b1分支
git merge b1
出现这个界面,然后按esc键,然后输入:wq即可
master分支再推送到远程仓库中
git push origin master
git tag //列出已有的标签
git tag [name] 创建标签
git push [shortName] [标签名] //将标签推送至远程仓库
git checkout -b p[branch][name] //检出标签
Git中的标签,指的是某个分支某个特定时间点的状态。通过标签,可以方便的切换到标记时状态
比较有代表性的是人们使用这个功能来标记发布结点(v1.0,v1.2等)。下面是mybatis-plus的标签:
下面我们将继续用repo3仓库,来进行标签操作的演示
列出已有标签
创建标签
推送至远程仓库
查看远程仓库
这个v1.0其实就是记录了我们master分支的当前状态
我们新增一个test.txt到本地repo3,然后打一个新的标签,推送到远程仓库
检出标签
新建一个b1.0标签,用来指向repo3仓库的v1.0标签
总结:
tag是git版本库的一个标记,指向某个commit的指针。
tag主要用于发布版本的管理,一个版本发布之后,我们可以为git打上 v.1.0.1 v.1.0.2 …这样的标签。
tag感觉跟branch有点相似,但是本质上和分工上是不同的:
tag 对应某次commit, 是一个点,是不可移动的。
branch 对应一系列commit,是很多点连成的一根线,有一个HEAD 指针,是可以依靠 HEAD 指针移动的。
所以,两者的区别决定了使用方式,改动代码用 branch ,不改动只查看用 tag。
tag 和 branch 的相互配合使用,有时候起到非常方便的效果,例如:已经发布了 v1.0 v2.0 v3.0 三个版本,这个时候,我突然想不改现有代码的前提下,在 v2.0 的基础上加个新功能,作为 v4.0 发布。就可以检出 v2.0 的代码作为一个 branch ,然后作为开发分支
我们创建一个maven项目,路径如下,现在我们期望用git仓库来管理我们的项目
.gitignore这个文件的作用是告诉git我们项目中哪些文件不需要git仓库去管理
将文件加入暂存区
新建文件的时候,直接点击添加即可
将暂存区的文件提交到版本库
查看远程仓库
添加远程仓库
断开远程仓库 (指的是本地和远程仓库的关联关系断开了)
推送至远程仓库
我们新建两个文件,分别是test.txt和波风水门.txt然后推送到远程仓库中
从远程仓库拉取
由于本地代码和远程仓库完全一致,所以拉取代码没有变化
查看分支
创建分支
切换分支
将分支推送到远程仓库
合并分支
我们在b100分支中,创建一个helloworld.txt文件,然后合并至master分支
此时master分支下是没有这个文件的
点击合并