文档章节

白话谈 Git

lonelydawn
 lonelydawn
发布于 03/12 17:39
字数 2492
阅读 875
收藏 34
点赞 3
评论 4

一、Git是什么?

定义

Git 的定义 是 一款免费开源版本控制系统。

免费不必多说;开源则是指将源代码公布,并允许公众查看、修改代码。

如果我们将项目每一个节点处的修改(这些节点可能是一些标志性事件,比如第一个章节完成、草稿完成、审核通过; 也可能是一些时间节点,比如下班回家)看做是一个版本,对这些版本的记录、查看、更新等操作即是版本控制。

Git?

Git 诞生于 2005 年,创作者是 Linux 之父 Linus Torvalds。

Git 中文翻译是 “傻子;饭桶;无用的人”。

为什么这样一款流行的工具会起这样一个名字呢?

坊间传说Linus 曾说过这样一句话,“我是个自负的混蛋,所有我的项目都以我自己的名字命名,先有 Linux, 现在是 Git”。

Linus 也曾在公共场合表示过对 Git 的看法 “Git,the stupid content tracker”。 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 如有需要, 请自取:

百度网盘链接

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
lonelydawn
粉丝 41
博文 50
码字总数 52905
作品 0
闵行
前端工程师
加载中

评论(4)

salvinlee
salvinlee
很好~
Yabcer
Yabcer
其实Git有中文图形工具已经降低门槛,让更多新手感受到他的方便之处,感谢作者,马上把Source Tree推荐给同事
lonelydawn
lonelydawn

引用来自“拥剑公子”的评论

厉害。图都是哪收集的啊
部分原创,部分PS的:smiley:
拥剑公子
厉害。图都是哪收集的啊
白话设计模式_Index

白话设计模式 【白话设计模式一】简单工厂模式(Simple Factory) 【白话设计模式二】外观模式(Facade) 【白话设计模式三】适配器模式(Adapter) 【白话设计模式四】单例模式(Singleton) 【白话...

陶邦仁 ⋅ 2014/03/19 ⋅ 0

算法分析_Index

常用算法 String indexOf 之BF、KMP算法 非递归方法实现对TB级文件目录的全遍历 一道新浪面试算法题,两行代码搞定,有兴趣的看看 斐波那契数列:一道100年后羊圈羊的数量算法题 白话算法 白...

陶邦仁 ⋅ 2014/03/24 ⋅ 0

MoreWindows博客目录(微软最有价值专家,原创技术文章152篇)

为了方便大家查找和学习,现将本人博客中所有博客文章列出目录。 一. 白话经典算法 目前有17篇,分为七大排序和经典面试题讲解两大类 1. 《白话经典算法系列之一 冒泡排序的三种实现》 2. 《...

morewindows ⋅ 2013/12/24 ⋅ 0

【白话设计模式二十五】临别总结:设计模式与7大原则

白话设计模式 工厂模式 单例模式 【白话设计模式一】简单工厂模式(Simple Factory) 【白话设计模式二】外观模式(Facade) 【白话设计模式三】适配器模式(Adapter) 【白话设计模式四】单例模式...

陶邦仁 ⋅ 2016/04/05 ⋅ 0

Android也架构之一:白话软件设计中的六大原则

要了解软件设计,了解整个架构,就必须学习软件设计中的六大原则。基于所有的设计模式都是建议于这些软件设计原则的基础上发展而来的。 1、单一职责原则(Single Responsibility Principle,...

michaely ⋅ 2012/08/19 ⋅ 1

安得促席,说彼平生

昨天,在网上读文章的时候,见到有人引用:"人亦有言,日月于征;安得促席,说彼平生。"我知道这几句话,但是不记得是谁说得了。一查,发现是陶渊明《停云》四首中的第三首。 网上还有全部四...

阮一峰 ⋅ 2006/03/07 ⋅ 0

Hive与Hbase区别

hive是什么? 白话一点再加不严格一点,hive可以认为是map-reduce的一个包装。hive的意义就是把好写的hive的sql转换为复杂难写的map-reduce程序。 于是,hbase是什么? 同样白话一点加不严格...

行走在路上 ⋅ 2014/07/23 ⋅ 0

STL系列之四 heap 堆

下面再介绍STL中与堆相关的4个函数——建立堆makeheap(),在堆中添加数据pushheap(),在堆中删除数据popheap()和堆排序sortheap(): 头文件 #include 下面的First与Last为可以随机访问的迭代...

彭博 ⋅ 2012/04/12 ⋅ 0

【CSDN博客之星】成功连任2013年CSDN年度博客之星,非常感谢大家的支持!祝大家新春快乐!

各位读者好, 本人博客开通2年半以来发表技术文章152篇(全部原创),访问量152万。博客文章通俗易懂,图文并茂,《秒杀多线程面试题系列》,《白话经典算法系列》,《C++ STL》,《Win...

morewindows ⋅ 2013/12/14 ⋅ 0

STL系列之四 heap 堆

下面再介绍STL中与堆相关的4个函数——建立堆makeheap(),在堆中添加数据pushheap(),在堆中删除数据popheap()和堆排序sortheap(): 头文件 #include 下面的First与Last为可以随机访问的迭代...

长平狐 ⋅ 2012/12/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vim基础-编辑模式-命令模式

编辑模式:可以编辑修改文件。编辑模式下 按“esc”键返回一般模式。 按一次“Insert”键 (一般在键盘回格键右边)作用和“i”一样表示“插入”。按两次“Insert”键表示“替换”,作用为:...

ZHENG-JY ⋅ 12分钟前 ⋅ 0

MaxCompute读取分析OSS非结构化数据的实践经验总结

摘要: 本文背景 很多行业的信息系统中,例如金融行业的信息系统,相当多的数据交互工作是通过传统的文本文件进行交互的。此外,很多系统的业务日志和系统日志由于各种原因并没有进入ELK之类...

阿里云云栖社区 ⋅ 16分钟前 ⋅ 0

Linux操作系统有何优势?Linux学习

  当今世界流行的操作系统有3大类,Linux、Mac OS和Windows操作系统,Linux操作系统因其开源、免费、跨平台、良好的界面等特性,深受广大程序员们的青睐!   Linux操作系统被广泛的应用于...

老男孩Linux培训 ⋅ 18分钟前 ⋅ 0

Spring Cloud Spring Boot mybatis分布式微服务云架构 开发Web应用

静态资源访问 在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。 默认配置 Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static /pub...

itcloud ⋅ 22分钟前 ⋅ 0

6月19日任务 设置更改root密码、连接mysql、mysql常用命令

13.1 设置更改root密码 1. /usr/local/mysql/bin/mysql -uroot 设置环境变量 : export PATH=$PATH:/usr/local/mysql/bin/ 永久生效: vim /etc/profile 加入 export PATH=$PATH:/usr/local/m......

吕湘颖 ⋅ 24分钟前 ⋅ 0

MaxCompute读取分析OSS非结构化数据的实践经验总结

摘要: 本文背景 很多行业的信息系统中,例如金融行业的信息系统,相当多的数据交互工作是通过传统的文本文件进行交互的。此外,很多系统的业务日志和系统日志由于各种原因并没有进入ELK之类...

猫耳m ⋅ 25分钟前 ⋅ 0

Spring MVC controller,return重定向redirect:

@RequestMapping(value="/save",method=RequestMethod.POST)public String doSave(Course course) {log.debug("Info of Course");log.debug(ReflectionToStringBuilder.toStr......

颖伙虫 ⋅ 33分钟前 ⋅ 0

JavaSE——线程介绍

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 线程: 介绍:管线程叫多任务处理,首先你得知道...

凯哥学堂 ⋅ 36分钟前 ⋅ 0

ORM——使用spring jpa data实现逻辑删除

前言 在业务中是忌讳物理删除数据的,数据的这个对于一个IT公司可以说是最核心的资产,如果删除直接就物理删除,无疑是对核心资产的不重视,可能扯的比较远,本文最主要是想通过spring jpa ...

alexzhu592 ⋅ 42分钟前 ⋅ 0

CDN caching

Incapsula应用感知CDN使用智能分析和频率分析来动态缓存内容,并最大限度地提高效率。确保可直接从RAM获取最常访问的资源,而不依赖于较慢的访问机制。 1、 静态内容缓存 Incapsula缓存静态内...

上树的熊 ⋅ 45分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部