Git 小记
Git 是目前最流行的分布式版本控制系统(Distributed Version Control System, DVCS),类似的工具还有 Mercurial(由 hg 命令操作)等;在早期,人们常使用集中式版本控制系统(Centralized Version Control System,CVCS),其典型有 CVS、Subversion(SVN)等;现在,越来越多的人开始使用更为优秀的分布式版本控制系统,所谓版本控制,即可以随时记录并切换文件的不同版本。
安装
配置
Git 共有 3 个配置文件,分别是:
/etc/gitconfig文件用于配置所有用户的配置信息,使用git config --system命令配置- 某个用户家目录下的
.gitconfig文件只适用于该用户,使用git config --global命令配置 - 当前 Git 仓库的
.git/config仅针对当前项目,直接使用git config命令进行配置
注意:每一个级别会覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。
按照个人偏好,针对新安装的 Git 环境,会配置如下信息:
1 | # 配置提交时使用的用户名和邮箱,必须配置 |
另外,Git 默认使用的编辑器是 Vim,若要配置成自己喜欢的编辑器(如 Emacs),可使用命令:git config --global core.editor emacs。
最后,你可以使用 git config --list 来查看所有配置信息。
代理
git 的代理配置相对复杂,其取决于所使用的协议。如果某个仓库使用 HTTPS 协议拉取或推送,则它内部使用的是 curl 来执行这些操作,因此可以通过配置 Shell 代理来实现 git 的代理。详细可参考 关于 Windows 的代理设置。如果某个仓库使用 Git 协议拉取或推送,则它内部使用的是 ssh 来执行这些操作,可以参考下面的配置设置代理:
1 | # 在 Windows PowerShell 中设置 SOCKS 代理 |
结构
要开始对某个项目进行版本控制,需要先在其所在路径下执行 git init 进行初始化,此命令会在当前路径下创建一个 .git 的隐藏文件夹,这就是 Git 仓库目录。
Git 分为 3 个区域,Git 仓库、工作目录、暂存区域:
- Git 仓库目录(Repository)是 Git 用来保存项目的元数据和对象数据库的地方。这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。
- 工作目录(Working directory)是对项目的某个版本独立提取出来的内容。这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
- 暂存区域(Staging area)是一个文件,保存了下次将提交(commit)的文件列表信息,一般在 Git 仓库目录中。有时候也被称作“索引”,不过一般说法还是叫暂存区域。
基本的 Git 工作流程如下:
- 在工作目录中修改文件。
- 暂存文件,将文件的快照放入暂存区域。
- 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
根据 Git 的三个区域,一个文件可以有如下几种状态:
- 未跟踪状态(untracked):指新创建且还没有添加到暂存区域的文件
- 已暂存状态(staged):指已经添加到暂存区域的文件
- 已提交状态(committed):指已经从暂存区提交到 Git 仓库的文件
- 已修改状态(modified):指作了修改但还没有放到暂存区域的文件
分支
每一次提交都是文件的一个版本,可以将这一系列提交看作一条链表,链表的头指针(HEAD)始终指向最新的提交,即最新的版本。要检出到某一版本,本质上是将 HEAD 指针指向某一提交。链表中的节点(即提交)都有唯一的父节点和唯一的子节点,Git 中分支(branch)的本质就是将链表变为树。当使用 git init 初始化 Git 仓库时,会默认创建 master 分支,这种一个分支等价于一条链表。
使用 git branch 可列出所有分支,使用 git branch dev 即可在当前提交点创建新分支 dev,接着使用 git checkout dev 即可切换到 dev 分支,或者直接使用 git checkout -b dev 即可一步创建并切换到 dev 新分支。
命令
git version:查看 Git 版本信息git add test1.txt:将需要被追踪的文件(test1.txt)添加到暂存区域git reset test2.txt:将误被追踪的文件(test2.txt)移除出暂存区域,文件仍会存在于工作目录git commit -m 'first commit':将暂存区域的内容提交到本地仓库,参数-m指定提交时的附带信息,若不带参数-m执行此命令则会自动打开默认的 Vim 编辑器并要求输入附带信息git push:将本地仓库推送到远程仓库git clone:将远程仓库克隆到本地git pull:将远程仓库的更新拉取到本地仓库git status:查看 Git 仓库状态git log:查看 commit 记录,参数--graph可以图形化显示,参数--oneline可以一行显示。git diff:对比工作目录和暂存区域中文件之间的不同git diff --staged:对比暂存区域和 Git 仓库中最新 commit 文件之间的不同git diff <first-commit-id> <second-commit-id>:对比 Git 仓库中两个 commit 之间的不同,参数为两个 commit ID,为方便可以取 ID 的前 7 个字符git checkout <commit-id>:切换到某个具体的 commit,要切换回最新的 commit 可使用git checkout master
.gitignore
思想
直接记录快照,而非差异比较:Git 与其他版本控制系统的主要区别在于对待数据的方法,其他的 VCS 主要记录不同版本之间的差异,而 Git 则相当于直接记录不同版本的快照。
近乎所有操作都是本地执行:在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。
Git 保证完整性:Git 中所有数据在存储前都计算校验和(SHA-1),然后以校验和来引用。这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。若你在传送过程中丢失信息或损坏文件,Git 就能发现。
Git 一般只添加数据:你执行的 Git 操作,几乎只往 Git 数据库中增加数据。很难让 Git 执行任何不可逆操作,或者让它以任何方式清除数据。
原理
GitHub
应明确一点,Git 是由 Linux 创始人 Linus Torvalds 开发的分布式版本控制系统,而 GitHub 是使用 Git 实现的代码托管网站,两者并非一类。
更多
在命令行中直接输入 git,可查看相关命令,要具体查看某个命令的帮助信息,可输入 git help <command>,如 git help diff,要了解更多关于 Git 的内容,可以参考《Pro Git》一书。