目录
1.分支
head指针可以指向任何的分支,不仅仅是master分支;head指向哪一个分支,哪一个分支就是当前正在工作的分支;
对于分支这个内容,我想要使用下面的方式进行介绍:
1.1查看已有分支
在正常的情况下,我们去创建一个文件,进入到对应的文件的目录下面,这文件里面通常都会有一个master分支,我们可以使用git branch指令进行查看;
这个master前面的星号表示的就是指针的意思,这个星号就是表示这个head指针指向的内容就是这个里面的master分支,这个master分支就是目前正在工作的分支;
1.2新的分支的创建
我们创建一个新的分支dev,我们想要对于这个dev分支进行操作,最后把这个dev分支和我们的master分支进行合并;
1.3改变指针的指向
我们使用这个git checkout(我们上一次介绍这个指令是因为后面加上两个横岗就可以表示对于这个文件的删除)现在我们不需要加上两个横岗,这个表示改变head指针的指向,让这个指针指向dev新的分支;
1.4合并分支
我们使用merge命令对于两个分支进行合并,这个时候master也会指向最新的提交内容;
上面的这些实际上都有自己对应的操作,但是我就不演示了,因为这个我们只需要会上传,了解三板斧,知道这个master是一个主要分支,我们的其他的分支都会被合并到我们的主分支上面;
此外,我们了解这个版本库,工作区,暂存区的概念等等,知道这个仓库的管理相关知识即可;
2.删除分支
上面我们创建这个dev分支,我们在这个分支上面做一些操作之后,这个时候使用merge进行合并,合并之后我们的dev分支上面的内容已经进行了更新,这个时候我们可以使用下面的指令删除这个分支:
git branch -d dev %这个-d选项后面的就是删除分支的名字
需要注意的是,我们想要删除某一个分支的时候,我们需要在别的分支下面去删除,就是我们不能再这个分支下面删除这个分支,只能切换到别的分支进行这个分支的删除,后面强制删除分支也是这样的
3.合并冲突
3.1一个简单操作
首先介绍一个小操作:就是我们之前都是先创建一个分支,然后切换到这个分支,我们之前都是使用两行指令,现在我们使用一个-b选项就可以使用一行指令实现这个创建并切换的问题;
3.2手动解决冲突
问题的背景就是我们原来有一个文件内容是在dev分支上面,内容是aaa,我们在这个dev上面把这个aaa修改为bbb,然后切换到master分支上面,我们修改为ccc,这个时候进行add,commit,push操作就会报错,因为这个时候git不知道我们应该是提交bbb的这个修改内容,还是ccc的这个修改内容,这个时候我们需要手动的进行这个数据的修改,确定全部使用bbb或者是全部使用ccc,然后重新进行三板斧的操作;
下面这个就是开始的时候这个相关的分支情况,这个时候dev分支的内容就是bbb;
下面的这个就是我们手动解决之后的这个情况,即这个master指向新的修改内容;
4.git分支管理策略
4.1fast-forward模式
这个模式就是我们日常使用的时候默认的一个模式,这个时候我们如果删除这个dev分支,我们没有办法判断master上面的这个最新分支是merge进来的还是正常的提交进来的;
4.2no-ff模式
这个就是当时我们在遇到上面的分支冲突的时候使用的一个模式,这个模式下面,即使我们删除了这个分支,我们还是可以看出来这个master分支是有其他的分支合并上来的;
4.3总结
我们上面的这个ff(fast forward模式简写)还是no-ff模式,实际上这个都是为了解决我们看到这个历史版本的问题;
如果我们使用的这个ff模式,我们把这个dev临时分支删除之后,这个master上面的这个最新内容就无从得知是提交的还是合并的;
但是如果我们使用这个no-ff模式,就是加上这个--no-ff选项,那么就会在merge的时候生成一个新的commit,即使我们删除这个临时分支,也可以看到这个历史的分支记录;
git merge --no-ff -m "merge with no-ff" dev2
5.bug修复建议
我们进行开发的时候,往往是多个人进行协同合作,这个时候如果遇到了问题,我们就需要展示把自己的dev分支这个程序放到stash里面去;
然后我们就切换到这个新的分支上面进行这个bug的修复,修复完成之后,这个再回到我们的dev上面继续我们的开发;
我们的修复完成,dev分支也完成了,这个时候我们不能直接进行合并,因为这个时候可能会合并冲突,我们的方法就是先在这个dev分支上面进行合并,如果出现问题就在我们的本地进行解决,然后再提交;
如果我们直接在这个master分支上面合并dev分支,这个时候如果出现合并冲突就会出现更大的bug,这个时候我们建议先在我们的本地上面合并,解决之后再提交;
6.强制删除
就是我们一般在一个分支上面进行操作,不想要这个分支的话是可以直接删除的,但是如果我们在这个分支进行了commit之后,我们的系统就会认为这个分支对于我们有用,不会让我们轻易的删除的,我们这个时候如果就是想删除;
我们之前使用的-d删除指令,改为-D指令就可以强制删除这个分支了;
7.分布式版本控制系统
7.1远端仓库概念
我们之前一直说这个远端仓库,到底什么是真正的远端仓库,今天这个远端仓库就会浮出水面,实际上这个远端仓库就是一个中央服务器,方便我们进行协作;
分布式就是我们的这个电脑是分布式,我们可以在自己的电脑上面进行开发,这个时候我们可以把我们进行的这个操作推送到远程仓库,别人想要看的话直接拉取这个仓库就可以了;
这样的话,无论我们的本地怎么出现问题,只要这个中央服务器没事,这个过程就不会受到影响;而上面的这个操作,都是在码云上面完成的;
7.2clone的过程
git clone +https/ssh就是把我们的远程仓库克隆到本地的命令,这个https协议是可以直接使用的,具体的位置在我们的这个位置:
https协议
使用https进行克隆的话,相对比较简单,也是我们经常使用的,这个ssh稍有复杂,但是也可以实现相同的功能;
ssh协议
我们这个ssh不能直接使用是因为这个需要有对应的密钥进行连接我们的git,这个需要我们自己完成
如果我们直接像这个https一样提交上去的话,这个就会报错,说我们的这个访问权限不具备;这个是因为我们的公匙没有添加到远端库里面,因此这个服务器拒绝我们的clone的请求;
这个时候我们按照这个步骤创建ssh key:
这个ls -a .ssh.就是去查看这个ssh目录下面有没上面的两个文件,我们把这个里面的公匙的内容进行复制,粘贴到我们的gitee对应的为止:
7.3push的过程
进行这个push是因为我们的本地仓库有的内容,远端仓库没有,因此这个时候我们需要进行push,把这个中央服务器仓库进行更新;
push就是把我们写的内容推送到我们的远程仓库里面去,使用下面的指令:
origin就是我们的远程仓库,master到masetr,第一个master指的是我们的本地仓库的master,第二个才是我们的远端仓库的master分支,这两个名字一样,可以只写一个;
git push origin master:master
clone的时候,这个master进行联系,因为这个push实际上就是这个分支与分支的关联,建立联系之后这个push才会正常,但是我们clone克隆的时候,两个master已经建立了联系,可以正常的push操作;
7.4pull的过程
这个pull是因为我们的远端仓库里面的内容我们本地没有,这个一般就是进行协同开发的时候,其他人推送的内容使得这个语远端仓库里面的内容我们本地没有,这个时候我们就可以使用这个pull进行拉取的操作,让我们可以看到这个远程仓库的更新内容;
git pull origin master:master
实际上这个pull进行的就是拉取+合并的操作,
7.5.ignore文件
我们push的时候,并不是想要把所有的文件全部推送过去,这个时候,我们的,ignore就是进行这个文件的筛选的,过滤掉我们不想推送的文件;
*.so表示的就是so后缀的文件就会被过滤掉,!c.so表示即使这个文件是so的后缀,这个文件有特权不被过滤掉,这个ignore是我们可以进行修改的,根据我们的个人需求;
git add -f 强制添加这个文件,即使这个文件是我们的ignore里面会被过滤的文件,这个和上面的作用是一样的,就是给了这个对应文件“特别通行证”;
如果我们的这个.ignore的内容很多,我们也不清楚我们的这个文件会不会被过滤以及相关的原因,我们可以使用下面的指令查看我们的文件为什么会被过滤掉:
7.6配置命令别名
就是我们的这个指令名字比较长,我们使用这个alias.进行简化,这个alias.后面的内容就是我们的简称,后面的这个东西就是想要被我们简化的东西,一般初学者不建议直接使用;