这个系列从<<Pro Git>>这本书学习Git。
Git是分布式的版本控制系统,clients完全mirror repository。每个checkout是所有数据的完全备份。
Git的黑历史 (:- 跳过)。
如果没了解Git的基本思想,那使用起来可能有很多困惑。
很多系统按基于base version的改变存储数据。Git不是这样的,Git认为数据是一个小文件系统的快照集,每次commit,git给所有文件拍个照。出于效率考虑,如果文件没有改变,Git不会再次存储文件,只是链接之前的文件。
大多数Git操作只需要本地文件和资源,因为Git是分布式的。例如,浏览项目的历史不需要查询服务器。没有网络的时候,也可以commit。
Git中的一切在存储时都是check-summed。Git使用SHA-1算法,结果是一个40个字符的字符串,使用16进制字符。会计算文件的hash,目录结构的hash。hash在Git中无处不在,实际上,Git在其数据库中,不是根据文件名存储的,而是它内容的哈希值。
文件有3个主要状态:committed, modified, staged.
Committed意味着数据已经安全的提交到本地数据库。
Modified意味着你改变了文件内容,但还没有提交到本地数据库。
Staged意味着你标记了当前版本一个修改的文件到下次提交的快照。
这导致Git有3个主要的sections:Git directory, working directory and the staging area.
Git directory是Git存放元数据和目标数据库的地方。是Git最重要的部分,也是你clone repository时拷贝的部分。
Working directory是项目某个版本的单个checkout。这些文件从Git directory中的压缩数据库中pulled out,放在磁盘中供你使用和修改。
Staging area是一个简单的文件,通常包含在Git directory中,存储你下一次将要提交的信息。
基本的Git工作流(workflow)看起来向这样:
修改工作目录的文件。
stage the files, adding snapshots of them to your staging area.
commit,将staging area中的快照存储到Git directory。
安装(跳过)。
Git有一个配置工具:git config。Git的配置变量存储在下列3个不同的地方。
/etc/gitconfig 包含对所有用户及它们的仓库的配置,当使用git config的--system选项,配置的变量在这个文件。
~/.gitconfig 当前用户的配置,--global选项,对应这种配置。
git目录 (.git/config),是每个仓库对应的配置。
后一个配置覆盖前一个配置。
安装Git后的第一件事,是设置user name和e-mail address。每次git commit都使用这个信息,而且它永恒地嵌入到那次提交。通常将user name和e-mail放入global配置中:
1 2 | $ git config --global user.name 'Herbert Yuan' $ git config --global user.email 'yuanjp@hust.edu.cn' |
配置默认编辑器
1 | $ git config --global core.editor vim |
配置差异比较工具
1 | $ git config --global merge.tool vimdiff |
使用--list选项,列出所有的变量,一个变量可能出现多次(不同的配置级别),后出现的覆盖前面的。
1 2 3 4 5 | $ git config --list user.name=Herbert Yuan user.email=yuanjp@hust.edu.cn core.editor=vim merge.tool=vimdiff |
要检查Git使用的某个变量的值:
1 2 | $ git config user.name Herbert Yuan |
有下面3种方式获取任何Git命令的manual page (manpage):
1 2 3 | $ git help <verb> $ git <verb> --help $ man git-<verb> |
如
1 | $ man git-config |