简介
Git 和其它版本控制系统(包括 Subversion 和近似工具)的主要差别在于 Git 对待数据的方法。
大部分版本控制系统,例如(CVS、Subversion、Perforce、Bazaar 等等),采用增量文件系统,存储每个文件版本的差异;
Git 更像是把数据看作是对小型文件系统的一组快照。 每次你提交更新,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件;如果文件发生修改,Git 将存储该文件全部内容。

存储原理
目录结构
1 | sudo apt-get install tree #安装tree命令 |
1 | tree .git |
object对象
object对象包括Blob对象、Tree对象与Commit对象,对象的所有索引全部采用哈希值进行索引。
Blob对象:二进制数据块存储文件的内容,如果两个文件在同一个版本仓库中,那么它们将会共享同一个blob对象,例如文件夹e8中的文件4551234f24b6da002d962a26c2495ea16a425f其中存储的便是文件内容。Tree对象:存储目录结构,指向其他tree对象或blob对象。Commit对象:用于存储版本信息,tree存储tree SHA1签名;parent存储上一个版本的commit SHA1签名;author,作者的信息;committer实际提交者的信息

git指针
主要介绍refs/heads、refs/tags、refs/remotes、HEAD、ORIG_HEAD等
HEAD:本地库的HEAD,保存refs/中的文件。例如refs/heads/masterORIG_HEAD:当进行一些有风险的操作的时候,如reset、merge或者rebase,Git会将HEAD原来所指向commit对象的sha-1值存放于ORIG_HEAD文件中。也就是说ORIG_HEAD可以让我们找到进行最近一次危险操作之前的HEAD位置可以使用
git reset --hard ORIG_HEAD回退到上一次reset之前。refs/heads:存储各个分支信息,保存有commit SHA1签名refs/tags:存储各个tag信息,保存有commit SHA1签名refs/remotes/repertoryName/HEAD:远程库的当前分支refs/remotes/repertoryName/remoteBranchName:远程仓库对应分支最后一次commit
HEAD里面的内容是当前的ref,而当前ref的内容是commit SHA1, commit 对象内容是tree SHA1, tree对象的内容是文件夹/文件信息,而blob对象存储着文件的具体内容。

命令
git add
将文件添加进暂存区,将文件保存为blob对象存储在object目录下,但并不会创建tree对象与commit对象,而是更新index文件(即暂存区)。
git commit
生成tree对象与commit对象,存储版本信息。tree对象用于记录目录信息,将暂存区(index文件)转换为tree对象;commit对象用于记录版本信息,指向tree对象。移动指针,并更新refs\heads、refs\tags里的commit SHA1签名,与当前HEAD的信息。
本地分支
| 命令 | 注释 | 备注 |
|---|---|---|
branch |
创建分支 | \ref\heads创建分支 |
check out |
切换分支 | 将HEAD指针指向另一个本地分支。 |
merge |
合并分支 | 将出现分叉提交的分支整合在一起时 |

远程分支
| 命令 | 注释 | 备注 |
|---|---|---|
git clone |
克隆 | 远程下载 |
git fetch |
获取 | 将远程内容下拉到本地版本库 |
远程仓库,并且有一些提交记录 。拉取下来

其他人提交了一些修改至远程仓库

你在本地分支上继续开发

你进行拉取你本地没有的数据

变基合并
创建了一个特性分支 server,为服务端添加了一些功能,提交了 C3 和 C4。 然后从 C3 上创建了特性分支 client,为客户端添加了一些功能,提交了 C8 和 C9。 最后,你回到 server 分支,又提交了 C10。

假设你希望将 client 中的修改合并到主分支并发布,但暂时并不想合并 server 中的修改
1
git rebase --onto master server client

进行合并 client 分支
1
2git checkout master
git merge client
进行合并 server 分支
1
git rebase master server
