前言
扯淡
新入公司,发现公司用的是Git进行代码管理,以前所呆的公司都是用的SVN,对于Git也不是完全不了解,之前多多少少了解过,但是毕竟没有用做实际开发中,所以理解的也不深入,命令也没有去学,只弄了一下eclipse中git的team管理操作,也没有自己总结过,如今再次捡起来,所以重新总结一下,方便自己以后忘记了再来回顾吧。
言归正传
- Git是是目前世界上最先进的分布式版本控制系统
首先是Git这个东西,不管你是百度还是google,基本所有人都会说Git比SVN强大,比SVN好用,原因在哪里了,Git是分布式版本控制系统,SVN是集中式版本控制系统,最能体现出区别的是,假如你公司SVN服务器挂掉了,那么你就可以放假了。
SVN与Git的优缺点
- SVN
- 优点
- SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器
- 缺点
- 必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了
- 优点
- Git
- 优点
- 适合分布式开发,强调个体。
- 公共服务器压力和数据量都不会太大。
- 速度快、灵活。
- 任意两个开发者之间可以很容易的解决冲突。
- 离线工作。
- 缺点
- 资料少(起码中文资料很少)。
- 学习周期相对而言比较长。
- 不符合常规思维。
- 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
- 优点
下载+安装+配置
下载
- 官网及下载地址: http://msysgit.github.io/
安装
前面几步就省略了,重点是几个选项界面:一般情况下,这个两个界面都选第一个。
在“Configuring the line ending conversions”选项中,
第一个选项:如果是跨平台项目,在windows系统安装,选择;
第二个选项:如果是跨平台项目,在Unix系统安装,选择;
第三个选项:非跨平台项目,选择。
配置
安装完成之后,就需要为你的Git配置账户了,Git是以邮箱和用户名这个组合为一个标识的。打开Git Bash
git config --global user.name 'zhangsan' //配置全局用户名
git config --global user.email 'zhangsan@126.com' //配置全局邮箱
这里配置的是全局的用户名和邮箱,也可以为每一个项目配置一个,这里就不演示了。
在C:\Users\Administrator.gitconfig中可以看到配置的用户信息。
Git实战操作
Tip:在Git Bash中可以使用linux命令来操作windows,比如用touch创建文件,vi编辑文件等等。
1. 理解工作区+版本库+暂存区
- 工作区(Working Directory):就是你电脑本地硬盘目录
- 版本库(Repository):工作区有个隐藏目录.git,它就是Git的本地版本库
- 暂存区(stage):一般存放在”git目录”下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用“git add”把文件纳入Git管理,实际是把本地文件修改添加到暂存区;
第二步是用“git commit”提交更改,实际上就是把暂存区的所有内容提交到当前分支 。
2. 创建版本库
- 首先进入到需要建立版本的路径,也就是项目路径。这里演示地址为:D:\develop\workspace\Test
- 右键选择Git Bash,然后输入命令
git init // 初始化/创建版本库
这里可以发现,创建版本库成功,路径下面多了一个.git的文件夹,这个就是git的本地版本库,并且自动为我们创建了master分支,并且当前已经关联上了master分支。
3. 查看文件状态+提交修改
3.1 查看文件状态
git status // 查看当前路径下所有文件的状态
git status a.txt // 查看当前路径下a.txt文件的状态
- 首先创建了一个名字叫a.txt的文件。
- 使用git status查看a.txt文件的状态。
可以看到,On branch master 在master分支上,untracked(未被git跟踪的文件),请使用git add命令来添加将要提交的文件,注意到,这里的文件名字显示为红色,表示未被git管理的文件。
3.2 加入到暂存区
git add a.txt // 将a.txt加入到暂存区
- 将a.txt加入到暂存区
- 手动新建了一个b.txt
- 使用git status命令查看文件状态
由于使用的是git status命令,是查看该路径所有的文件状态,所以b.txt也是untracked file,没被git管理跟踪,所以是红色的,另外刚刚将a.txt加入到了暂存区,可以看到a.txt是绿色的,当然new file表示是新文件。
3.3 提交
git commit -m 'new file to local' a.txt // -m 'xxx' 是提交的注释,必须要,否则提交不了。
不加注释的情况,这里省略了点击之后很长的提示信息。
加注释
- 使用命令提交a.txt
- 查看a.txt文件的状态
这里可以看到,提交成功,a.txt文件的状态为
nothing to commit,working directory clean(没有什么可以提交,工作区非常干净)
3.4 修改文件提交(之前是新建文件提交过程,命令一样,只是提示不同)
我这里修改a.txt,添加一段话111111,查看状态,有新提示,因为这个文件已经处于git管理跟踪了,提示使用checkout来丢弃之前的修改操作。(之后演示),这里不讨论这个,继续添加到暂存区
这里同样是显示绿色,当然不再是显示new file ,而是modified,继续提交
4. 日志+版本号+对比不同
4.1 查看日志
git log // 查看当前路径下所有文件的版本日志信息
git log a.txt // 查看当前路径下a.txt的版本日志信息
显示作者,时间,注释
git log --pretty=oneline a.txt // 查看a.txt的日志信息,以一行一行显示
4.2 版本号信息
git reflog a.txt
4.3 版本回退、穿梭
git reset --hard HEAD^ // 回退上一个版本
git reset --hard HEAD~40 // 回退40个版本以前
git reset --hard 版本号(如上面的fbf510a) // 穿梭到fbf510a那个版本
成功回退到前一个版本!
4.4 对比文件差异/不同
git diff a.txt
注意这里是修改a.txt之后没有add到暂存区,然后使用diff对比工作区与本地版本库
5. 撤销文件修改
5.1 撤销未加入暂存区的文件修改(也就是未add的文件)
git checkout -- a.txt
5.2 撤销已加入暂存区但未提交的文件修改(也就是已add未commit的文件)
git reset HEAD a.txt // 先回到之前版本库a.txt的代码
git checkout -- a.txt // 再checkout a.txt
5.3 撤销已加入暂存区已提交的文件修改(也就是已add已commit的文件)
git reset –hard HEAD^ // 整体回退到之前版本
6. 删除文件
git rm -f a.txt // 删除a.txt
git commit -m 'delete a.txt' a.txt // 提交操作
使用rm删除之后,使用git status命令,可以看到a.txt文件为绿色,需要提交才能生效
7. 分支操作
7.1 创建分支
git branch 分支名字 (如dev) // 创建(dev)分支
7.2 查看分支
git branch
7.3 切换分支
git checkout 分支名字 // 切换到xx分支
可以看到最后/D/develop/….(dev)
另外值得注意的一点是,创建分支的时候,拷贝了一份master的东西到新分支中。
7.4 分支合并
git merge
情况1:(无冲突)
现在我修改新分支dev上的a.txt,添加dev update
然后回到主分支,主分支我并没有进行修改,只有新分支修改了,那么进行合并
显然是没有冲突的,master分支里的a.txt进行了更新
情况2:有冲突
现在可以看到,分别将master的分支与dev分支修改成如上所示,那么进行merge的时候,会提示如下,而且没有解决冲突之前不能进行其他操作,比如切换分支等等。
使用vi编辑器去编辑a.txt
修改,删除<<<< HEAD >>>dev 什么的之后,保存,提交之后MERGING状态消失,冲突解决。
7.5 删除分支
git branch -d dev
小结一下:只能说,总结这个东西确实有点累,主要是CSDN不支持直接粘贴复制图片,每个图片要一个个上传,确实有点蛋疼,不过弄了这么久,终于是搞好了,不过还是有很多地方不足,之后总结下关联github之类的内容,另外把常见基本命令专门开一篇出来,如果要查命令的话,看那篇就够了,这个只是入门级的。