写在前面
最近在学习git的时候,发现了一个比较有意思的网站,不仅比较系统,还有图形化界面能够清晰地看见自己的操作所带来的结果。所以就想写几篇博客来专门玩一下这个网站,网站地址如下:
一、什么是Git
简单来说,Git就是一个免费开源的分布式版本控制系统。区别于分布式,就有集中式的版本控制系统,如svn。集中式和分布式的主要区别就是集中式只有一个存储代码的地方,而分布式是每个参与开发的人都有一个存储代码的地方。我们可以在自己的代码存储位置开发自己的代码,等到自己的代码开发完成后,可以再去进行合并。
这种分布式的最大优点就是方便大家以后协同合作,好找人背锅。
-
版本控制:用于保存和管理文件、提供客户端工具进行访问以及提供不同版本文件的比对功能
-
集中式版本控制
但是该种版本控制方法会导致多人开发会重复覆盖中央服务器的文件的问题,因此仅能保留一个人的文件,这就会导致文件冲突问题。
-
分布式版本控制
而分布式版本控制与集中式版本控制不同的是,分布式版本控制会在本地搭建与中央服务器一致的仓库,用户下载和上传是在本地的仓库进行操作的。
-
多人协作开发
-
接下来,就来看一下这个有趣的Git游戏吧
二、Git通关游戏
一进入网页就是以上这个界面,简单介绍了以下这个网页的主要功能
可以看到他分了很多个关卡,接下来我们一关关来闯
三、基础篇
-
Git Commit
首先是第一关------Git Commit。我认为这个网站最大的优点是会把每一个命令的功能和为什么使用这个功能介绍给你。
可以看到,右边有一个小型代码库演示,我们有一个初始提交C0和一个提交记录C1。按照他的新手指引,我们点击git commit按钮,创建一个新的提交记录
我们可以看到新的提交成功了,并且多了一个C2节点,并且main指针指向了C2。
接下来我们在其左边提供的命令行输入两次git commit并回车,便能完成该关卡。
-
Git Branch
接下来到了第二关------Git Branch。正如其介绍的一样,Git Branch是建立一个分支,使得开发人员在自己的分支上进行开发,不会影响到主分支,并且能够清晰地分解工作。
我们建立一个新的分支newImage,可以看到,会在C1节点上创建一个新的指针newImage,与主分支main互不影响。
接下来我们尝试一下提交记录,我们发现提交记录后不是newImage分支向前进,而是main向前进,这是因为我们只是创建了分支,并没有将分支转换到newImage上,右上角的*号即表示现在所在的分支。
因此我们需要切换到新的分支上,输入命令git checkout <分支名字>,再git commit即可
接下来游戏就给了我们一个任务,创建一个bugFix的分支,并且切换。这里有两个方法:
-
先创建分支,再切换分支
git branch bugFix git checkout bugFix
-
直接创建分支和切换分支一起进行
cssgit checkout -b bugFix
这样我们就可以通过本关啦。
-
-
Git Merge
创建完分支,最后肯定需要将不同的分支合并起来,这就涉及到了git merge命令。
这里游戏给出了两个分支,一个是bugFix分支,还有一个是主分支,他们都有各自独特的提交,我们想要把bugFix分支合并到main分支里去
合并完之后就得到了一个新的C4节点,为main分支
但是这个时候,只是将bugFix分支合并到了main分支,main分支中包含了bugFix分支的提交记录,但是bugFix分支没有,所以我们再将main分支合并到bugFix中。
接下来就是这一关的主要任务,命令如下
sqlgit branch bugFix git checkout bugFix git commit git checkout main git commit git merge bugFix
顺利过关!
-
Git Rebase
还有一种合并分支的方法是git rebase,其优势正如上所说,能够创建更加线性的提交历史。
和之前的一样,一个bugFix分支和一个main分支,由于之前的merge操作,让两个分支看起来是顺序开发的,但其实是并行的。
可以看到执行了git rebase之后,bugFix分支到了main的顶端,原来bugFix分支的C3节点没有改变,而是复制了一个C3'副本。
然后切换到main分支上,再rebase到bugFix分支上,即可达到一个更加线性化的提交流程了。
接下来是这一关的需求,命令如下
cssgit checkout -b bugFix git commit git checkout main git commit git checkout bugFix git rebase main
顺利过关!
四、高级篇
-
分离HEAD
在高级篇关卡的第一关是一个前置关卡,用于熟悉如何在git提交树上移动
首先需要了解head的概念,head是一个对于我们所在分支的符号引用。可以理解为指针。
使用git checkout C1命令,就能使得head指向某个具体的提交记录,而非分支。
以上是本关的需求,命令如下
git checkout C4
顺利通关!
-
相对引用
接下来到了相对引用,由于想要通过哈希值指定提交记录很不方便,因此git引入了相对引用,这样就可以从分支或者head开始计算
我们可以通过^或~num来向上移动提交记录
如上,我们输入git main^来切换到main的parent节点
我们也可以通过head来作为相对引用的参照。可以通过git checkout HEAD^来不断地向上移动。
本关卡的需求如上,命令如下
git checkout C4 git checkout HEAD^
顺利过关!
-
相对引用2
之前的相对引用要执行多次^操作,有时候也挺麻烦的,因此还有一种可以一次向上多次移动的操作
这里执行git checkout head~4向上四步,到达C0
现在明白了如何使用相对引用,现在就要学习一下其使用场景,如移动分支。使用以上命令将main分支强制指向head的第3级parent提交
如上,我们使用-f强制将分支移动到我们指定的位置,当然,实际开发最好还是不要使用-f了
这关的需求是移动head、main和bugFix到指定位置,命令如下
cssgit branch -f main C6 git checkout HEAD~1 git branch -f bugFix HEAD~1
-
撤销变更
接下来就到了高级篇的最后一关,当我们想要撤销变更时,我们可以用两种方式来达到我们的目的,下面将详细介绍
首先是git reset,该命令可以将分支回退到前面的提交记录,直接改写提交历史,就会导致C2这个提交直接消失
但是这样子就不知道你撤销了什么,为了撤销更改并且分享给别人,我们就需要用到git revert了。这样会在C2后新增一个C2',这个和C1状态是一样的
接下来就要完成这关的需求,命令如下
perlgit reset local~1 git checkout pushed git revert pushed
顺利通关!