前言

git 安装

  • Linux

    # Fedora
    sudo yum install git
    # Debian
    sudo apt-get install git
    sudo apt-get install gitk git-gui
    # 源码安装,[下载地址](http://git-scm.com/download)
    sudo apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
    export GIT_VER=2.0.0
    wget https://www.kernel.org/pub/software/scm/git/git-$GIT_VER.tar.gz
    tar -zxf git-$GIT_VER.tar.gz
    pushd git-$GIT_VER
    make prefix=/usr/local all
    sudo make prefix=/usr/local install
    popd
    
  • Windows

  • Mac

git 配置

git 帮助

  • 有三种命令可以找到 git 命令的使用手册
    • git help <verb>
    • git <verb> --help
    • man git-<verb>
    • git help config # 查看 config 命令的手册

git 基础

git 仓库、工作目录、暂存区域、文件状态

  • git仓库:git 用来保存项目的元数据和对象数据库的地方
  • 工作目录:对项目的某个版本独立提取出来的内容. 是从 git 仓库的压缩数据库中提取出来的文件, 放在磁盘上使用或修改
  • 暂存区域(索引):一个文件, 保存了下次将提交的文件列表信息, 一般在 Git 仓库目录中
  • 基本的 Git 工作流程如下:
    • 在工作目录中修改文件
    • 暂存文件, 将文件的快照放入暂存区域
    • 提交更新, 找到暂存区域的文件, 将快照永久性存储到 git 仓库目录
  • 文件状态:git-文件的状态变化周期
    • 已提交状态(commited):git 目录中保存着的特定版本文件
    • 已暂存状态(staged):作了修改并已放入暂存区域
    • 工作目录下的每一个文件都属于已跟踪(tracked)或未跟踪(untracked),已跟踪的文件状态可处于未修改(unmodified)、已修改(modified)或已放入暂存区(staged)

初始化版本库

新建版本库

# 确定版本库目录
mkdir dirname
pushd dirname
# 生成 .git 目录以及其下的版本历史记录文件, push 时易出现冲突
git init
# 创建一个裸仓库, 只保存git历史提交的版本信息, 不允许用户在上面进行各种 git 操作
git init --bare

克隆版本库

  • 自动将其添加为远程仓库并默认以 “origin” 为简写
  • 自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支

    # 1 使用 ssh 协议克隆
    # 1.1 默认本地仓库名字和远程仓库相同
    git clone git@github.com:tensorflow/tensorflow.git
    # 在当前目录下创建 tensorflow 目录, 并在这个目录下初始化一个 .git 文件夹,
    # 从远程仓库拉取下所有数据放入 .git 文件夹, 然后从中读取最新版本的文件的拷贝
    # 1.2 自定义本地仓库的名字克隆
    git clone git@github.com:tensorflow/tensorflow.git MyTensorflow
    # 2 使用 HTTPS 协议克隆
    git clone https://github.com/tensorflow/tensorflow.git
    

版本库目录 .git

文件(夹)名 描述
HEAD 指向最新提交
config 项目的配置信息, git config 命令会改动它
description 项目的描述信息
hooks 系统默认钩子脚本目录
index 索引文件,记录统计版本库的每个文件,如大小、创建时间和最后修改时间,对比当前统计信息和索引确定文件是否被修改
logs 各个 refs 的历史信息
objects git 本地仓库的所有对象(commits, trees, blobs, tags)
refs 标识项目里的每个分支指向了哪个提交(commit)

blob 对象

  • git 基于“内容寻址”:文件不是按照文件名存储,而是按照包含内容的哈希值,存在一个叫“blob 对象”的文件中
  • 可以把文件内容的哈希值看做一个唯一 ID
  • blob 对象存储文件内容,与文件名无关

tree 对象

  • tree 对象:一组包含文件类型、文件名和哈希值的数据
  • tree 对象存储文件名

commit 对象

  • commit 对象存储提交信息及其创建的日期和时间
  • commit 对象是原子性的,即一个提交不会部分地记录变更

常用 git 命令

git 服务器

  • 协议
    • 本地协议: 远程版本库就是硬盘内的另一个目录. 常见于团队每一个成员都对一个共享的文件系统(例如一个挂载的 NFS)拥有访问权, 或者比较少见的多人共用同一台电脑的情况
    • git clone /opt/git/project.git # Git 会尝试使用硬链接(hard link)或直接复制所需要的文件
    • git clone file:///opt/git/project.git

参考网站

好玩的网站

相关