Git Story(Episode 1)

引言: 大多数程序员都使用过Git作为代码版本管理的工具,也很精通git使用的三板斧:git add .git commit -am "do something"git push origin master。但关于“文件状态”、“暂存”、“版本回退”这些概念,一些初学者甚至一些有工作经验的开发者也无法真正清晰解释,这里我准备用科幻小说的形式辅助大家理解这些概念。


我是J,来自饥人谷星,那是距离银河系10万光年的行星。此行地球我有一个任务——观察并复制人类社会到饥人谷星作为真人舞台秀,供饥人谷星高贵的小姐太太们作为茶余饭后的消遣。 总有一天我完成工作会离开地球,所以我把日常工程的过程和执行指令记录下来,一方面作为我在这里生活过的纪念,另一方面也作为下一个接替者的操作手册。


饥人谷星和地球的距离实在太远了,只能等地球月球太阳三者连成一线时以月球和太阳作为信号放大器,才能和遥远的家乡母星通信一次。我的日常工作是变换成各种角色悄无声息隐藏在人类社会,选择自己感兴趣的观测对象,持续观察记录被观察者的一切变化比如生老病死,将观察信息运行在一个叫地球虚拟机的仪器上,当地月太连成一线之时便把仪器上的虚拟社会数字信息发送给母星。


初次来到地球,我在太平洋的最深的海底找到了合适的位置作为基地,执行命令git init,启动地球虚拟机。


地球虚拟机实在太笨重了,平时隐藏在基地。平日工作我一般会随身带一个记录仪,用来暂存我所观察到的变动。等下班时会回到基地再统一提交记录的变动到地球虚拟机上,把观察到的变动记录还原。


这个时代,几乎所有人类都被一个黑黑的会发亮小盒子奴役,唯独一个又唱又跳又rap的帅小伙吸引了我的注意。悄悄拿起记录仪照向他,执行命令git add boy。这条命令的作用是选择我的观察对象,并且把这个观察对象的变动(从无到有)临时记录下来。在回基地的上,我又顺手记录了一只猫(git add cat)和一只鸟(git add bird)。


回到基地,我执行了指令git commit -m "新增一个小伙一只猫和一只鸟"。这条指令的意思是把记录仪上的暂存的变动提交到地球虚拟机上,并为本次提交添加日志,便于向其他人解释到底发生了什么。提交后,这些变动立即场景重现,透过虚拟机的屏幕我能看到小伙和两只小生命的诞生,确实有趣。


第二天,当我再次观察我的猎物时,发现小鸟被毛孩子用弹弓打死了(rm bird)。怀着悲痛的心情,我用记录仪暂存了此次变动git add bird。这里我重点提醒我的继任者,对于现实世界的任何变动比如小孩新生(touch baby)、老人去世(rm old)、张三变胖(vim people)、李四减肥都可以先用git add来暂存,之后统一同git commit统一执行这些变动运行到虚拟机。


除了一股脑使用git add来记录变动外,对于现实世界观察者的消亡,我也能使用git rm bird来临时记录,当使用git commit提交到地球虚拟机后,地球虚拟机会移除这个观察者的信息。 此时git add birdgit commit -m "bird die" 等同于 git rm birdgit commit -m "bird die"


作为继任者此刻你可能会有个疑问,万一我记录仪忘带了怎么办?我会因此无法通过git add选定新的观察对象,也无法记录被观察者的变动了?当出现这种场景,不用慌。你可以在不记录变动的情况下直接提交,使用指令git commit -am "日志", 注意多一个-a参数。这个指令的含义是直接把之前观察过的有记录对象的变动提交到地球虚拟机运行,比如被观察者的死亡、身材的变化等。 这里需要注意的是,对于小孩新生我们必须先使用记录仪的git add指令,因为地球虚拟机本身没有这个新生者的记录。


总结一下:

  • 对于任何场景,我们可以使用git add somethinggit commit -m "do something"两条指令;
  • 对于已有记录的被观察者的死亡,我们可以用git rm somethinggit commit -m "do something"
  • 对于已有记录被观察者的变化、死亡,我们可以用git commit -am "do something"一条指令

终于等到了三体一线之日。通过月太信号放大器,我使用指令git push origin master将地球虚拟机模拟的人类小世界推送给了母星,origin里存储的就是饥人谷星的坐标。小世界推送至母星后,舞台秀的工作人员会还原小世界的数据变成真人秀,远在母星的小姐姐和太太们估计早已急不可耐了~




未完待续,喜欢点个赞,后续会通过故事讲代码状态回退以及日常使用git遇到的实际问题。

编辑于 2019-12-04

文章被以下专栏收录