Post

关于几个git命令的理解


前言

最近对Git情有独钟,使用github写自己的博客的确很酷。虽然蒋鑫老师的《Git权威指南》对git做了很全很细的教科书式的详解。但是,真正理解并且熟练运用教科书上的知识总是需要一个实践过程的。

在研究和使用git的过程中1,笔者受到Git Community Book图文并茂的启发,基于自己对一些常用命令的理解,做了几张图便于入门。


Git命令图解

实际上,这是在做周会的演示文稿时突发奇想的。要找到一个方法让没有听说过Git的人短时间内领略Git的魅力,这个方法非图示莫属。毕竟,我在浏览完教科书后2,都没有真正记住它们是如何作用的。

前段时间恰好在外刊IT3上看见一张有趣的漫画,于是笔者想起了那只有趣的猫,在这里将一个项目简化为画一只猫。

假设在服务器上的软件版本已经完成了头部和身体,需要在本地继续完成剩余的部分(功能)。


merge

通常我们会在不同的分支上完成不同的功能,不同分支之间是互不干扰的。分支的作用之一就是时刻让主分支保持在功能完善可运行的状态。

合并(merge)操作,目的是将一个分支合并到目标分支上,合并不同分支上完成的不同功能。

  • 假设在本地完成了“尾巴”,并且正在完成“后肢”。

    merge-0

  • 在完成“后肢”时,突然有了一个灵感,或者可能是因为“前肢”与“后肢”的开发过程相似,希望同时开发“前肢”,那么可以新建一个分支用于完成“前肢”功能。

    merge-1

  • 完成了“前肢”和“后肢”功能后,就可以使用Merge将Branch分支合并到主分支中,完成功能上的合并,一只猫:)

    merge-2


rebase

rebase被称为衍合,或者变基更便于理解,通常变基的过程就是将某一次提交的基(Parent)变更为另外一个,这会将变更前的基到变更后的基之间的所有提交合并为一次提交。笔者的理解是,通常情况下用于简化提交的日志,便于项目的管理。复杂的细小提交可以仅保留在本地即可。

  • 假设,目前的目标是完成“前肢”的功能。

    rebase-0

  • 在实现的过程中,一定会经历很多次提交,以记录修改和实现过程,这对开发过程是有利的。

    rebase-1

  • 但是这些细小的提交日志,对团队来说,大大小小的日志容易混淆视听,不便于管理,仅仅留下最重要的功能实现日志即可。

    rebase-2

    rebase-3

  • 那么,通过衍合(rebase)将最后一次实现“前肢”的提交衍合到“身体”这次提交上。

    rebase-4


cherry-pick

cherry-pick翻译为拣选,在一个分支A中经过几次提交的改进,在功能上并没有达到满意的效果,这时可能会重新建立一个分支B重新实现。

假如在原有分支A上有几个提交是可以重新利用的,或者,可能正在实现的某一个功能和之前完成的功能十分相似,一些提交仍然可以重复利用。拣选(cherry-pick)操作将帮助你完成对某一次提交的复制,避免重复性的劳动。

  • 假设在主分支上完成了“尾巴”和“后肢”,下一个目标是完成“前肢”。

    cherry-pick-0

  • 新建一个分支,由于“后肢”和“前肢”的实现一定是很相似的,我们可以使用拣选复制一个“后肢”功能的实现(提交)。

    cherry-pick-1

  • 然后经过一些修改,就完成了“前肢”。

    cherry-pick-2


revert

git中有一个立即见效的后悔药——revert,它的作用是基于某一次提交,在当前分支上进行一次反向的提交。比如说,提交A在文件f的某一行添加了一句“Hello World”,那么revert将撤销这一次添加的操作,即删除文件f中添加的那一句“Hello World”。

  • 假设在项目进行过程中,我们发现某一个功能是不切实际的,或者是多余的,或者…狠它需要理由吗?比如说,图中猫是画完了,可是它为什么会有“翅膀”?

    revert-0

  • 于是,使用revert撤销“翅膀”这一次提交即可。

    revert-1


后记

实际上还有许多常用的命令,例如reset、checkout等等,在此不再一一列举。git,拥有本地提交的特性,配合上这些强大的功能,已经成为我等码农居家旅行必备之良器。


脚注

  1. 惭愧地只是使用了不到两周而已。 

  2. 实际上这本书就没有仔细看完,只是字典式的浏览。 

  3. BTW,笔者很欣赏外刊IT的选文风格,少而精。不至于让我面对Google Reader上积攒的三位数未读,无奈地点“Mark all as read”:)这反而能够使我认真地读完每一篇文章。 

This post is licensed under CC BY 4.0 by the author.