如何使用git 提交作业 收作业
今天就来用一个通俗易懂的自然模型来解释Git的commit,pull和push。不过,我们首先要理解两个名词,remote,local。
remote,翻译成中文,就是远程。为了更便于理解,我们称之为远程(代码)库。
local,本地的意思。同理,谓之本地(代码)库。
把这两个名字回归到一个我们熟悉的自然模型。
remote,就是学校。local,为你自己家。
你写的代码,就是你写的作业。
commit,提交的意思。
pull,直译为拉取,更通俗的讲,获取。
push,推送。
那么每天放学之前,老师布置了今天的回家作业。从布置回家作业,到第二天交回家作业,经历了哪些过程呢。
首先你要知道老师布置了什么作业,作业有什么要求。也就是你需要明确你需要写哪些代码,用什么语言,完成什么具体的需求等等。
然后,你需要把你的回家作业拿回家。这一步,就是pull(获取)。
回家之后,勤奋的你鞋子都没脱,就打开了书包开始写作业。
一小时之后,你写完了作业。
接下来,就是把你写好的作业放在书包里,准备第二天交给在学校的老师。
把写好的作业放在书包里,这一步,就是git commit。
第二天早上,你高高兴兴的去上学,拿出你的作业,交给老师。这一步就是push(提交)。
一个简单的拿作业到交作业的流程就是这个样子的。
不过,Git这个版本控制软件当然没有这么的简单,下一篇文章我将分享如何理解branch,merge,rebase以及如何使用Git进行多人协作。
那么,今天我们来思考,如何用Git让大家共同完成一份作业,也就是写一个程序。
首先,引入Git的branch概念。
之前的举的一个写作业的例子,我们现在来拓展一下这个模型。
学校里不可能只有你一个学生,你的班级里不可能只有你一个学生。
学校,可以理解成你的公司。班级,你所在的部门。学生,软件工程师(程序员)。
每个人都会push自己写好的作业,那么我们如何把不同人写的作业的过程(也就是代码提交的修改,还记得我们的第一节说的吗)清晰的显示出来呢。很简单,把不同人写的作业分开来放呗。
比如,张三写的一本本作业(一次次代码修改)放在一条线上,称这条线为zhangsan,贴一个zhangsan的标签。
李四写的一本本作业(一次次代码修改)放在zhangsan这条线的在地板这个平面的一条平行线上,称这条线为lisi,在这条线上贴一个lisi的标签。。
这分开的两条线,就是两个branch。
张三可以在zhangsan这条线上放上(push)自己的作业,李四可以在lisi这条线上放上(push)自己的作业,两条线之间可以互相不冲突。
当然,最后,老板(或者你的上司)会将作业写的好人的作业放在红榜上进行表扬。那么我们就需要一条线来放置老板认为质量最好的作业,对吧?我们称这条线为master,也就是我们的主线,这里放着写的质量最高的作业。
有了这条线,接下来我们是不是要把最好的作业放到master上呢?
而在Git中,完成这个操作有两种方式。一个是merge,一个是rebase。
我们先来弄清楚merge。
大家应该都已经懂了,我们每次都commit,都是一次代码的改动,那么多次代码的改动,当然可以变成一次改动,也就是将多次commit合并。多个commit与这多个commit合并所得的commit,是等价的。
张三把多次commit合并,变成了一个commit,然后把这次commit,合并到master这个branch上。这个操作就是merge zhangsan into master,这样会导致master这个branch只多一个commit。这个commit可能是多次commit的一次合成。Merge这个操作,就是将zhangsan这个branch相对于master的修改,在master上也进行了一次等价的修改。
那么这样zhangsan和master其实是一样的了,所以我们其实只需要一条线了,对吧。然后在这条线上贴上两个标签,zhangsan和master。
那么什么是相对于master的修改?
这里需要解释一下。假象一下,master这个branch上的作业(代码)是星期六的作业了。zhangsan这个branch在此时和master这个branch是一模一样的。你(比如你是zhangsan)星期天在你的branch commit并push了。那么相对于master这条branch,zhangsan这个branch有了星期日的作业,也就是相对于master有了修改。
那么什么是rebase?
同样的,有了相对的修改。
rebase,与merge不同,不会将多次commit合成一个commit。
而是将相对的修改直接抄过去。比如rebase master on lisi,就是将lisi这个branch相对于master的修改直接抄上去了,而且是一个commit一个commit的抄,那就会在master上留下多次commit。
其后面的本质其实是这样的,先将lisi这个branch相对于master的修改截取下来,保存在一个地方。此时lisi和master是等价的了。也就是一条线2个标签,然后这时把我们刚刚保存起来的修改,一个一个的放在master这条线上。
这就是rebase。
参考:https://www.jianshu.com/p/0623cb42fcfa