Git学习(一)

一、Git简介

Git是目前世界上最先进的分布式版本控制系统(没有之一)。

很多人都知道,Linus在1991年创建了开源的Linux,从此Linux系统不断发展,已经成为最大的服务器系统软件了。

Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的。这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?

事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!

你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。

不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了。于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。

安定团结的大好局面在2005年被打破了。开发Samba的Andrew试图破解BitKeeper的协议,被BitMover公司发现了,于是BitMover公司怒了,要收回Linux社区的免费使用权。

Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了。

Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery、PHP、Ruby等。

二、Git的特点

1. 集中式 vs 分布式

集中式版本控制系统(CVCS)

集中化的版本控制系统如CVS、Subversion以及Perforce等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。

缺点:

  • 中央服务器的单点故障:如果宕机一小时,谁都无法提交更新

  • 如果中央服务器的磁盘发生故障,碰巧没做备份,就会有丢失数据的风险

  • 最坏的情况是彻底丢失整个项目的所有历史更改记录

分布式版本控制系统(DVCS)

分布式版本控制系统会把服务器上的代码仓库完整地镜像下来。这样每个人的电脑上都有一份完整的服务器代码仓库的镜像,任何一处协同工作用的服务器发生故障,事后都可以用个人的电脑上的镜像恢复。

2. 版本存储方式的差异

直接记录快照,而非差异比较

Git和其他版本控制系统的主要差别在于,Git只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。

  • 其他系统:在每个版本中记录着各个文件的具体差异

  • Git:每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。若文件没有变化,Git不会再次保存,而只对上次保存的快照作一链接。

3. 近乎所有操作都是本地执行

在Git中的绝大多数操作都只需要访问本地文件和资源,不用连网。

  • 浏览项目的历史更新摘要,Git直接从本地数据库读取

  • 查看当前版本和一个月前版本的差异,Git取出快照作差异运算

  • 在飞机或火车上也可以愉快地频繁提交更新,等到了有网络的时候再上传到远程仓库

三、Git的安装

Git支持Linux、Windows和Mac系统,安装Git可以到Git官方网站直接下载安装程序。

四、Git仓库的基本概念和流程

什么是版本库?

版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件"还原"

Git仓库基本概念

远程仓库( Remote ):

也叫作资源库,是远程机器上的代码库,用于做不同版本库文件交换更新。如Gitlab,GitHub,gitee。

本地库( Repository ):

是用户在本地创建的目录,拥有远程库的一个快照,由工作区和版本库构成。

  • 工作区(Workspace ):

本地库的根目录中除.git目录以外的内容,存储内容的实际文件。

  • 暂存区(stage/Index ):

也叫做缓存区,暂存信息存放在.git目录"下的index文件(.git/index)中,用于临时保存内容的修改;

  • 版本库(.git 目录)

是本地库的根目录中的一个隐藏目录.git,用于记录版本信息,Git进行版本控制所需要的文件,则都放在.git文件夹中;

相关推荐
问心无愧05138 小时前
ctf show web入门96
笔记
三品吉他手会点灯8 小时前
C语言学习笔记 - 36.数据类型 - 为什么需要输出控制符
c语言·开发语言·笔记·学习
xiaoyuchidayuma8 小时前
【AnythingLLM接入硅基流动的DeepSeek R1大模型API】
笔记
吃好睡好便好8 小时前
在Matlab中绘制非默认峰值图
开发语言·学习·算法·matlab
sheeta19988 小时前
LeetCode 每日一题笔记 日期:2026.05.18 题目:1345. 跳跃游戏 IV
笔记·leetcode·游戏
问心无愧05138 小时前
ctf show web入门98
android·前端·笔记
Tutankaaa8 小时前
2025年知识竞赛行业趋势报告:智能化、场景化与生态融合
经验分享
Mr YiRan9 小时前
Android构建优化:基于Git Diff+TaskGraph
android·git·elasticsearch
想七想八不如114089 小时前
markdown笔记(没找到合适笔记软件,暂存)
笔记·目标检测