Git初识

1、何为版本控制?

 

版本控制用于记录某个文件或记录的变化情况,包含增删改操作记录,以备在代码丢失、错误等情况下,查询特定版本文件或记录的系统。

版本控制可以应用在许多方面,例如:源代码版本控制、书本内容版本控制等。只要涉及需要记录修改版本记录的场景,都可以使用版本控制。

常见的版本控制现在主要分为本地版本控制、集中式版本控制、分布式版本控制,其中本地版本控制不能用于团队协作,其他两种可以用于团队协作中使用。本地版本控制就是在本地计算机中保存记录的变换信息,如常见的为不同版本的文件按照时间或版本命名。集中式版本控制使用C/S模式,即记录的完整修订信息保存在集中资源服务器中,每个需要获取或提交的客户端可以从中央服务器中拉取或提交修订记录。分布式版本控制和集中式分布式版本控制类似,只不过不存在依赖性强的中央服务器,每个客户端和服务器都保存有完整的记录修订信息,不会存在单点故障的问题。

常见的版本控制系统如下:

  • 集中式版本控制系统:CVS、SVN(Subversion)
  • 分布式版本控制系统:Git、BitKeeper

 

2、Git介绍

 

Git是一款由linus等开发的开源的分布式版本控制软件,最早用于linux内核开发项目的版本管理。Git最大的区别和优势在于分布式,使用Git的每个开发者机器上都有完整的项目拷贝,可以在其他机器故障时,通过使用任何一台正常的开发者机器上的项目拷贝复原丢失的项目。

Git具有如下特点:

  • 支持离线工作,git中的操作几乎可以本地执行。可以先暂时本地提交,待网络恢复后,即可同步
  • 使用40位的哈希值标识版本号,hash值根据内容产生对应的SHA-1值,不是很直观
  • 占用空间大,由于每个开发者机器上都存有项目拷贝
  • 项目维护操作基于命令行,学习成本较高
  • 相比其他版本控制系统,git操作速度快
  • git完整记录修订后的资源,而其他版本控制系统如svn采用差异比较,只记录不一样的部分

Git的三个状态和三个操作区域

Git中的资源存在三种状态:已修改、已暂存、已提交

这三个状态分别对应三个区域:工作目录、暂存区、Git仓库

示意图如下所示:

clipboard

2.1 Git工作示意图

一般的开发过程是:

首先,开发者从项目代码仓库服务器中,拉取代码至本地机器上,然后修改某些代码文件,这些文件就变成了已修改的状态,然后先将已修改的文件加入到暂存区中,此时这些文件的状态是已暂存,最后将这些文件提交到本地git仓库中,此时这些文件的状态是已提交,后面我们就可以将累积的提交分支合并或推送到远端代码服务器。

我们使用Git的目的是用来在团队中管理代码版本,团队中会有不同的人每时每刻提交不同的代码版本,如何记录和协调这些提交,就是Git的工作。一般地,一个团队的项目会存储在一个远端中央服务器中,初进入团队的新人需要将代码从远程代码仓库中拉取到本地开发机器上,然后再进行修改体提交,最后推送合并到远端仓库,这样一个人提交的修改就能被团队中的其他人看到。

在本地和远端,仓库的表现形式是和项目工程在同一目录的.git目录,.git目录中主要记录了每次的提交记录,其具体子目录如下图所示。

clipboard

图2.2 Git安装目录

核心是objects和refs文件夹,objects文件夹记录了提交记录对象,refs文件夹记录指向提交记录对象的引用head。

 

3、Git的使用全过程

 

1. 初始代码仓库获取

一般地,我们开发的项目要么从远程仓库服务器拉取,要么从本地创建,然后上传到远程仓库服务器。

  • 从远程仓库拉取

使用 git clone 命令完成,该命令会将指定的地址对应的远程仓库代码的所有信息拉取到本地当前目录。

// git clone 命令有两个参数,分别是远程代码仓库地址url和自定义的本地仓库名
// 其中url可以使用各种形式,现在主要有http[s]、git、ssh等
git clone [url] [custom-repo-name]
  • 从本地现有仓库初始化

使用 git init 命令完成,需要先进入本地项目目录,然后执行该命令,就会在和项目同一目录下创建一个.git目录用于保存git仓库的所有信息。但是,该命令只是在项目目录下初始化了仓库,还没有开始跟踪项目中的文件,需要使用 git add 命令开始跟踪项目中的某些文件,只有开始跟踪后,才能提交。

2. 跟踪提交更新

严格上来说,代码文件应该还有一个状态,是未被跟踪。git文件的四个状态转换图如下图所示。

clipboard

图3.1 Git文件的四个状态变化

git中文件无外乎两种状态,已跟踪和未跟踪。已跟踪代表文件已纳入版本控制中,以后对其的所有修改都会被记录,而未被纳入版本控制的文件就是处于未跟踪状态。初始的从远程仓库clone的代码仓库中的所有文件都是已跟踪和已提交(未修改)。之后,我们可能需要修改其中的一部分文件,此时这些修改的文件处于修改状态,然后需要使用add命令将其加入到暂存区中,加入暂存区后,文件处于staged状态,然后就能使用commit命令将其提交到本地仓库中,此时文件处于已提交状态。最后就能将提交push到远端。

// 跟踪未纳入版本控制的文件或将修改的文件加入到暂存区中
// 该命令的本质是将文件的更新加入到下一次提交中
git add file-name
// 将所有文件暂存起来
git add .
// 提交暂存区中的文件
// 本质上提交的是执行git add后的文件版本
git commint [-m commit-message]
// 跳过暂存add命令,直接将所有文件暂存并提交
git commit -a
// 将当前暂存区中的内容和上一次提交合并为新的一次提交
git commit --amend
// 常用命令
// 查看工作区和暂存区的文件状态
git status [-s || --short]
// 查看尚未暂存的文件的修改具体内容
git diff
// 查看已经暂存的文件修改变化,即每次add操作的文件变化
git diff --cached
// 移除文件
// git移除,其中-f用于强制移除,一般用于文件被暂存的时候
git rm -f file-name
// git未删除,只是将文件恢复到不被git跟踪的状态
git rm --cached file-name
// 物理移除,git依旧会产生deleted修改记录
rm [-f] file-name
// 取消暂存的文件
git reset HEAD file-name

// 移动文件,即更名
git mv old-file-name new-file-name

// 查看项目提交记录
// -p 用于显示每次提交的差别,即改动的内容
// -2 用于显示最近的2次提交
// --stat 用于显示提交的改动统计信息
git log [-p | -2 | --stat | --pretty=oneline|short|full|fuller]

// 查看远程服务器的简写, -v 用于指出远程服务器对应的url
git remote [-v]
// 查看某个远程服务器的信息
git remote show remote-name

// 推送提交到远程
git push remote-name remote-branch

 

 

最后强烈推荐一个非常好的在线git学习网站

https://learngitbranching.js.org/

posted @ 2019-11-07 22:35  锢浪熟阳  阅读(158)  评论(0编辑  收藏  举报