简单实用!从项目架构角度解析Git和GitHub的高效使用方法!
Part 0 前言
Part 1 Git Introduction
Part 2 Git Initialization
Part 3 Project Initialization
Part 4 Git Practical Usage
Part 5 Git Summary
近年来,各大科技公司对于求职简历上项目经历的要求正逐年提升。homework类型的项目已经远远不能满足公司的要求。对于同学们来说,在有限的时间内既要完成课业,又要准备优质项目,求职准备压力骤增。
一旦涉及项目,我们总会联想到工业级别,那么,工业级别的项目意味着什么呢?这意味着从开始搭建项目时,就要具备工业界的思维能力、运作能力。包括思考在此过程中会用到哪些工具,建立什么样的架构,怎样布局,如何创立源代码等。
很多同学对GitHub不是很熟悉,不清楚命令行的使用方法,有些同学甚至没有用过GitHub,将Git、GitHub弄混,搞不清两者之间的关系。然而,做项目时,却会百分百使用到该平台。
本篇文章根据直通硅谷导师的经验,向同学们讲解GitHub的使用方法及窍门,帮助同学们快速上手,完成整个版本的更新,使用好迭代的开发等。文内含有十余个命令行,帮助同学们快速建立认知。总而言之,这里没有复杂的理论、复杂的形式,而是从实用的角度,教同学们利用好工具,完美完成手头的个人项目、协同开发项目。
Git + GitHub | |
历史
创造者:
图片中的这位仁兄叫林纳斯·托瓦兹(Linus Torvalds),是工业界非常知名的工程师、架构师。他是Linus最重要的一位作者兼核心发起人,同时,也是Git的创造者。
为什么创造了Git:
那么身为贼流弊的开源系统Linus的创始人,他又为什么要做Git这样一个不起眼的辅助工具呢?
此处就不得不扯出一段爱恨情仇。在林纳斯·托瓦兹早期做Linus时,曾经使用了BitKeeper这款版本控制工具,很好很顺手!快乐的林纳斯给予BitKeeper高度评价,并推荐给了他的小伙伴们,矛盾出现了。这群活泼的小伙伴中,有几位工程师拿到了BitKeeper的版本并尝试破解协议,被发现后惨遭围剿。
原本自负的林纳斯同BitKeeper总裁进行了长达数月的谈判,因为如果被禁用,庞大的Linus系统将无处安放。但是很遗憾,BitKeeper并没有妥协,结果是要么交付巨额的商业使用费用,要么禁止林纳斯等人继续使用。
傲慢的天才,林纳斯是个非常有性格的人。怒从心头起,恶向胆边生,“你们滚蛋吧!我不用了!”于是,林纳斯在2005年4月3日开始开发Git,短短十天之内,初级版本的Git上线了!这基本上可以达到开发Linus的使用需求。之后,Git不断更新,一直延续至今。现在,Git的功能已经非常全面,可以满足大部分人的需求。
性质
Git优势众多,今天我们挑出几个重点,向大家简单做一个介绍。
Revision control system:Git是一个进行软件资源版本迭代的控制、管理系统。
Strong support for non – linear development:Git是一个非常强的非线性软件开发工具。
Distributed development:Git支持分布式开发,每个人都是开发者。可以根据自己的权限将项目下载到本地,进行改写、更新。大幅度提升开发效率。
Open to other SW tools based on cross – platform:Git用户呈病毒式增长蔓延的主要原因。林纳斯是坚定的软件开源支持者,Git也沿袭了该理念。无论是支持工具,云端存储器,还是服务系统,只要想使用Git,都会完全得到开源支持。
Git vs GitHub
Git是林纳斯开发的,纯粹的用来使用的工具。
GitHub是一个开源的项目储蓄平台,只支持Git作为唯一的版本库格式进行托管。
背景大致讲到这里,下面我们将列出一些命令行,介绍实际上手的过程。
Install
提到初始化,我们从下载开始讲起
Linux/Unix
Linus系统可以从命令行“sudo apt-get install git”切入,直接下载Git。
Windows/OSX – Git Bash (https://git-scm.com/downloads)
Windows/OSX系统则要去官网下载。在Windows里面,Git工具叫Git bash。
Git Initialization
下载好以后,在使用之前……
Sign up – username,password,email
需要先注册一下
Global configuration
之后打开Git bash,输入以下两个命令行。告诉你的Git环境,你自己是谁,在上传之前,告诉你有个账号正在与之匹配。到这里,Git的初始化过程基本已经完毕。对于一般的开发者来讲,这已经足够了。
git config --global user.name “Your Name”
git config --global user.email “[email protected]”
Git Clone
https://github.com/zhitongguigu/ProjName.git
然后我们一起来看看Git Clone。在开始之前我们需要先创建一个repository,相当于project下一个大的文件。如图,从这里进入界面。
举例,假如我们今天要做一个计算器,就可以把calculator的前四个字母“calc”填入Repository name中,“calculator development”填入Description中。虽然GitHub支持开源,但因为保密问题,同时也提供Private(当然,你需要支付一定的费用)。随手选上README是个不错的习惯。
完成这步之后,我们就可以开始Clone了。首先,要想和网页同步,需要把现有的东西,包括Git的链接打造好。在这里我们Control+C一下,把Clone里面的这一段链接复制下来,然后分配到两个窗口里面(模拟两个人或两个电脑)。我们同时在这两个文件夹下复制。
同样,我们也模拟了两个文件夹。大家可以看到,在下载好之后,里面出现了“calc”。到了这里,基本上已经完成了我们的下载工作。点开之后,发现了README和一个用于存储的半隐藏式文件夹git,为了避免“lost your track”,不要删掉git文件夹。同时,点开README,能看到里面有我们输入的项目名和描述。
完成初始化之后,我们进行下一步Project Initialization。
那么,往项目里面放什么呢?每个人的项目都是不同的,例如C++的项目, java的项目,machine learning的项目等等。我们今天会以C++举例,教大家如何初始化你的项目,并让你的项目看起来更加“类工业级别”。
如图,SDLC。在开发的过程中,按工业界的思维,未来的项目要不停迭代。在提交后,大家都不希望大的框架下发生大的改变。也就是说,我们的目录里,要尽可能涵盖一些未来要用到的东西,这是一个预测。
作为一名优秀的软件工程师,要在开发初始时,就知道三个月以后要做什么。他可能不能特别细致的判断,但大致所走的方向,大致所要建立的初始化的架构,是可以认知和了解的。
一个非常有经验的软件工程师,一般会提前建立好比较全面的“目录”。避免未来再做大的变化调整。大家可以想象一下,系统和项目都非常庞大,代码量惊人,如果每一次都需要重新做架构调整,文件夹频繁变动,那么对于整个开发人员,整个组,甚至整个公司来说,都会产生巨大的影响。事情变得非常繁琐,效率低且极易出错。
这是大前提,以下我们列出了9个Categories,这些方面是我们应该考虑到的,.为了让大家有更直观的认识,我们将这9个在未来可能涉及到的Categories复制到刚才的两个“calc”中。
Categories
Build
win(64/32), osx, linux, android, debian etc…
Build是什么?对于项目,尤其是C++和java的项目,大家肯定会去编译它,这就可能需要针对不同的系统。在学校时,老师可能会指定系统,但工业界则不然,建立的95%以上都是跨平台系统。工业界的代码量非常大,如果在每个系统下都需要重复操作,则会非常繁琐,也是不现实的。所以在此之前,我们要先建立好目录比如win(64/32), osx, linux, android, debian等。建立之后,无论未来如何去编译,我们都可以安置在对应的文件夹里。
dep
public open source libs
在做project中,我们难免会用到API,或者称之为第三方的开源库。所有的第三方免费库都需要有去向,我们可以提前建好dep,将库放到合适的位置。
docs
Documentation,这个可能大家都非常了解它的重要性,在进行软件迭代过程中,有不同的阶段,每个阶段产生的文件都可以放在该目录下。
external
3rd party libs
External和dep有些相似,不过External是专门供第三方商业合作伙伴使用的库,将它与开源库分开,可以有效降低风险。一旦被黑,还有一点幸存的概率。当然把文件夹单独加密是更专业的做法。
src
可以将source code放在这里。
include
interface
这不是指开发中源文件的include,是特指interface。一般情况下,开发者都非常希望自己的作品可以嫁接到大公司里。这样就需要一个接口,来定位开放的权限,开放的功能等。
main
separated from the whole program
放置main函数的地方。大家如果用过很多开源库的话,就会发现几乎所有的开源库都会把main函数跟source code分开。写main函数的基本都是使用者(无论是自己还是第三方),里面的核心代码是完成一些功能的,如果将main函数与source code混在一起,不但非常混乱,而且使用者每一次改变main函数调用功能时,所有的部分都要编译一次。把main函数跟source code分开可以降低错误率,更简单省时,代码管理也更加规范。
resource
config files, pictures, external data etc…
这里可以放置一些配置文件,例如软件执行时的一些参数等。当然也可以放一些其他的东西,比如在做网页开发时,需要插入图片,可以将图片有条理的放在这里,根据编号使用。
tools
例如BusyBox等第三方提供的,所有开发时需要用到的辅助工具都可以放在这里。
到这里为止,基本的Categories就建全了,有这方面的思想非常重要。工业界的项目不止是建立一个文件夹,没有任何排序整理的,将所有的东西都凌乱的放在里面。这样在未来进行工作时,将会越来越吃力。
接下来我们回顾一下刚才进行到的步骤。
点开build,这里我们随便列举了一些操作系统。
Dep里我们象征性的放入了两个第三方库,opencv和opengl。基本上的第三方库打开之后会有include和lib。如果open source 下载下来后不是这种形式,可以稍作整理。
docs里则定义了一些开发流程中可能会存储的一些文件,1Planning,2Defining,3Designing,4Building,5Testing,6Deployment,7Maintaining……
剩下的部分我们就不一一叙述了。接下来我们开始讲一些Git对Project的初始化,去提交第一个Commit。
Git First Commit – Master Branch
Git Add
Add new folders/files into commit
“git add (-f) path/filename”
Git Commit
Commit to the changes and be prepared to upload
“git commit -m “built up calculator project categories, first commit!””
Git Push
Push the changes to cloud with the commit attached
“git push origin master”
在两个窗口下我们都会提交第一个commit,我们进到刚才下载好的calculator项目下。
如果你前面的流程, Git安装没有问题的话,会有一个自动默认的master提示。
如果在Linux下,默认的终端可能没有这个提示,我们可以检查一下:“git branch”。出现的“* master”则说明正处于master的branch下。
下面我们来看一下,跟最初相比,我们添加了哪些内容。经对比我们发现dep和external没有列举出来(因为文件夹是空的,没有任何文件)。
假设我们里面有东西,我们将要把它们添加在Commit的潜在的内容下。“*”代表所有文件。
同样,对于build中的空文件夹来说,为了让Git能看到它们,可以加上dummy file。
查看了所有添加文件之后,我们要去完成第一个commit —— git commit –m ”added categories for cale project, first commit!”。我们也明确的标注了将要把它push在哪里。最后则需要输入账号以及密码。
此时再用“git status”查看,就会发现几乎不剩下什么了,基本都被push到了云端。
我们可以检查一下,刷新过后……
到这里,Git First Commit就完成了。
这一部分我们先以单一窗口为例,给大家介绍工业界当中,一般是如何开发的。
像Google,Facebook这类较大的公司,大家可能很难想象它们所有source code的master只有一个(每人权限不一样,有自己的branch),这也足够证明Git足够强大。
我们将举出例子:完全在自己一个人的情况下开发,单独的branch,commit一次/多次然后merge到master;同事已更新,发生冲突时该如何处理。
Git Checkout
Open a new branch for local self development
“git checkout –b Name_ForWhat”
首先我们要建立自己的branch。名字 + 目的。我们可以看出这里已经有了两个branch:master和william _Test Brach。
Make changes on project
Files, pictures, external data etc…
接下来做一些改变,加上简单一句。
为了确保修改正确,我们可以”git diff src/calc.h”简单查看一下修改部分。一般情况下删减呈红色,增加呈绿色。注意格式是否规范。
Submit changes on the branch
Git add
Git commit
Git push
william _Test Brach之中有3个commits。
Merge to master branch(one commit vs multiple commits, unchanged/changed master)
Git rebase
“git rebase –i master”&& “git rebase --continue”
Pull request, Merge, Delete unused (local/remote)branch
我们继续rebase
接下来我们将进行Merge。在GitHub页面,选对branch,然后继续操作。
在后台,系统会帮助检测有没有冲突,如果没有,就可以完成最后一步了。当前的branch就被merge到master了。在master下,可以发现它。
当想清理不需要的branch时可以使用命令行:
Remote: git push origin –delete <branchname>
Local: git branch –d <branchname>
我们使用两个窗口模拟不同的机器,这样左边的窗口和云端的master就略有不同。
检测发现与云端有所不同。
我们回到本地, rabase。保存,退出,冲突出现。
查看冲突。
搜索HEAD寻找冲突。与同事协商得出结论并修改。
假设不清楚有多少冲突,可以继续查询。最后提交。
以下是对Git简短的总结。
Very powerful source code distributed management system
Tons of commands but only multiple ones are frequently used
Embedded in famous cloud services
Github(1st cloud service for Git)
Bitbucket
Teamforge
…
A good looking and enriched github could make attractions!!!
Industrial project
Industrial coding style
Industrial development cycle
想做工业界的项目必须具有工业级别的思想,严谨的编码态度同样必不可少,熟练的运用GitHub将会对同学们做工业级别的项目有很大的帮助。
不止是Git和GitHub,在求职的过程中,我们往往还会遇到许多问题......
该如何衡量学业和求职?
秋招的时间线?今年机会几何呢?
大厂都考些啥?准备到什么程度够用?
没有实习应该如何快速增加简历竞争力?
那么,你有必要了解——直通硅谷保OFFER计划!
依托硅谷顶尖科技公司资深工程师教师资源,针对华人学生面试短板,打造精悍高效、高技术含量且紧贴面试趋势的精品上岸课程!
98%的课程满意度
400+在职资深面试官导师
4200+成功案例
至快三个月,帮你斩获心仪offer
欢迎扫码咨询保OFFER计划,匹配专属面试官导师,领取为你量身打造的职场发展规划!
专业团队,经验打造,助你全面提升求职准备效率,短时间内迅速提升面试能力!
数据科学求职旗舰课重磅更新
软件工程师求职旗舰课全面升级
微信扫码关注该文公众号作者