Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。
Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper。
其版本特性及优缺点参考:https://baike.baidu.com/item/GIT/12647237?fr=aladdin
git init —— 初始化本地仓库
git config --global user.name “zhoulz” —— 设置用户名
git config --global user.email “[email protected]” —— 设置邮箱
git是3段式,中间有个暂存阶段,所以提交只是提交到本地代码库中,要提交到远程代码库,还需要推送一下。
git add Demo.txt —— 提交至缓存区(Demo.txt可加可不加双引号,下同)
git commit -m "这是我提交的第一个文件 Demo.txt" Demo.txt —— 提交至本地库
在git仓库中新创建了一个文件Demo2.txt后:
将Demo2.txt提交至本地库。
对Demo2.txt进行修改后:
git status
重新add 和 commit。
—— 可以让我们查看提交的,显示从近到远的日志
commit 后面的一串16进制数字可以理解为当前历史记录对应的索引。
当历史记录过多的时候,查看日志的会出现分屏的效果,一页展示不下:
下一页:空格
上一页:b
到尾页了,显示END
退出:q
日志展示方式:
(1)方式1:git log ---> 分页 (见上)
(2)方式2:git log --pretty=oneline
(3)方式3:git log --oneline
(4)方式4:git reflog
多了信息:HEAD@{数字}
数字的含义:指针回到当前这个历史版本需要走(回退)多少步。
—— 前进或者后退历史版本
(当对一个文件进行多次修改,并且add、commit后)
通过指令git reflog —— 获取HEAD@{数字} 信息、以及索引信息(见上图)
git reset --hard bb5970b —— 前进、后退都可以
(注:选中就是复制,右键-粘贴)
【1】hard参数:
git reset --hard [索引] —— 本地库的指针移动的同时,重置缓存区,重置工作区。
【2】mixed参数:
git reset --mixed [索引] —— 本地库的指针移动的同时,重置缓存区,但是工作区不动。
【3】soft参数
git reset --soft [索引] —— 本地库的指针移动的同时,缓存区、工作区都不动。
总结:
以后用的多的就是第一种:hard参数(重置缓存区,重置工作区)。
删除工作区中的Test2.txt文件
(结合reset操作(恢复))
rm Test2.txt
然后,紧接着:
将删除操作同步到暂存区:git add Test2.txt
将删除操作同步到本地库:git commit -m "删除Test2.txt文件" Test2.txt
git reflog —— 查看日志
此时,如果不想删除了:(执行回滚操作)
即:找回本地库中删除的文件,实际上就是将历史版本切换到刚才添加文件的那个版本即可:
git reset --hard 075dasf —— 一开始添加Test2.txt时的那个索引
删除工作区的数据: rm Test2.txt
同步到缓存区/暂存区: git add Test2.txt
如果此时就后悔了,想恢复暂存区中的数据:
(注1:此时暂存区中的数据已经被删除了,但是本地库找中的数据还没有被删除)
(注2:本地库中的数据还在,则进行充值卡即可,工作区和暂存区都会重置)
git reset --hard 075da3f (还是那个索引)—— 其实是重新回滚一次
即:和找回本地库删除的文件操作一样。
因此上面这一步还可以这么执行:(HEAD指针此时指的就是075da3f)
git reset --hard HEAD
先创建一个文件Test3.txt,并进行add、commit操作。
然后,更改工作区(即在创建的文件夹/库中)中Text3.txt的内容,增减内容:
增加后导致:
工作区和暂存区的内容不一样了。
此时,想进行比对:
git diff Test3.txt
注:Git是按照行为单位管理数据,所以:删除一行,添加一行。
总结:
git diff 文件名 —— 将工作区中的文件和暂存区中的文件进行比较。
git diff —— 比较工作区中和暂存区中的所有文件的差异。(后面不加具体的文件名)
然后,
git add Test3.txt —— 同步到暂存区(即:工作区中的文件和暂存区中的文件同步了)
但是,暂存区和本地库中的文件并没有同步,
下面将暂存区和本地库中的文件进行对比:(此时本地库对应HEAD指针(当前指针对应的版本))
git diff HEAD Test3.txt (HEAD为当前指针—— 对应本地库的版本?)
再commit就同步了:(再对比的话就不会有输出)
git commit -m "insert bbb" Test3.txt
此时,又进行了更改:改为 a,并进行了add操作(只同步到暂存区)
但是不和当前的HEAD指针进行对比了,可以和一开始提交Test3.txt的那个版本对比:(aaa)
(此时的HEAD指针则对应那个添加了bbb的版本)
git add Test3.txt
找对应的索引即可:
git diff 2ae599d Test3.txt
(git diff [历史版本-索引号] 文件名 —— 比较暂存区和工作区中的内容?)
1)什么是分支?
在版本控制过程中,使用多条线同时推进多个任务。这里面说的多条线,就是多个分支。
2)通过一张图,展示分支:
3)分支的好处
同时多个分支可以并行开发,互相不耽误,互相不影响,从而提高开发效率。
如果有一个分支功能开发失败,直接删除这个分支皆可以了,不会对其他分支产生任何影响。
新建Test4.txt,并完成了add、commit操作。
【1】查看分支(branch)
git branch -v
【2】创建分支
git branch branch01(分支名)
注: * 是用来显示你当前是在那个分支上的
【3】切换分支
git checkout branch01
注:这里,branch01分支和主分支master后面的版本号是一样的,说明两的分支的版本相同。
在branch01下,对Test4.txt中的内容进行增加,并进行add、commit操作,
然后,切换到master主分支,输入git branch -v
(注:master主分支下的Test4.txt并没有改变)
在master主分支下,修改Test4.txt的内容:
将branch01分支 合并到 主分支:
需要先进入主分支,然后执行
git merge branch01
显示有冲突。最后显示的 " (master|MERGING) " —— 代表处于合并状态
为什么会出现冲突?
怎么解决?
(人为决定)公司内部商议解决,或者自己决定,留下想要的即可。
决定好之后,留下想要的然后保存。
然后执行add、commit操作:
(注:不同的是最后的commit操作后面不需要加文件名)
解决完冲突后,最后的状态也不再是 " (master|MERGING) "。
参考:SVN和git的区别 - 碧海无波,细水长流 - 博客园
两者之间最核心的区别就是git属于分布式控制系统,SVN属于集中式控制系统。
1、如果一旦出现断电,SVN里面的数据全部消失,但是git则不会。
2、使用SVN时,必须联网,否则不能使用。但是git只要第一次将代码下载到自己的主机上,以后 就不用联网也可以查看历史记录什么的了。
应用场景:
以我们公司为例,SVN是专门用来维护文档的,而git则是用来维护代码的。
git是3段式,中间有个暂存阶段,所以提交只是提交到本地代码库中,要提交到远程代码库,还需要推送一下。
svn则是2段式,中间没有暂存借点,所以提交就是到远程代码库。
svn 和git 都是版本控制系统,都有自己图形化的管理界面
tortoisegit,tortoisesvn 是他们各自的xwindows 的外壳,tortoisegit是基于git的,安装之前必须安装git,因为他内部并没有 集成git,可能不是一个公司开发的,tortoisesvn内部集成了svn。
git的使用参考-廖雪峰笔记:Git教程 - 廖雪峰的官方网站