文档章节

白话谈 Git

lonelydawn
 lonelydawn
发布于 03/12 17:39
字数 2492
阅读 907
收藏 36

一、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的😃
拥剑公子
厉害。图都是哪收集的啊
MoreWindows博客目录(微软最有价值专家,原创技术文章152篇)

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

morewindows
2013/12/24
0
0
【白话设计模式二十五】临别总结:设计模式与7大原则

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

陶邦仁
2016/04/05
428
0
Android也架构之一:白话软件设计中的六大原则

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

理工男海哥
2012/08/19
0
1
安得促席,说彼平生

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

阮一峰
2006/03/07
0
0
STL系列之四 heap 堆

下面再介绍STL中与堆相关的4个函数——建立堆make_heap(),在堆中添加数据push_heap(),在堆中删除数据pop_heap()和堆排序sort_heap(): 头文件 #include 下面的_First与_Last为可以随机访问...

彭博
2012/04/12
693
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt那些事0.0.15

以下与Q_DECLARE_METATYPE相关内容全部是翻译自Qt文档。参看QVariant Class | Qt Core 5.9以及QMetaType Class | Qt Core 5.9 QVariant QVariant::fromValue(const T& value) 返回一份包含v......

Ev4n
1分钟前
0
0
spring上传文件返回绝对路径,简单工具类

import com.google.common.io.Files;import lombok.extern.slf4j.Slf4j;import org.springframework.web.multipart.MultipartFile;import java.io.File;import java.io.IOExceptio......

Boss-x
12分钟前
1
0
1个开发如何撑起一个过亿用户的小程序

本文由云+社区发表 2018年12月,腾讯相册累计用户量突破1亿,月活1200万,阿拉丁指数排行 Top 30,已经成为小程序生态的重量级玩家。 三个多月来,腾讯相册围绕【在微信分享相册照片】这一核...

腾讯云加社区
19分钟前
3
0
golang ssh包使用方法介绍

在使用gexpect包发现很多问题之外,这里又尝试使用ssh user@127.0.0.1的思路进行用户切换。这里记录下具体的使用方法,遇到的ssh: must specify HostKeyCallback 问题的解法方法及最终使用过...

linuxprobe16
24分钟前
0
0
layer

Layui Layer在open弹出层中异步加载数据和form表单radio、checkbox、select不渲染,不可点击的解决办法 layer 实现弹窗提交信息 function confirmUpdateAward(i) { layer.open({ ...

mickelfeng
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部