一、Git是什么?
定义
Git 的定义 是 一款免费、开源的版本控制系统。
免费不必多说;开源则是指将源代码公布,并允许公众查看、修改代码。
如果我们将项目每一个节点处的修改(这些节点可能是一些标志性事件,比如第一个章节完成、草稿完成、审核通过; 也可能是一些时间节点,比如下班回家)看做是一个版本,对这些版本的记录、查看、更新等操作即是版本控制。
Git?
Git 诞生于 2005 年,创作者是 Linux 之父 Linus Torvalds。
Git 中文翻译是 “傻子;饭桶;无用的人”。
为什么这样一款流行的工具会起这样一个名字呢?
坊间传说Linus 曾说过这样一句话,“我是个自负的混蛋,所有我的项目都以我自己的名字命名,先有 Linux, 现在是 Git”。
Linus 也曾在公共场合表示过对 Git 的看法 “Git,the stupid content traker”。 Git, 傻瓜内容追踪器。如傻瓜相机一样, 这里的 “傻瓜”指的是让复杂的操作变得更简单。
也有人认为 Git 是 “Global information tracker” 的缩写。如果将项目整体认为是“全局”,项目文件内容认为是 “信息”,文件内容的增删改查认为是“跟踪”, Git的本质的确是 “全局信息跟踪”。
分布式
与传统的版本控制工具不同的是,Git 采用分布式管理。我们在远程服务器建立中央仓库,团队每位成员将其同步到本地。之后团队成员每做一次修改,即将项目最新状态上传到中央仓库,并通知团队其他成员拉取中央仓库项目状态以更新他们的本地仓库。这是一种高效的团队协作方式。我们取某一个时间节点来看,项目的最新状态确实是分布式地存储在团队各个成员的本地仓库中的。
二、为什么要用Git?
备份文件
有没有人会担心突然哪一天电脑坏掉了,不能用了呢?为了不使工作成果消失,一般我们会使用 U盘、光盘或者云端工具如百度网盘、360云盘、Google Drive等留存一份副本。同样, Git 也具有这种功能。当我们在中央仓库建立唯一副本后,无论我们是在公司、家里、酒店、会所等任何有网有电脑的地方,都可以快速还原工作环境。
记录历史
每一次提交项目修改时,Git 会记录提交者、提交日期等信息,并自动识别项目发生变化的地方。同时,我们还可以为每次提交添加注释以帮助我们回忆和梳理项目历史。
Git 对于二进制文件的支持并不算友好,它不能识别文件发生变化的区块,因此会带来一些限制,之后会提到。不过我们依旧可以用它来记录一些信息。
切换版本
在进行长篇大论的写作时,往往会遇到这样一些情况,想要删除某一个段落、或者替换一些数据,但又怕之后会用到。于是我们建立了一份副本。可这样的情景多了,文档结构就会变得很复杂,当然我们可以通过标注文件名称简单管理一下。于是,我们得到了多个版本、看起来比较混乱的文档结构。
而Git 则通过版本控制很好地解决了这个问题。在每次提交时, Git 生成一个HASH值作为版本号,我们可以通过查看项目历史找到想要的版本,并通过版本号将当前版本回滚到指定版本。
团队协作
即使一个团队里的每个人都能够独当一面,在遇到更复杂的情况和更难对付的对手,他们仍然需要合作,或合力一处攻破难关,或各施所长处理不同的业务。然而,若是没有一套良好的合作机制,不能够有效地进行团队协作,所起的作用是事倍功半的。
假设团队合作一个项目,我们可以让擅画图的去作图,文笔好的去作文,负责人组织全局结构,协调各部分资源。这样不仅使得团队成员术业专攻,也使得业务的每个部分得到最专业的打磨,同时有效地缩短了项目的开发周期。
举个传统方式团队协作的例子,Jack在开发项目时,发现某一部分需要 John完成,于是他把文件复制了一份发给 John,之后继续自己的工作。第二天John将文件传回来,可这时Jack并不知道John对文件做了哪些修改,也无法清楚地分辨出自己做过的变动,除非他们之间事先做过良好清晰的约定或者Jack等待John完成后再继续自己的工作。
使用Git则会极大地简化这一过程。Jack将自己的工作内容上传到远程仓库中,John复制远程仓库内容到本地,之后两个人各自进行自己工作。当John完成工作时,通知Jack拉取项目更新,在拉取过程中, Git会自动合并双方的修改为一体,如果项目成员的修改发生冲突(比如修改同一处),Git 允许你手动选择使用什么内容来填充冲突处。
这一功能也得益于Git的版本控制机制。在文件内容发生修改时,Git会将发生修改的部分划分为区块进行记录,以区块为单位从而实现自动合并。我们之前说到 Git对于二进制文件的支持并不算友好,因为Git不能识别文件发生变化的区块,它会将二进制数据流视作整个区块,因此Git并不能自动合并不同版本的二进制文件, 如 word、excel、ppt 等。
工作透明
在软件团队中,有一个不成文的习惯,团队成员在每天晚上下班前,先将一天工作内容上传到中央仓库,早上上班时先从中央仓库拉取项目更新。由于项目的每个成员都可以通过版本历史记录查看其它成员的工作内容和项目进展,因此也就形成了团队内部工作透明的机制。
三、怎么使用Git?
下载安装
Git 全平台通用,我们可以在官网上下载安装。
Git 命令
在上面的内容中,我们提到过 Git 相关一系列操作,如拉取、提交、查看历史等。可是究竟要如何实现呢?
Git 为这些操作提供了一系列配套命令,常用命令如
# 克隆远程仓库
git clone
# 初始化一个仓库
git init
# 将文件修改添加到缓冲区
git add
# 移动或重命名一个文件、一个文件夹或快捷方式
git mv
# 回滚项目版本
git reset
# 将文件修改从缓冲区中移除
git rm
# 显示项目当前状态
git status
# 显示项目日志
git log
# 显示项目分支
git branch
# 切换分支或重置文件
git checkout
# 提交项目修改到仓库
git commit
# 对比版本之间、版本和当前工作状态之间的差异
git diff
# 合并文件
git merge
# 将提交放在另一个基的上面
git rebase
# 创建、显示、校验标签对象
git tag
# 拉取其他仓库的对象和索引
git fetch
# 拉取其他仓库内容并和本地分支合并
git pull
# 更新远程仓库
git push
同时,这些命令还有配套的一些参数,之后会推荐一些相关教程。
Git GUI
如果觉得对着黑盒子敲命令很不舒服的话,你也可以使用 Git 的图形界面。
推荐一款我常用的 GUI,Source Tree。
Git 工作流程
下面简单讲述两个 Git 的基本工作流程。
提交项目修改
- 文件发生修改时,选择想要提交的内容添加到缓冲区
- 提交缓冲区内容到仓库,Git 会自动生成版本记录、版本号等
可能有人会有疑问,为什么不直接提交修改到仓库呢?
这里,缓冲区起到一个缓冲的作用,允许你考虑和修改用哪些内容生成此次版本。
团队协同合作
上文曾简单描述过这个流程:
- 团队在远程服务器上建立中央仓库
- 团队成员在本机上各自建立本地仓库
- 成员提交更新到中央仓库
- 其他成员拉取项目最新提交以更新本地仓库
- 如此循环往复,协同推进项目进展
四、相关链接
Git 下载地址
Git 英文教程(基本原理)
https://jwiegley.github.io/git-from-the-bottom-up/
Git中文教程(命令用法)
https://github.com/lonelydawn/git-recipes)
Git GUI 推荐
Source Tree: https://www.sourcetreeapp.com/
GitHub 官方 GUI: https://desktop.github.com/
Git项目托管平台推荐
GitHub: https://github.com/
BitBucket: https://bitbucket.org/
码云(国内平台,备受好评!): https://gitee.com/
关于 Git 项目托管平台有一点要说的是,GitHub 虽然是最大 Git 开源项目社区,但它的 私有库是收费的,而 BitBucket 则提供限量免费私有库,这对中小型公司是比较友好的。
五、PS
配套 PPT 如有需要, 请自取:
文章评论