大白话谈 Git

一、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 的基本工作流程。

提交项目修改

  1. 文件发生修改时,选择想要提交的内容添加到缓冲区
  2. 提交缓冲区内容到仓库,Git 会自动生成版本记录、版本号等

可能有人会有疑问,为什么不直接提交修改到仓库呢?

这里,缓冲区起到一个缓冲的作用,允许你考虑和修改用哪些内容生成此次版本。

团队协同合作

上文曾简单描述过这个流程:

  1. 团队在远程服务器上建立中央仓库
  2. 团队成员在本机上各自建立本地仓库
  3. 成员提交更新到中央仓库
  4. 其他成员拉取项目最新提交以更新本地仓库
  5. 如此循环往复,协同推进项目进展

四、相关链接

Git 下载地址

https://git-scm.com/

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 如有需要, 请自取:

百度网盘链接

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构沉思录

Web系统权限控制如何设计

这篇文章的定位,不是宣传某个框架,仅仅之是梳理一下有关权限方面的一些想法和最近项目中的一些探索过程。 我们主要想解决一下问题。

5362
来自专栏PhpZendo

事件驱动架构设计

这篇文章是 软件架构演进 一个有关 软件架构 系列文章中的一篇。这些文章,主要是我学习软件架构、对软件架构的思考及使用方法的记录。相比于这个系列的前几篇文章,本...

6752
来自专栏云计算-私有云

Windows Server 2019前瞻

十一假期马上就过完了,不知道各位小伙伴玩的怎么样啊,是否有遇到“人在囧途”或者是否看到了处处大海。微软于2018年9月24日-28日在美国召开了Ignite 2...

1.5K0
来自专栏PPV课数据科学社区

【学习】深度解析LinkedIn大数据平台(一)

我在六年前的一个令人兴奋的时刻加入到LinkedIn公司。从那个时候开始我们就破解单一的、集中式数据库的限制,并且启动到特殊的分布式系统套件的转换。这是一件令人...

3624
来自专栏FreeBuf

子域名枚举的艺术

写在前面的话 当我们在查找某个域名的有效子域名时,我们通常需要使用子域名枚举这项技术。但是,除非DNS服务器暴露了完整的DNS空间(涉及到AXFR协议),否则我...

4359
来自专栏星流全栈

dva - React + Redux, but like elm

1444
来自专栏有趣的django

Flask构建微电影(一) 第一章、项目介绍第二章、环境搭建

2540
来自专栏木头编程 - moTzxx

Laravel 框架中对Layer的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

2213
来自专栏ThoughtWorks

TW洞见 | 胡凯:Mock不是测试的银弹

开发者编写高质量测试的征途上可谓布满荆棘,数据库、中间件、不同的文件系统等复杂外部系统的存在,令开发者在编写、运行测试时觉得苦恼异常。由于外部系 统常常运行在不...

3606
来自专栏IT米粉

Redis常见的应用场景解析

缓存是Redis最常见的应用场景,之所有这么使用,主要是因为Redis读写性能优异。而且逐渐有取代memcached,成为首选服务端缓存的组件。而且,Redis...

7868

扫码关注云+社区

领取腾讯云代金券