Git使用心得
Git使用心得
Git是一款优秀的分布式的代码版本管理系统,它也是我们软件工程系学生必备的一项技能,本文根据孟宁老师公众号的Git教程,总结了以下四大场景实践,希望对自己以及其他看到这篇博客的初学者能有所帮助。
注:本文默认用户已经安装好Git
参考文献:五⼤场景玩转 Git,只要这一篇就够了!
场景一:Git 本地版本库的基本用法
在新建的项目文件夹下用git init
初始化,这样这个变成了Git可以管理的仓库(本文在桌面新建文件夹learnGit),在初始化后文件夹中会出现.git
目录,这个目录是Git用来跟踪管理版本库的,用户不要手动修改它(如果没看到该目录,可能是被系统隐藏了)。
在此文件夹下用vim hello.txt
新建一个hello.txt文件并对其编辑,之后通过git status
查看工作区状态,从status可以看出目前没有文件commit,但是有untracked file也就是hello.txt存在
用git add hello.txt
将hello.txt添加到暂存区,然后再次git status
查看状态可以看到已经正常添加到暂存区
之后通过git commit -m "本次提交说明"
命令将文件提交到本地仓库,对hello.txt再次修改,并且用git log
查看提交记录,在提交记录中,每个记录黄色字commit后面有一大串数字,这串数字是commit id
,它的意思是版本号。记录中天蓝色字HEAD
指向的是当前版本号,那么上个版本用HEAD^
表示,上上个用HEAD^^
表示,如果是往前第100个那么是HEAD~100
当我们需要回退到本次代码提交之前的状态时,我们可以使用git reset --hard HEAD^
命令回到上一个版本,此处我们回到第一次代码提交后的状态。
上图可以看到HEAD指针指向了上一次提交的记录,下图中hello.txt内容也回退到上一次编写的内容
若此时我们希望回到最新的版本,我们使用git reflog
查看最新的版本号,然后根据版本号使用git reset --hard
命令将当前工作区的代码替换为最新的版本,git reflog
命令能够记录我们每次命令操作。此处是第二次代码提交后的状态。
回退后hello.txt的内容也变为原先编写的新版本内容
场景三:团队项目的分叉与合并
使用git branch
命令可以创建一个新分支new_branch
在新分支,我们可以继续编辑hello.txt,并对其执行提交操作。git reflog
能够打印master分支以及其他分支的提交记录,如下图所示
提交后,我们在master分支上用git merge new_branch
将两个分支进行合并
我们考虑到在新分支和原有的master分支合并时可能出现冲突,我们通过如下方法模拟一个冲突。
我们在new_branch分支中对hello.txt的首部进行修改,在首部添加一个函数conflict_new_branch(),并执行提交。而后在master分支中对hello.txt进行修改,在首部添加conflict_master()函数
此时我们返回new_branch分支,如果我们此时需要将两个分支进行合并,则自动合并失败,会出现冲突
此时git会让我们自己选择要保留的内容,分割线上面是当前HEAD指针指向的分支所包含的内容,下面是master分支包含的内容
编辑过后我们进行提交等操作
同时我们也可以将内容提交到远程库上,此时远程库也会出现对应的新分支
场景四:Git Rebase
目前合并代码主要有两种方式,一种是使用git merge
,另一种是git rebase
在merge操作中,每一个新分支上的结点提交记录仍然是独立的,在最后进行merge时,会产生一个新的文件作为操作的结果,但是如果是使用rebase操作,我们在new_branch上面的操作都会作为一个patch操作使得每个操作都是master上面的直接依赖,这样我们版本的变化就是完全线性的
执行git rebase -i HEAD^^^
得到以下纪录
此时将第二次的提交记录删除,对rebase操作中的冲突文件进行修改,解决文件中的冲突问题
下图将修改后的hello.txt文件重新进行提交
再执行git rebase --continue
命令完成变基操作,再通过git log
查看提交记录,发现第二次的提交记录已经不存在了,如下图所示
心得
之前与本科同学做项目的时候用过git,但关于git很多操作细节包括时间线这些其实了解得并不深,经过这次作业后我对git基本操作有了清楚的认识,当然还有很多知识点上的缺失,在本篇博客后我还会继续总结git的有关操作。