git入门篇
接着上一篇幅吹水,这里面的工作区其实就是当前使用的目录,比喻ljxgit文件夹,版本库就是add以及commit之后那些乱七八糟的东西;上一篇幅已经操作过了git的一些简单使用,下面就复盘下git的一些操作
- 下载与安装
- git config --global user.email/name
- git init 对一个文件夹目录进行git初始化操作,这个初始化就是为了让git对这个文件夹中的文件进行版本管理。初始化完成之后,在当前目录下会有一个.git文件夹,这个文件夹就是我们所说的版本库。现在就可以用git对其下的文件进行一个版本的控制,就是可以对它进行一个版本的回退,回到当前等等。
- 接下来你的操作就是无非在这个工作区或者仓库中创建文件,然后对文件进行一系列修改操作之类的。Git的要求是,你要让git帮你进行的版本的管理,必须先有一个文件夹,这个文件夹要被git进行初始化操作,这样才能进行一个git的版本管理。
上面说到了工作区和暂存区突然让我想到了一件事,上一篇幅中说过,如果对文件 进行修改时进行git status时会有一个提示
但是我们在日常开发中会有一些场景,例如自已修改了文件,但是这次不想提交到暂存区,这时候应该怎么玩,这时可以用到命令git checkout -- a.txt ,这时会撤销工作区中的一个修改,也就是说你不需要进行git add操作了。
但记得这个命令会把你不提交的内容全给删除了。
接下来我要写的就是这篇幅的重点:分支
关于提交,前面都说过,正常提交后线路如上图,每次提交后每有一个commitid,每次提交后会如上图进行线性连接。现在要说分支的概念,怎么讲呢,这样说吧,在c和c++中有一个指针的概念,我们在执行git reset --hard commitid之所以能回到我们对应要回滚的地方,就是因为这对应的指针位置对应了要回滚的位置,前面的返回上一版本中有个方法是HEAD^,这个命令之所以能成功也是因为正好对应上一个版本的commitid,所以由这个可以得到如果说内容已经add到暂存区,此时要想撤销的话,需要先回到最新的一个commitid上,可以用HEAD^进行回退,所以说HEAD就表示当前最新的版本的commitid,也就是最新的指针指向;这里面的HEAD头指针指的只是当前所处的版本,但是这个不是这里要说的重点,这里面还有一个Master分支是主分支,也是git为你默认创建的分支,竟然有主分支,那一定就还有其它分支概念。
由上图片可知Master分支指向的是最新的提交commitid,头指向指向的是我们的master分支。但是git的强大之处远不止如此,而是有一个多人协作开发的概念。就是通过git的分支进行的。概念说完了,下面就开始进行操作了。
首先在主分支master上切出一个开发分支,比如叫”dev_ljx” ,创建分支的命令是git checkout -b dev_ljx;由下图可以看到,已经从主分支中切到了我们自己创建的分支中来了
现在你进行的任何操作都是在分支上进行的,为了能够详细表达出区别,下面来做一件事,改变原文件加一句话
然后在当前分支上进行git status进行查看
会发现有一个文件修改过了。这时做一件事,把这文件进行提交了
然后再次查看
这里面的操作其实和上稿中讲的都一样,唯一不同的就是所区分支不同而已,这时用git log查看下日志
会发现日志中记录了所有分支的提交记录,这时我们再把分支切换到主分支,先用命令git branch查看所有分支
会查到所有分支并且可以看到我们现在所处的分支位置,下面开始切分支了,用命令git checkout master切到主分支
这时来个好玩的,这时再查看下主分支的日志
会发现主分支上没有刚刚我们在dev_ljx分支上提交的记录,除了这个外还有个神奇的地方就是打开刚刚修改的文件,会发现刚刚修改的文件内容丢失了,但是当一切回个人分支时,又会发现刚刚修改的文件显示出来了。这说明在不同的分支上进行的版本管理,只有在自己的分支上才会生效。
分支有创建就会有删除的,如果分支现在失去作用了,要删除怎么玩,在删除之前说明删除分支的要求,如果要删除分支,你必须先切换到另的分支上才能删除,删除命令是git branch -D dev_ljx,这里再补充一个细节问题,这个删除命令中的大写的D意思是强制删除,如果不想用强制命令就用小写的d进行操作,小写的会友好点,比喻你分支忘记合并了他会报提醒
再次查看分支,会发现只有一个分支了
分支创建和删除已经说完了,下面再说最后一个难一点的东西就结束这个篇幅吧,最后说下分支的重难点问题,分支的合并和冲突解决,一般正规点的管理主分支master是不会去动,只会用于版本的发布。各自的开发只会在自己的分支上进行开发管管理,各自在自己的分支上开发完成之后,需要将开发的内容合并到主分支上去。这个时候成为合并内容。
下面再来创建一个分支dev_ljx
然后和之前一样修改下内容在这个分支上进行提交
然后提交
然后查看日志
会看到提交的内容在里面了,现在准备合并分支了,在合并前要切到主分支git checkout master
切换后就开始合并了,快速合并命令是git merge dev_ljx
再次查看日志
会发现主分支上也有了个人分支上的提交内容;这样看似一切完美,但是在多人开发时还是会有一点问题,前面说过master分支作为一个版本发布的分支,不应该进行直接在上面开发;假如现在有两个团队合作开发,那么这时就要起两个分支了,那再取一个分支dev_zs
这时有两个分支了,现在分支在zs这边,这时zs修改了一个文件并提交了,我们还是修改a.txt文件
修改完成后在自己分支上提交了
这时如果ljx同时也改了同样的文件,并且也提交了会发生什么呢,接下来切到ljx分支git checkout dev_ljx
然后修改同一份文件并且提交
现在两个人把自己的分支都提交了,现在他们都准备合并到主分支,这时冲突就发生了,接下来,切到主分支合并git checkout master
先合并zs的分支git merge dev_zs
接下来再合并ljx的内容
会发现报错了,这冲突意思就是说文件冲突了,这个冲突要手动解决冲突,并且再去进行add,commit的操作。