Git简介
概述
Git是目前世界上最先进的分布式文件版本控制系统(没有之一)。对于我们java程序员而言,管理的就是代码文件版本
集中式和分布式
集中式版本控制(SVN)
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就郁闷了。如果中心服务器出现问题,所有人都不能正常干活,恢复也很麻烦,因为SVN记录的是每次改动的差异,不是完整文件
分布式版本控制
Git是分布式版本控制系统,那么它可以没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了
Git的基本使用
创建版本库
可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”
.git这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。如果你没有看到.git目录,那是因为这个目录默认是隐藏的,可以将扩展名勾选!
此处的czjk目录就是我们的:工作区,存放所有当前文档。此目录下的文件才会被Git管理
czjk中的.git目录就是我们的:本地仓库,管理并保存所有的文档变化及历史状态
添加文件并提交
- 添加文件
- 接下来,我们使用 git add 命令,将文件添加到本次仓库的 : 暂存区
- 使用 git commit 命令,将暂存区文件提交到本地仓库
注意:第一次提交需要设置邮箱,邮箱和密码 可以自定义 符合格式即可
git commit命令可以将暂存区的文件提交到版本库。
-m参数,是本次提交的说明信息,用来注释本次提交做了些说明事情
工作区、暂存区、版本库
工作区
工作区就是你在电脑里能看到的目录。比如我们刚刚创建的dk目录,其中包含了一个隐藏目录 .git ,其它就是我们需要被管理的文件
暂存区和版本库
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改
使用暂存区的作用:
-
Git中的Commit操作它是一个原子性操作,不可以选择提交哪些文件的!
也就是它会把暂存区的文件全部提交,而且要么全部成功,要么全部失败; -
那么你什么时候去选择要提交哪些文件呢?
Commit操作是将暂存区的内容全部提交,所以我们要回到暂存区中思考;
从工作区到暂存区,使用Git Add 文件名,我们可以选择性地向暂存区添加内容,然后将其分批提交, -
暂存区的意义是它将你准备提交的内容分批整体处理;
管理文件修改
被版本库管理的文件不可避免的要发生修改,此时只需要直接对文件修改即可。修改完毕后需要将文件的修改提交到版本库
差异比较
用git diff readme.txt命令可以查看工作区与暂存区的区别:
git diff readme.txt 工作区与暂存区比较
git diff HEAD readme.txt 工作区与本地库比较
git diff --cached readme.txt 暂存区和本地库比较
查看状态,提交修改
我们如果不确定自己的哪些文件被修改了,可以使用git status 命令,查看当前工作区的状态
可以清楚的看到:changes not staged for commit(修改没有被缓存,需要使用git add来进行添加操作)
我们使用git add 命令,添加到暂存区,然后再次查看状态:
这次提示: changes to be commited (修改需要被提交),我们使用git commit 进行提交后,再次查看状态:
提示说:工作区很干净,没有任何需要提交,搞定!
版本回退
现在,我们再次修改readme.txt,添加一行内容,同样使用vi
然后提交到版本库:
日志查看
我们通过 git log 命令,可以查看历史的每次提交信息:
可以发现,目前为止,我们已经在本地仓库中提交了3次,也就是说有3个不同版本。其中,最近的这个版本有一个标示:HEAD ,这就是标记当前分支的当前版本所在位置
在log中,每一个版本的前面,都有一长串随即数字:bdf6d88de6bd92d1dcc415ca862c9b2907a0160d ,这是每次提交的commit id ,这是通过SHA1算法得到的值,Git通过这个唯一的id来区分每次提交
版本回退
现在,假设我们要回到上一级版本,该如何操作呢?
首先,Git通过HEAD来判断当前所在的版本位置。那么上一个版本,就用HEAD**标示,上上一个版本就是**HEAD**,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100**。
如果要从 “第三次提交” 回退到 “第二次提交” ,
我们可以使用
git reset --hard HEAD^ 命令 或者 **直接使用 **
git reset --hard 版本号 退回到指定的版本
查看所有关联日志
我们可以通过git reflog命令,看到以前的每次执行动作:
我们可以通过指定commit id 的方式,来指定HEAD的位置:
指令:git reset --hard {commit id}
查看日志:
查看文件:
撤销修改
撤销工作区修改
现在我们使用vi在readme.txt中添加一行数据:
在你提交前,你突然发现这个修改是有问题的,你打算恢复到原来的样子。怎么办?
查看状态:
Git提示我们,现在文件已经修改,等待被staged(暂存)。我们有两个选择:
1) 可以使用git add 来添加到暂存区,接着去提交文件
2) 可以使git checkout – 来撤销修改
所以,这里我们选择第二种方案后,再次查看状态:
撤销staged修改
刚才的案例中,我们修改了数据,并没有add带暂存区,处理起来还算简单。如果我们已经吧数据add 到了暂存区,又该如何处理呢?
并且添加到staged(暂存区),然后查看状态
有一个修改等待被提交,并且有一行提示:可以使用 git reset HEAD 来撤销缓存修改。
我们前面说过,git reset 命令可以进行版本回退,此处reset 指定的是HEAD ,而不是其他版本,因此就有撤销缓存修改的作用
撤销修改分两种情况:
1) 撤销工作区修改,使用git checkout – 未add之前,将工作区文件恢复到上个版本
2) 撤销暂存区修改,分两步:
a) 使用**git reset HEAD **来撤销暂存区修改。
b) 使用git checkout **-- **来撤销工作区修改
Git常用命令
常用命令由此得出:
本地仓库常用命令:
- 将代码提交到本地仓库 先git add 再 git commit -m “提示信息”
- 如果后悔了 可以回退版本 git reset --hard + 版本号 版本号查看 : git log 或者 git reflog
- git init 本地仓库初始化
- git add 添加到暂存区
- git commit 添加到版本库 = 本地仓库
- git reset --hard xxxid 回退到指定版本库 更新暂存区和工作区
- git remote add origin xxxxurl地址 连接远程仓库地址
- git push -u origin master 推送当前本地仓库到远程仓库master分值
- git clone xxxxurl地址 远程仓库克隆到本地
远程仓库
到目前为止,我们已经学会了如何在本机利用git进行文件版本管理,但是如果要想进行多人协作,我们就必须使用远程仓库。将本地仓库的数据同步到远程仓库,实现多人协作开发。
目前比较热门的代码托管社区:GitHub,网址:https://github.com ,提供了免费的远程git仓库功能。不过网速不是特别流畅。 在国内,有很多的公司使用oschina提供的git服务:码云, https://gitee.com ,当然,我们也可以自己来搭建远程仓库
远程仓库命令
注意:
1) 如果要使用SSH协议与远程仓库同步,就必须先在本地生成公钥和私钥,然后将公钥添加到远程的SSH列表
2) 如果已经有本地仓库,并且想要与远程仓库关联,一般需要两步:
a) 通过git remote add origin + 远程仓库地址 进行关联
b) 通过git push -u origin master 推送本地仓库修改到远程仓库
3)如果没有本地仓库,先创建远程仓库,然后通过git clone + 远程仓库地址 进行克隆并创建本地仓库
4)通过git pull 拉取远程仓库的最新内容到本地仓库
5) 注意 如果远程仓库存在,必须先clone, 才可以进行仓库更新操作,不可以直接pull
5) 免密码:git config credential.helper store
分支管理
假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险.
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。
但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。
分支的创建和合并
创建分支
我们可以使用 git checkout -b 分支名 来创建并切换到新的分支:
你会注意到我们已经切换到了dev分支。 git checkout 加上 -b 参数,就等同于创建分支,并切换分支。相当于以下两条命令:
git branch dev # 创建分支
git checkout dev # 切换到具体分支
使用git branch 查看所有分支,当前分支前面会有一个*表示:
合并分支
我们使用git checkout master切换回master分支,查看内容:
删除分支
合并完成后,就可以放心地删除dev分支了,可以使用git branch -d dev 命令删除dev分支,dev就是具体的分支名
命令小结
1) 使用git branch 分支名 创建分支
2) 使用git checkout 分支名 来切换分支
3) 也可以使用 git checkout -b 分支名 来完成 创建并切换分支的操作
4) 使用git merge 分支名 来合并分支到当前分支
5) 使用git branch -d 分支名 来删除指定分支,注意:要删除一个未合并的分支。需要使用**-d**参数进行强制删除
Idea客户端提交和拉去代码
将项目创建为本地仓库
VCS --> Import into Version Control --> Create Git Repository
项目Git版本已经创建成功。
忽略文件
安装ignore插件,在file->settings->plugin搜索.ignore,点击Install,安装完成后就可以愉快的使用了,记得重启IDEA
提交代码(重点)
添加到暂存区
项目右键选择Git --> add
此时项目文件全部变成绿色,此时文件只是处于暂存区,并没有真正进入到版本库中。
提交到本地仓库
项目右键Git–> Commit Directory
在弹窗中输入Commit Message,点击commit,此时项目文件从暂存区真正进入版本库中,项目文件变成黑色。
提交到远程仓库
新建一个远程仓库
重要说明: idea开发,要求规范:工程名称一般就是远程仓库的名称!
第二点要注意: 不要将工程推送到一个已经存在项目的远程仓库! 会报错!
一个项目对应一个远程仓库
在远程仓库创建新项目: 为了后期clone时,仓库名称就是项目名称 我们约定: 仓库名==项目名称
推送到远程仓库
右键选择项目—> Git ->Repository -> Push ,然后填写远程仓库地址。
拉取数据
在远程仓库随意修改代码:
在项目中,拉取代码:Git->Repository->pull,选中origin/master点击pull,则代码同步成功。
克隆远程仓库并导入idea
打开Idea,点击 Check out form Version Control,选中Git, 填入远程仓库SSH地址,输入你的远程仓库地址,点击Test,测试一下地址是否正确。点击Clone就OK了。