Git随手记
一、什么是Git
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件
二、与SVN有何区别?
1)Git是分布式的,SVN不是:
这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交;
2)GIT与SVN版本机制不一样:
Git 只关心文件数据的整体是否发生变化,而SVN这类版本控制系统则只关心文件内容的具体差异。这类系统(如SVN)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容,然而Git 并不保存这些前后变化的差异数据。实际上,Git更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。
3)GIT不需要联网:
SVN 断开网络或者断开v*n就无法commit代码,但是Git 可以先commit到本地仓库。用SVN的话,没有网络或者断开v*n时,你当然也可以继续在本地开发,但是无法commit代码,因为SVN 每次commit都必须联网,长时间不commit代码会丢失大量开发进程的历史纪录。有个比喻是:不能commit就像用word写文档不能save一样危险。而且有网络的情况下每一次commit都会花上数秒甚至更长时间。但用 Git 的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,因为是在本地仓库commit所以几乎不需要时间,而且commit一定要频繁,不然无法记录你的改动,如果你一天commit一次,中间的修改你就找不回来,然后等到了有网络的时候再将版本纪录和代码一起上传到远程仓库。
4)Git 的内容完整性要优于SVN:
因为Git 在commit(存储在本地)或者push(上传到远程仓库)之前,通过对文件的内容或目录的结构计算出一个 SHA-1哈希值,作为指纹字符串进行内容的校验,并将此结果作为数据的唯一标识和索引,在远处仓库接受到commit的文件之后,会再计算一遍哈希值然后跟传递过来的哈希值做比较,如果不一致,说明文件在传输时变得不完整,或者磁盘损坏导致文件数据损坏。另外在 Git 数据库中的东西都是用此哈希值来作索引,而不是靠文件名;
三、为什么要用Git?
1) git每台电脑都有一个版本库,可以在本地做版本管理;
2) 速度快。git的速度远超大部分版本管理系统,包括svn
3) 强大的分支管理功能
4) 活跃的开源社区,如最著名的github
四、Git安装、部署和运行
下载 Windows版 git(windows环境默认安装即可)。
下载地址:https://git-scm.com/downloads
图形化工具SourceTree:https://www.sourcetreeapp.com/
五、GIT指令模式
1、初始化
安装完git后,在任一一个文件夹(我自己的一个简单项目:D:\work\enjoy-git),右键进入git bash
在命令窗口中输入git init,即就在些目录中创建一个.git的文件夹,如下图
2、管理文件
记得提交前设置下操作者的姓名和email ,不然会报错提交不了。一般会出现下面这样的错误
主要做以下这两个配置
3、提交版本
检查版本状态 命令: git status
如图中所示,表示这些文件还没有被git加以版本控制。
提交到本地时,按照以下两个步骤实施
- git add . 或git add -A或git add filename (点代表所有新增、修改; -A 代表新增、修改、删除),加入缓存区(.或者-A表示全部,也可单独文件)
- git commit -m ‘new project’ 提交版本 ‘版本提交描述’
提交到本地时,还可以按照以下一个步骤实施
git commit -a -m "ew project" 加入缓存区并提交
如果,其中一个类发生改变了,我们可以再次使用git status命令查看,如图
4、删除本地缓存
这个操作,一般情况下不要做,除非你确定需要将代码重新加入版本控制时,可以这样实施
命令: git rm --cached 文件名
效果如图
5、忽略排除
忽略那些不需要管理的文件夹或文件(比如此项目中.idea文件就需要忽略掉)。可以使用以下命令
命令: touch .gitignore // 创建一个.gitignore文件
输入一下内容,因为.gitignore本身就需要忽略,所以此文件需要忽略
此时我们再查看一下状态,发现好像这个忽略的操作没有起到什么作用。
看到这种情况,先不要急,这主要是因为先前已经将所有的文件都加入控制中了。我们这里需要做的是,将控制取消掉,如图
可以看到,再次提交时,就会将要忽略的文件自动地的过滤掉。
补充说明:
- “.gitignore”文件的影响范围是它所在的文件夹和所有的子文件夹
- 每一个文件夹沟可以创建自己的“.gitignore”文件,如果它上层的文件夹也有“.gitignore”文件,这个文件夹也会受到它的影响。
- “.gitignore”文件中可以使用“#”字符开头表示注释,文件夹路径是用“/”字符,文件名可以使用通配符“*”,另外还可以使用“!”字符表示排除。
6、分支管理
1、创建分支
命令: git branch 分支名称
2、查看分支
命令: git branch
3、切换分支
命令 git checkout 目标分支名称
4、冲突解决
首先切换到dev分支
作如下改动
提交
然后,再切换到master分支
作如下改动
提交
合并两个分支,将dev合并到master上。切换到master分支上
如上图,合并之后,已经提示存在冲突了。
打开代码,会看到如下图
那么这时候,就需要我们开发人员自己决定保留哪一部分了。这里我手动的处理了
将改动后的代码提交