关于几个git命令的理解
前言
最近对Git情有独钟,使用github写自己的博客的确很酷。虽然蒋鑫老师的《Git权威指南》对git做了很全很细的教科书式的详解。但是,真正理解并且熟练运用教科书上的知识总是需要一个实践过程的。
在研究和使用git的过程中1,笔者受到Git Community Book图文并茂的启发,基于自己对一些常用命令的理解,做了几张图便于入门。
Git命令图解
实际上,这是在做周会的演示文稿时突发奇想的。要找到一个方法让没有听说过Git的人短时间内领略Git的魅力,这个方法非图示莫属。毕竟,我在浏览完教科书后2,都没有真正记住它们是如何作用的。
前段时间恰好在外刊IT3上看见一张有趣的漫画,于是笔者想起了那只有趣的猫,在这里将一个项目简化为画一只猫。
假设在服务器上的软件版本已经完成了头部和身体,需要在本地继续完成剩余的部分(功能)。
merge
通常我们会在不同的分支上完成不同的功能,不同分支之间是互不干扰的。分支的作用之一就是时刻让主分支保持在功能完善可运行的状态。
合并(merge)操作,目的是将一个分支合并到目标分支上,合并不同分支上完成的不同功能。
假设在本地完成了“尾巴”,并且正在完成“后肢”。
在完成“后肢”时,突然有了一个灵感,或者可能是因为“前肢”与“后肢”的开发过程相似,希望同时开发“前肢”,那么可以新建一个分支用于完成“前肢”功能。
完成了“前肢”和“后肢”功能后,就可以使用Merge将Branch分支合并到主分支中,完成功能上的合并,一只猫:)
rebase
rebase被称为衍合,或者变基更便于理解,通常变基的过程就是将某一次提交的基(Parent)变更为另外一个,这会将变更前的基到变更后的基之间的所有提交合并为一次提交。笔者的理解是,通常情况下用于简化提交的日志,便于项目的管理。复杂的细小提交可以仅保留在本地即可。
假设,目前的目标是完成“前肢”的功能。
在实现的过程中,一定会经历很多次提交,以记录修改和实现过程,这对开发过程是有利的。
但是这些细小的提交日志,对团队来说,大大小小的日志容易混淆视听,不便于管理,仅仅留下最重要的功能实现日志即可。
那么,通过衍合(rebase)将最后一次实现“前肢”的提交衍合到“身体”这次提交上。
cherry-pick
cherry-pick翻译为拣选,在一个分支A中经过几次提交的改进,在功能上并没有达到满意的效果,这时可能会重新建立一个分支B重新实现。
假如在原有分支A上有几个提交是可以重新利用的,或者,可能正在实现的某一个功能和之前完成的功能十分相似,一些提交仍然可以重复利用。拣选(cherry-pick)操作将帮助你完成对某一次提交的复制,避免重复性的劳动。
假设在主分支上完成了“尾巴”和“后肢”,下一个目标是完成“前肢”。
新建一个分支,由于“后肢”和“前肢”的实现一定是很相似的,我们可以使用拣选复制一个“后肢”功能的实现(提交)。
然后经过一些修改,就完成了“前肢”。
revert
git中有一个立即见效的后悔药——revert,它的作用是基于某一次提交,在当前分支上进行一次反向的提交。比如说,提交A在文件f的某一行添加了一句“Hello World”,那么revert将撤销这一次添加的操作,即删除文件f中添加的那一句“Hello World”。
后记
实际上还有许多常用的命令,例如reset、checkout等等,在此不再一一列举。git,拥有本地提交的特性,配合上这些强大的功能,已经成为我等码农居家旅行必备之良器。