本文属于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的三种状态
Git的三中工作区域
基本Git工作流程
初次运行前的配置
每台计算机上只需要配置一次,程序升级时会保留配置信息,也可以在任何时候再次通过运行命令来修改它们。Git自带一个git config的工具来帮助设置控制Git外观和行为的配置变量,这些变量存储在三个不同的位置:
每一个级别覆盖上一级别的配置,所以 .git/config的配置变量会覆盖 /etc/gitconfig 中的配置变量。
用户信息配置
设置用户名称和邮件地址,每一个Git的提交都会使用这些信息,并且它会写入到每一次提交中,不可更改:
$ git config --global user.name “Jhon Doe”
$ git config --global user.email [email protected]
当针对特定项目使用不同的用户名称和邮件地址时,可以在该项目目录下不使用参数 –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 init
该命令将创建一个名为 .git 的子目录,这个子目录含有初始化的Git仓库中所有的必须文件,这些文件时Git仓库的骨干,但是项目里的文件还没有被跟踪。可以通过git add命令来指定所需要跟踪的文件,然后执行git commit:
$ git add *.c
$ git add LICENSE
$ git commit -m “initial project version”
Git克隆的是该Git仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需要的文件。当执行git clone命令时,默认配置下远程Git仓库中的每一个文件的每一个版本都将被拉取下来:
$ git clone https://github.com/libgit2/libgit2
该命令会在当前目录下创建一个名为libgit2的目录,并在该目录下初始化一个 .git 文件夹,从远程仓库拉取下来所有数据放入**.git**文件夹内,然后从中读取最新版本的文件的拷贝。在克隆远程仓库的时候,自定义本地仓库的名字,使用如下命令:
$ git clone https://github.com/libgit2/libgit2 mylibgit
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 ..." 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 ..." 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 ..." to unstage)
new file: README
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." 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 ..." 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
忽略文件
创建一个名为.gitignore文件,列出要忽略的文件模式:
$ cat .gitignore
*.[oa]
*~
glob模式:*匹配零个或多个任意字符、[abc]匹配任何一个列在方括号中的字符、?匹配一个任意字符、[a-b]匹配两个字符范围内的单个字符、**匹配任意中间目录。