一篇梳理Git与GitHub的使用

一篇梳理Git与GitHub的使用

对于一个熟悉了Git工作模式的人来说,Git的步骤清晰明了而自然,然而对于一个完全懵懂而新手来说,这些步骤繁杂而又混乱,完全搞不懂Word上一个Save就能解决的事情怎么能分出这么多操作,Git和GitHub终于傻傻分清楚了,add,commit,push,pull外加一大堆黑乎乎五颜六色的命令行又在脑海中嗡嗡的转圈圈,沉下心来把它们仔细的梳理一遍是很有必要的,然后你才会发现这是一种多么激动人心的工作模式,就像它本来就应该如此一般。

我们先对Git与GitHub的使用流程进行梳理,大致分为两个部分:

  1. 版本控制

    我们回到Git最最基础的功能,忽视围绕它为中心的一系列工作模式,所谓版本控制,可以理解为保存项目的各个历史状态与版本,为了实现这个功能,实际上你只需要两个操作:

add commit
告诉Git接下来会有哪些文件参与这次版本控制,将接下来可能会被更新的文件和项目中需要的文件执行add操作 提交,快照或者保存。对你目前一段时间的工作进行提交保存(距离上一次commit),其实commit是你在进行版本控制时需要进行的唯一操作(add可以被当作只是初始化操作),和Word的Save一样,只不过你需要添加适当的注解(你所进行的改动的说明),比Word保存更好的地方是你可以看到所有的历史改动

add可以被理解为初始化操作,一次性将你接下来工作会用到的文件全部添加,由于Git可以参与控制的从文件夹到各种类型的文件太多,所以先跑马圈个地是必要的。也就说,在实际开发中,你只需要根据你的工作进度不停的按commit就可以保存项目的各个状态和版本了,这样一看,是不是会发现很简单呢?然而,实际上你在开发过程中可能会建立一些新的文件,这些文件也需要被加入到这次的版本控制之中, 这时候,add就要被重新启用了。当然,在理解了它们的实际用途之后,你再不会被add和commit的混合双打弄得头晕脑胀啦。

  1. 协同合作

    很多人把Git的协同合作比作一棵树的生长,我觉得不太合适(完全没法解释长出的树枝又怎么长回了主干上),在我的想象中它可以是一列缓慢却又坚定向前开动的拉货火车,在行程过程中,它会派遣其余火车分列前往不在它的主干路线上的站点去拉货,拉到货之后在前往主干线上和主火车汇合,主火车由一个人或者一个团队控制,它可以选择是否让前来会合的车厢是否与它合并,并可以挑选分列车厢上的货物(有的要有的不要,有的改一改再要,有的要先扔掉现有的再要新的)。

    这里有一点需要注意的是,在主火车派遣分列时,分列选择的车型可以和主车完全相同,或者只具备主车部分功能 ,这一点和你之前的add操作类似,你可以只向Git添加你需要更新的部分,也可以为了项目的完整而添加全部文件(即便有些文件你并不会对它进行改动)。由此而言,这个比喻也不太合适(火车毕竟可以分节却不能分裂)。

    换个更好比喻,它更像是一个寻求进化的基因(容易感染并且我们认定一个主体),为完成自我进化对自己完整体或自己的某一片段进行复制,这些复制体被分发到不同环境中进行变异,变异体再被人为的拿来与原基因主体进行重组,实验者(项目主分支管理者)拥有选择重组的部位片段等等权力 。虽然这个比喻不如火车好理解,但应该更精确。

    我们还需要理解的点是,Git如何与GitHub合作。GitHub只不过是名字中碰巧不巧含有个’Git’从而增大了两者的混淆性,偏偏两者又有千丝万缕的联系你还不能说他名字起的太任性。 GitHub被理解为Onedrive,Dropbox,百度云等等可以减轻理解难度。

    你要认识到的一个问题是,这完全是两个东西,虽然两个东西打包一起下载你会解锁更多的用户功能,但对于我们这样的小白来说,只需要一个Git我们就可以用add和commit玩的很开心了, 而增加一个GitHub有什么用呢?

    我们可以用它实现网盘的效果,只需要用push(上传)和pull(下载)你就可以实现多台电脑之间的项目共存 ,和所有商用网盘一样你也可以只pull和push部分你需要的内容,这样你就可以轻松愉快的(还免费哦)用在家里的电脑或在办公室的电脑同步开发一个项目。 甚至!同步参与开发的还有一台你不知道在哪里的电脑,比如你同事小王的电脑(没错,这就是GitHub‘万恶’(狗头)(狗头)的特性,开源!随随便便开发点优秀的东西你的街坊邻居立马都知道了)。

    (乛-乛好气,我的项目怎么能轮到他人指染!?)然而有一个好处是,在GitHub上你拥有的一个权力是可以选择用或者不用小王开发的那部分项目(要不要呢,这比写的代码确实比我的好啊(╯’ – ‘)╯︵ ┻┻),甚至你可以逐行的审阅,选择或修改 那部分代码。现在你可以看到的是,通过Git与GitHub的合作可以两个人或者多人同步开发同一个项目(不同或相同)的内容和功能,GitHub上的项目拥有者拥有选择采用或合并开发者们工作内容的权利。

    自然而然可以引申出的一个问题是,既然多个人都可以在同一个项目上进行不同的开发,那么我自己呢?如果我想在这个项目上同时进行两个不同的功能开发,应该也可以通过Git或者GitHub的功能来实现。这就是Git的分支功能,通过分支功能,我们可以轻易地进行绝缘的特性开发(电脑之影分身术)。

    事实上,我们之前所看到的多人合作开发同样是基于分支功能来实现的,GitHub上项目的拥有者控制主干,而其他参与开发者编辑分支,通过合并(merge)功能主干控制者进行分支代码的筛选和合并。

    这样,我们就可以协同合作与之前的比喻相对应起来,项目拥有者控制基因主体(master),其他开发者得到基因复制体(pull),对基因复制体进行变异开发(branch,checkout),然后将变异体提交给项目拥有者(push),项目拥有者对诸多变异体和主体进行合并重组(merge)。

为了不使一大堆名词先将你的头脑绕晕,前面对很多词汇(暂存区,仓库等)还有一些常用功能(pull request, fork等)以及Git的工作方式进行了省略。理清其使用的大致流程后理解后面的概念将更加容易且能使Git的运行过程在你脑海中更加清晰。

实际上,在你使用add进行跑马圈地之前,你先需要立个拴马桩,这个拴马桩就是 git init ,在使用Git Bash进入你的项目文件夹后,使用 git init 会在文件夹中生成 .git文件,告诉所:“这个项目就由我来罩着了。” 这个操作实际上意味着在此建立了一个Git仓库,

(未完待续)

猜你喜欢

转载自blog.csdn.net/qq_32916805/article/details/79497789