git原理简介
关于git原理的详细介绍,请参考git的官方中文教程。这里只是有选择性地粗略地介绍一部分。
工作区、暂存区与仓库
工作区是指你的工程文件夹中实际能看到的(除了了
.git
文件夹)以外的你能看到的部分,这些部分的文件是可供你随意增添,删除,修改的。如果将你工作区已更改的部分提交到暂存区,那么将会生成这些已修改文件的快照。注意在提交到仓库之前,所有的已修改,添加,删除的文件都要提交到暂存区。
使用提交命令后,将会有一个新的版本生成。仓库实质上可以理解成是一个记录了所有版本的信息和具体内容的区域。
版本与分支
版本是一个对象
如果使用提交到仓库命令,将会生成一个提交对象,这就是生成一个版本的实质过程。这个提交对象储存了该版本的相关信息,以及上述提到的文件快照的位置。这个对象以提交前HEAD
指向的对象为父对象(第一次提交时的提交对象没有父对象)(或者说指向提交前HEAD
指向的对象)。
如果你多次提交的话,所有的提交对象就会形成“一条链”,或者是可以理解成一条时间线。如图所示:
分支是一个指针
分支实时上是一个指向提交对象的一个指针,每一个仓库都会默认有一个master
分支。
其HEAD
也是一个指针,但它其实并不是直接指向提交对象的,它是一个指向分支指针的指针。HEAD
指向的分支所指的提交对象表示“当前的版本”。
git分支管理
分支的创建与合并
下面是一些基本命令
git branch <branchname>
//创建新分支,默认指向HEAD版本
git checkout <branchname>
//切换到某个分支(意思是HEAD指向该分支,暂存区清空,工作区切换到该分支指向的版本)
git checkout -b <branchname>
//创建新分支,并切换到该分支
git branch
//查看当前分支
git merge <branchname>
//将当前分支与指定的分支合并
这里重申一下commit要做的事情:
生成一个提交对象,指向上一个对象,之后HEAD指向的分支指向这个新的提交对象。最后清空暂存区。此时工作区内容也应与当前HEAD版本一致。
再重申一下回退(即切换版本)要做的事情:
将HEAD指向的分支指向某个提交对象,清空暂存区,并将工作区内容切换到与当前HEAD版本一致。
通过以上几点可以发现:
只要HEAD版本(意思是HEAD指向的分支所指的提交对象对应的版本)发生了改变。暂存区将会被清空,工作区也将会被切换到与HEAD版本一致的状态。
如果分别在不同的分支进行提交,将可能会出现多个提交对象指向同一个提交对象的情况。那么我们之前所提及的“一条链”的结构便不复存在了。而是一种“树形结构”。