本文属于git工具系列中的第二章,主要记录了git工具如何进行配置,创建仓库等基本操作!
git起步
直接记录快照,而非差异比较
Git和其它版本控制系统(包括Subversion和近似工具)的主要差别是在于Git对待数据的方法。除Git之外的大部分系统以文件变更列表的方式存储信息,这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
Git把数据看作是对小型文件系统的一组快照,每次提交更新或者在Git中保存项目状态时,它主要是对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件,Git对待数据更像是一个快照流。
几乎所有操作都是本地执行
在Git中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其他计算机的信息。
Git保证完整性
Git中的所有数据在存储前都计算校验和,然后以校验和来引用,即不可能在Git不知情的情况下更改文件。【计算校验和的机制叫做SHA-1散列,hash(哈希),这是一个由40个十六进制字符(0-9和a-f)组成的字符串,基于Git中文件的内容和目录结构计算出来。】Git数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
Git的三种状态
- 已提交(committed):表示数据已经安全的保存到本地数据库中;
- 已修改(modified):表示修改了文件,但是还没有保存到数据库中;
- 已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中;
Git的三中工作区域
- Git仓库:用来保存项目的元数据和对象数据库的地方(最重要,克隆时的数据);
- 工作目录:对项目的某个版本独立提取出来的内容,这些从Git仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用和修改;
- 暂存区域:该部分是一个文件,保存了下次将提交的文件列表信息,一般在Git仓库目录中,也被称为索引;
基本Git工作流程
- 在工作目录中修改文件;
- 暂存文件,将文件的快照放入暂存区域;
- 提交更新,找到暂存区域的文件,将快照永久性存储到Git仓库目录;
初次运行前的配置
每台计算机上只需要配置一次,程序升级时会保留配置信息,也可以在任何时候再次通过运行命令来修改它们。Git自带一个git config的工具来帮助设置控制Git外观和行为的配置变量,这些变量存储在三个不同的位置:
- /etc/gitconfig或$HOME.gitconfig:包含系统上每一个用户及它们仓库的通用配置,如果使用参数--system的git config时,便会从次文件读写配置变量;
- /.gitconfig**或**/.config/git/config:只针对当前用户,使用参数--global时读写该文件;
- .git/config:针对该仓库;
每一个级别覆盖上一级别的配置,所以.git/config的配置变量会覆盖/etc/gitconfig中的配置变量。
用户信息配置
设置用户名称和邮件地址,每一个Git的提交都会使用这些信息,并且它会写入到每一次提交中,不可更改:
$ git config --global user.name “Jhon Doe”
$ git config --global user.email apple@apple.com
当针对特定项目使用不同的用户名称和邮件地址时,可以在该项目目录下不使用参数--global命令来配置。
文本编辑器
Git默认编辑器是vim,配置不同的文本编辑器:
$ git config –global core.editor emacs
检查配置信息
检查配置,使用以下命令来列出所有Git当时能找到的配置:
$ git config --list
结果中存在重复的变量名,因为Git会从不同的文件中读取同一个配置,这种情况下,Git会使用它找到的每一个变量的最后一个配置。通过输入git config
$ git config user.name
Jhon Doe
获取帮助
使用Git时需要帮助,有三种方法可以找到Git命令的使用手册:
$ git help <verb>
$ git <verb> --help
$ git git-<verb>
还可以尝试在Freenode IRC服务器(irc.freenode.net)的#git或#github频道寻求帮助。
git配置
获取git仓库
- 将已有项目或目录导入为Git仓库
使用Git来对已有项目进行跟踪,需要进入项目目录并输入:
$ git init
该命令将创建一个名为.git的子目录,这个子目录含有初始化的Git仓库中所有的必须文件,这些文件时Git仓库的骨干,但是项目里的文件还没有被跟踪。可以通过git add命令来指定所需要跟踪的文件,然后执行git commit:
$ git add *.c
$ git add LICENSE
$ git commit -m “initial project version”
- 从其他服务器克隆一个现有的Git仓库
Git克隆的是该Git仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要的文件。当执行git clone命令时,默认配置下远程Git仓库中的每一个文件的每一个版本都将被拉取下来:
$ git clone https://github.com/libgit2/libgit2
该命令会在当前目录下创建一个名为libgit2的目录,并在该目录下初始化一个.git文件夹,从远程仓库拉取下来所有数据放入.git文件夹内,然后从中读取最新版本的文件的拷贝。在克隆远程仓库的时候,自定义本地仓库的名字,使用如下命令:
$ git clone https://github.com/libgit2/libgit2 mylibgit
Git支持多种数据传输协议:
- https协议:https://github.com/**
- git://协议或SSH协议:user@server:path/to/repo.git
记录每次更新到仓库
工作目录下的每一个文件都不外乎两种状态:
- 已跟踪:指那些被纳入版本控制的文件,在上次的快照中有它们的记录;
- 未跟踪:指那些即不存在于上次快照的记录中,也没有被放入暂存区;
初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。编辑过某些文件之后,逐步将这些修改过的文件放入暂存区,然后提交所有暂存了的修改,如此反复。
检查当前文件状态
使用git status命令查看文件处于什么状态:
$ git status
On branch master
nothing to commit, working directory clean
在项目下新建文件:
$ echo “My Project” > README
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
新建的文件出现在Untracked files下面,指示未跟踪的文件,即未出现在上次快照中。
跟踪新文件
使用命令git add开始跟踪文件:
$ git add README
使用git status查看当前文件状态:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
只要在Changes to be committed这行下面,就说明时已暂存状态。如果此时提交,那么该文件的版本将被留存在历史记录中。git add命令使用文件或目录的路径作为参数,如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。
暂存已修改文件
修改一个已被跟踪的文件,e.g.:修改一个名为CONTRIBUTING.md的已被跟踪的文件,然后运行git status命令:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
文件CONTRIBUTING.md出现在Changes not staged for commit这行下面,说明已跟踪文件的内容已经发生了变化,但是还没有放在暂存区。git add命令可以开始跟踪新文件、把已跟踪文件放到暂存区、用于合并时把有冲突的文件标记为已解决状态等,该命令理解为“添加内容到下一次提交中“。
$ git add CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
文件可以同时出现在暂存区和非暂存区,提交的版本为最后一次运行git add命令时的版本。
状态简览
使用git status -s或git status --short命令可以得到更为紧凑的格式:
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
- ??:新添加的未跟踪文件
- A :新添加到暂存区中的文件
- M:该文件被修改了但是没有被放入暂存区
- M :该文件被修改了并放入了暂存区
- MM:该文件被修改并提交至暂存区后又在工作区倍修改了
忽略文件
创建一个名为.gitignore文件,列出要忽略的文件模式:
$ cat .gitignore
*.[oa]
*~
- 所有空行或以#开头的行都会被忽略
- 可以使用标准的glob模式匹配
- 匹配模式可以以/开头防止递归
- 匹配模式可以以/结尾指定目录
- 要忽略指定模式意外的文件或目录,可以在模式前加上!取反
glob模式:*匹配零个或多个任意字符、[abc]匹配任何一个列在方括号中的字符、?匹配一个任意字符、[a-b]匹配两个字符范围内的单个字符、**匹配任意中间目录。