一、git简介
1、基本概念:
git是一个开源的分布式版本控制系统。相对CVS和SVN是集中式的版本控制系统。集中式版本控制系统的版本库是集中放在中央
服务器的,每次工作的时候都得从中央服务器获取最新的版本,完了以后再放回中央服务器。而分布式版本控制系统没有中央服器,
每个人电脑上都有一个完整的版本库,可以自己操作不受任何人影响。
2、版本库(Repository)
版本库(Repository)是版本控制系统用来存放所有历史数据的地方,主要存放各个文件的当前状态,历史修改时间,谁做的修改
以及修改的原因。举个简单的例子,就好比银行的保险箱,每次往里存钱,都会记录谁,什么时间,存放多少钱,存入的原因等。对应
的版本库(Repository)主要存放代码(文档,数据,图标等),并且每一次更新都要记录谁,什么时间,提交了什么更新,以及更新
的原因是什么。
git就相当于管理我们这个版本库的管家,即银行保险箱的管理人员。
二、git安装
在Linux下的CentOS下用安装git
命令:yum -y install git
查看git是否安装成功
命令:git --version
三、git基本操作
1、创建版本库
mkdir test_git//新建目录test_git
cd test_git//进入目录
git init//初始化git,现在git会管理这个目录中的所有内容
2、增加文件
touch test_git.c//创建一个新文件
git add test_git.c//告诉git我要添加一个文件,但是git并没有把你所添加的文件放入版本库中,而是对内容进行hash后
成了一个编号
3、将文件提交
git commit -m "add test_git"//要想将文件真正放入版本库需要commit,-m参数是提交留言,说明为什么要提交的更新做了什么事情,方便别人查看
如图所示,History就是版本库,working directory是当前的工作目录,而stage是暂存区也称索引区存放工作目录中那些你打算提交到版本库的变更,git add只是将文件的索引提交的版本库,而真正的内容并没有进入版本库。只有在git commit之后内容才添加到版本库中。
上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。
git add files
把当前文件放入暂存区域。git commit
给暂存区域生成快照并提交。git reset -- files
用来撤销最后一次git add files
,你也可以用git reset
撤销所有暂存区域文件。git checkout -- files
把文件从暂存区域复制到工作目录,用来丢弃本地修改。
git status
显示:changes to be commited //表示将要提交但是尚未提交的修改(已经add但是尚未commit),也就是在stage区域已经有了,但是还没有commit的内容
changed but not updated // 表示已经修改但是还没有添加到暂存区的内容(尚未add,当然尚未commit)
四、分支管理
1、概念:在做项目的时候,一次性不能写完项目,需要每次更新代码,但是又不想影响之前的代码。这时候,你可以创建一个分支,然后在这个分支里写东西,当觉得不好的时候,你可以把这个分支删除掉,对你之前的主分支没有任何影响。或者你觉得这个新特性超出了自己的预想,可以合并到主分支里,这时候你只要把工作转回主分支,然后合并分支,最后删除分支,然后就跟那个分支没创建一样。
2、创建新分支:
git branch test //创建名为test的分支
3、切换分支:
git checkout test //切换到test分支工作, 与上面的命令经常一起使用
4、查看分支:
git branch //查看前版本库(本地)的所有分支
5、合并分支:
git checkout master //切换到“要合并到”的分支,常见的就是test分支合并到master分支,所以先切换到master分支
git merge test //合并test分支到master分支
注意:在合并分支的时候有时候会出现冲突(conflict)的情况,创建的情况是master分支和test分支对同一文件的同一处
代码的内容不一样(例如:master分支在hello.cpp中第三行写入的是"hello", 而test分支在hello.cpp的第三行中写入的是
“world”),这样使得git不知道如何是好,这时候就需要你手工修改代码了,我难道要记住master和test在同一位置的内容?当然
不用了,git会在git merge的反馈信息中说明,代码在何部分存在冲突。
6、删除分支:
git branch -d test //删除test分支
7、撤销改动:
添加了不该添加的文件,你可以这样挽回:
git add . //把所有的文件都添加进去
git reset HEAD readme //把readme文件从暂存区域去除
发现你编辑错了一个文件,你想把它恢复到上一个版本的状态
git checkout -- filename1 //只撤消这一个文件
如上图所示,每次提交时,git都会把它们串成一条时间线,这条时间线就是一个分支。在git里,master分支是主分支。HEAD指向
master,而master指向提交,所以HEAD指向当前分支。图中的maint是另外一个分支。绿色的5位字符表示提交的ID,分别指向父节
点。分支用橘色显示,分别指向特定的提交。当前分支由附在其上的HEAD标识。 这张图片里显示最后5次提交,ed489是最新提交。
master分支指向此次提交,另一个maint分支指向祖父提交节点。
五、与远程版本库协作
github就是提交远程版本库服务的网站,所以我们这里的远程版本库为方便起见用github代替,上面我们得操作都是和本地
的git交互,相当于是和本地的git小助手交互,如何将这些在本地的代码和github上的版本库连接起来:将本地的代码推送到github上
1、克隆github上的版本库到本地:git clone
2、版本库同步:git fetch //取来(fetch)远程版本库到本地,但是并不与本地分支合并
3、拖入(pull)远程版本库:git pull //与本地分支合并,相当于 git fetch + git
4、推送到github上:git push