Git使用心得
参考https://mp.weixin.qq.com/s/Km5KuXPETvG0wCGHrvj9Vg
孟宁老师的高级软件工程课给我的启发很大,利用课后时间我也仔细学习了一些与git相关的知识。并以孟宁老师的课件为基础对一些场景进行了复现
场景1 Git本地库
首先我们新建了一个文件夹并对其执行git init命令,此时可以看到文件夹内部只有一个隐藏的.git文件夹,其后面会用来储存我们对本地库进行操作的相关信息
在此文件夹下新建一个hello.txt并对其进行编辑
此时利用git status查看工作区状态,会发现有一个文件未添加到暂存区,利用git add命令进行添加
此时可以看到我们的文件已经正常添加到暂存区。在提交到本地库之前首先要设置用户,我们此时先设置项目用户
此时的电子邮件地址并不要求准确,只是一个用以区分的工具,我们再对本地库进行提交
上面显示了我们的提交和提交日志。
为了进行版本的更改,我们对hello.txt进行多次修改
我们此时有四条提交记录,在最上方的是此时HEAD指向的版本,每个版本都对应一个hash值,我们利用hash值来进行操作
我们后退后的日志只剩下前两条,但是仍然可以用git reflog命令来对所有的提交进行查看
场景2 Git远程库
我们在github上注册账号并添加新的仓库
现在我们需要将本地库中的内容上传到远程库,首先我们对远程库新建一个别名
而后将本地库的master分支推送到远程库
根据弹出的窗口输入账号密码(会在凭据管理器中留存)
此时我们的推送就完成了,在远程库也可以查看
场景3 团队项目的分叉与合并
使用git branch命令可以创建一个新分支new_branch
在新分支,我们可以继续编辑hello.txt,并对其执行提交操作
提交后,我们可以直接将两个分支进行合并
我们考虑在新分支和原有的master分支合并时可能出现冲突,我们通过如下方法模拟一个冲突。
我们在new_branch分支中对hello.txt的首部进行修改,在首部添加一个函数conflict_new_branch(),并执行提交。而后在master分支中对hello.txt进行修改,在首部添加conflict_master()函数
此时我们返回new_branch分支,如果我们此时需要将两个分支进行合并,则自动合并失败,会出现冲突
此时git会让我们自己选择要保留的内容,分割线上面是当前HEAD指针指向的分支所包含的内容,下面是master分支包含的内容
编辑过后我们进行提交等操作
同时我们也可以将内容提交到远程库上,此时远程库也会出现对应的新分支,下图也说明了merge操作的概念图
场景4 Git Rebase
Git Rebase可以使得两个依赖于同一个祖先的分支实现纯线性变化,我们用两个图来说明
首先在merge操作中,每一个新分支上的结点提交记录仍然是独立的,在最后进行merge时,会产生一个新的文件作为操作的结果
但是如果是使用rebase操作,我们在new_branch上面的操作都会作为一个patch操作使得每个操作都是master上面的直接依赖,这样我们版本的变化就是完全线性的
首先在初始状态我们在new_branch上对hello.txt进行多次修改和提交
而后我们切换到master分支,使其向前前进一步(添加一个新函数)
此时new_branch依赖的master上的版本已经发生改变,我们切换到new_branch上使用rebase操作
这样我们在master上就具有了和new_branch分支一样的hello.txt(都具有了fun_2)
场景5 Fork与Pull Request
此场景主要针对于跨团队进行开发的情况,我首先申请一个新的github账户DingZerui2
在此账户下我们使用fork工具将另一个库fork到我们的远程库,后执行clone操作并对我们的本地库进行修改,修改好后点击提交
我们而后对原仓库拥有者提出申请
此时切换账号到原仓库,我们可以点击merge使得两个分支进行合并
小结
这次对git的尝试是我第一次使用git,孟宁老师的文章中提到的任务也基本完成。我在学习的过程中也发现git的确是很适用的版本控制工具,而我对它的理解还非常粗浅,在以后的学习中应该多多使用,加深对主要指令的理解和git机制的理解。