# git 的基本概述

# 简介

  • git(分布式版本控制系统)

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

  • Linus  花了两周时间自己用 C 写了一个分布式版本控制系统,这就是 Git!一个月之内,Linux 系统的源码已经由 Git 管理了!牛是怎么定义的呢?大家可以体会一下。

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

  • 历史就是这么偶然,如果不是当年 BitMover 公司威胁 Linux 社区,可能现在我们就没有免费而超级好用的 Git 了。

# 集中式和分布式

  • Linux 旗下的 CVS 和 SVN 都是集中式的版本控制系统,但 git 是分布式的版本控制系统

  • 何为集中式版本控制系统?

    • 版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

    gitfunbu.jpg

# 何为分布式版本控制系统?

  • 分布式版本控制系统根本没有 “中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件 A,你的同事也在他的电脑上改了文件 A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

gitfenbu2.jpg

  • 集中式 VS 分布式

    集中式(SVN) 分布式(Git)
    是否有中央服务器 有。开发人员需要从中央服务器获得最新版本的项目然后在本地开发,开发完推送给中央服务器。因此脱离服务器开发者是几乎无法工作的 没有中央服务器,开发人员本地都有 Local Repository
    网络依赖 必须要联网才能工作,而且对网络的依赖性较强,如果推送的文件比较大而且网络状况欠佳,则提交文件的速度会受到很大的限制 分布式在没有网络的情况下也可以执行 commit 、查看版本提交记录、以及分支操作,在有网络的情况下执行 pushRemote Repository
    文件存储格式 按照原始文件存储,体积较大 按照元数据方式存储,体积很小
    是否有版本号 没有
    分支操作的影响 创建新的分支则所有的人都会拥有和你一样的分支 分支操作不会影响其他开发人员
    提交 提交的文件会直接记录到中央版本库 提交是本地操作,需要执行 push 操作才会到主要版本库

# git 的三种数据状态


# 暂存态

  • git 传输文件实际上是进行数据的传输,每个用户机都存在一个数据的暂存区(temp),当用户机没有网络时,可以在本地把要上传到本地数据库的文件数据先放到暂存区(temp),待网络通畅时 git 会自动提交数据到指定的本地数据库(仓库)。此状态为 ---- 已暂存(staged)状态

# 提交态

  • 当文件安全的保存到本地数据库时,此状态为 ---- 已提交(commit)状态

# 修改态

  • 若文件只是进行更改内容,但尚未保存到数据库中,那么此状态就为 ---- 已修改(modify)状态

# git 的工作原理


# 核心

  • git  的工作原理不同于集中式版本控制系统(CVCS),git 赋予每个用户机上一个本地数据库,此数据库可同步到服务器的数据库中,当用户对文件做每一次的修改时,会把该文件的所有版本文件保存到本地数据库(即克隆文件),这样做的好处是,当没有网络时,也可以对文件的版本进行控制,而且要修改时,把修改后的文件进行标记,待网络通畅后会把被标记的文件提交到数据库中,供其他开发者使用。

# 获取 Git 仓库

# 获取方式

  1. 将尚未进行版本控制的本地目录转换为 Git 仓库
  2. 从其它服务器 克隆 一个已存在的 Git 仓库

# 在已存在的目录中初始化仓库

  • 第一步:打开 git bash

  • 第二步:输入进入目录的命令

    $cd /f/gitproject
  • 第三步:初始化仓库

    $git init

此步骤会在已创建的目录下生成一个.git 的子目录(该目录为隐藏文件)

# 添加文件

# 创建文件

  • 方法一:在创建的 gitproject 目录下直接右键创建一个文件(例如:helloworld.java)

  • 方法二:在创建的 gitproject 目录下右键 git bash here ,使用命令创建

    $touch helloworld.java  //创建文件
    $git status //查看文件状态
  • 方法三:直接打开 git bash ,用 Linux 命令切换到 gitproject 目录下,输入方法二的命令即可!

    # 把文件放入暂存区

  • 通过 Linux 命令

    $git add helloworld.java
  • 此时再输入 git status 查看状态

    # 把文件提交到仓库

    $git commit -m"new file helloworld.java"

    (-m 为 message)

    # 查看是否已提交

    $git status

    如出现下图所示则提交成功

    gitcmd.jpg

# 克隆仓库

  • 命令
$git clone <url>

# 查看当前文件状态

  • 命令
$git status