Git 基础知识
本文记录了一些 Git 相关的基本知识,内容主要来自 《Pro Git 》这本书。
Git 简介
版本控制系统是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
Git 是目前世界上最先进的分布式版本控制系统(没有之一)。
Git的特点
- 直接记录快照,而非差异比较。每次提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。
- 近乎所有操作都在本地执行。在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。
- Git 保证完整性。Git 中所有数据在存储前都计算校验和,然后以校验和来引用。Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。
- Git 一般只添加数据。
三个工作区域
Git 仓库有三个工作区域:工作目录(工作区)、仓库目录、暂存区。
工作目录(工作区)是对项目的某个版本独立提取出来的内容,这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改,工作目录可以简单理解为在本地开展工作的目录,所有在这个目录(子目录)里的文件都会被 Git 管理,文件在此目录下(或子目录下)才能添加或提交到仓库。
仓库目录是 Git 用来保存项目的元数据和对象数据库的地方,是在工作目录中一个叫 .git
的隐藏目录。这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。
暂存区是一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录 .git
中,按照 Git 的术语叫做“索引”,不过一般说法还是叫“暂存区”。
三种状态
Git 有三种状态:已提交(commited)、已修改(modified)、已暂存(staged)。
- 已提交表示数据已经安全的保存在本地数据库中;
- 已修改表示已经修改了文件,但还没保存到数据库中;
- 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
除了这三种状态之外,还有一种特殊的状态:未跟踪(untracked)状态。未跟踪是指文件虽然在工作目录中,但并没有纳入 Git 的管理(Git 虽然知道这个文件的存在,但并不会跟踪它版本的变化),比如新建的文件还没有提交过,就是未跟踪状态,或者在一个非空的目录里初始化仓库(见下文“获取 Git 仓库”部分),那么在第一次提交之前,原先的内容都处于未跟踪状态。
Git 基本工作流程
- 在工作目录中修改文件。
- 暂存文件,将文件的快照放入暂存区域。
- 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
Git 基础
安装 Git
在Linux系统中,先试着输入 git
,查看系统有没有安装 Git,如果没有安装,使用以下命令进行安装:
sudo apt install git-all # 基于 Debian 的发行版使用此项,如 Ubuntu
或:
sudo dnf install git-all # 基于 RPM 的发行版使用此项,如 Fedora、CentOS 或 RHEL
此命令适用于较新版本的 Debian 或 Fedora Linux,其它 Linux 版本,可以直接通过源码安装。
在 Mac Os 系统中,有多种方法安装 Git,最简单的方法是安装 Xcode Command Line Tools。 Mavericks (10.9) 或更高版本的系统中,在 Terminal 里尝试首次运行 git 命令即可。
git --version
如果没有安装过命令行开发者工具,将会提示安装。
也可以通过 homebrew 安装(需先安装 Homebrew):
brew install git
在 Windows 系统中,可以从 Git 官网直接下载安装程序,然后按默认选项安装即可。
初步配置 Git
安装好 Git 后,还需要对 Git 环境进行初步的配置。
Git 自带一个 git config
的工具来帮助设置控制 Git 外观和行为的配置变量。这些变量存储在三个不同的位置:
/etc/gitconfig
文件: 包含系统上每一个用户及他们仓库的通用配置。要读写此文件的配置变量,需使用--system
参数。~/.gitconfig
或~/.config/git/config
文件:此文件中的配置只针对当前用户。要读写此文件的配置变量,需使用--global
参数。- 当前使用仓库的 Git 目录中的
config
文件(也就是.git/config
):此文件中的配置只针对该仓库。
每一个级别覆盖上一级别的配置,比如 .git/config
的配置变量会覆盖 /etc/gitconfig
中的配置变量。
配置用户信息
安装完成之后,第一件事是配置用户名和邮件地址:
git config --global user.name "your name"
git config --global user.email "email@example.com"
因为 Git 是分布式版本控制系统,支持多人协作开发,所以,每个用户提交时都必须自报家门:用户名和 Email 地址。
注意这里 git config
命令的 --global
参数,用了这个参数,表示当前用户下的所有仓库都使用这个用户名和 Email 地址,当然也可以对某个仓库指定不同的用户名和 Email 地址,只需要在目标仓库下去掉 --global
参数运行上面的命令。
配置文本编辑器
Git 需要用户输入信息时会调用文本编辑器,默认是和操作系统一致,通常是 Vim,但如果不想使用默认的文本编辑器,也可以进行设置:
git config --global core.editor emacs
这一命令把默认的文本编辑器更改为了 emacs,并且应用到当前用户所有仓库。
检查配置信息
git config --list
这个命令会列出所有 Git 当时能找到的配置。
git congfig <key>
这个命令会检查 Git 的某一项配置 <key>
,如检查用户名的配置:
git config user.name
Git 会从多个配置文件中读取同一配置变量的不同值并把它们都显示出来,有时可能会显得混乱,使用 --show-origin
查找最后设置某个配置变量的配置文件。
git config --show-origin <key>
这个命令会检查 Git 的某一项配置 <key>
的原始值,会显示哪一个配置文件最后设置了该值。
获取帮助
git help <verb>
git <verb> --help
man git-<verb>
以上三个命令都可以获得 Git 命令的使用手册,比如获取 config
命令的使用手册:
git help config
获取 Git 仓库
Git 仓库,英文名 repository,可以简单理解成一个目录,这个目录里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
在已存在的目录中初始化仓库
首先,选择一个合适的地方,创建一个空目录,并进入这个目录,如:
mkdir learngit
cd learngit
pwd
pwd
命令用于显示当前目录。
第二步,通过 git init
命令把这个目录变成 Git 可以管理的仓库(初始化仓库):
git init
初始化仓库后,可以看到仓库目录中多了一个 .git
的隐藏目录,这个目录就是 Git 用来跟踪管理仓库的,里面含有 Git 所需的必要文件。
- 注意在 Windows 系统中,为避免出现各种问题,目录名(包括父目录)最好不要包含中文。
- 最好不要使用 Windows 自带的记事本编辑任何文本文件,可能会带来换行的混乱。
- 也不一定必须在空目录下初始化仓库,选择一个已经有内容的目录也是可以的,在这种情况下,目录里的原内容都将处于未跟踪状态,需要手动添加到 Git 仓库中(见下文“暂存和提交”部分)。
克隆现有仓库
在多人协作的情况下,可能并不需要从零开始初始化仓库,而是直接克隆远程仓库到本地,直接开始工作,使用以下命令将远程仓库克隆到本地:
git clone <remote-url>
这个命令会在本地创建一个跟远程仓库重名的本地仓库,并将远程仓库的所有数据抓取到 .git
子目录下,将最新版本的文件拷贝到工作区。
remote-url
是指远程仓库的路径,一般有两种情况,分别是从本地主机克隆和从网络主机克隆,如果是从本地主机克隆仓库,命令就是:
git clone file:///path/to/myproject.git
如果是从网络主机克隆,命令就是:
git clone [user@]server:/path/to/myproject.git # 使用 SSH 协议
或:
git clone https://example.com/path/to/myproject.git # 使用 HTTPS 协议
也可以在克隆时,自定义本地仓库的名字:
git clone <remote-url> <repo-name>
暂存和提交
Git 并不会主动将文件纳入 Git 的管理,需要手动将文件添加到仓库,先要把文件放到工作目录下(子目录也可以),此时文件就处于未跟踪状态,然后分两步进行:
第一步,用命令 git add
告诉 Git,把文件添加到暂存区:
git add <file>/<directory>
这个命令使用文件或目录作为参数,如果参数是目录,该命令将递归地跟踪该目录下的所有文件。
第二步,用命令 git commit
告诉 Git,把文件提交到仓库:
git commit -m "message"
-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样就能从历史记录里方便地找到改动记录,如果在运行 git commit
命令时不加 -m
参数,Git
就会打开一个文本编辑界面ÿ