前言
这是介绍git的第二篇博客,第一篇博客 http://zhangfengzhe.blog.51cto.com/8855103/1720049 初步介绍了git,下面我们来对git进行些深入的介绍。
COMMIT对象
在git中有好多种对象,COMMIT就是其中一种。HISTORY完整的叫法,应该是COMMIT HISTORY。 我们先来看一个图: HEAD如同游标似的,指向最新提交的COMMIT对象 那么这个COMMIT对象里面到底包含了什么东西呢? COMMIT对象包含了下面一些重要信息:
如果我们想取得前一个COMMIT对象,那该怎么做呢? 当前COMMIT对象的前一个COMMIT 用HEAD~ OR HEAD~1表示 HEAD~~ 等价于 HEAD~2
log命令用于查看历史提交记录。 每一个COMMIT都有一个编号,如同那个字符串54cf628bf72462bc37804fcc5df3850eacf9cf7e,其实就是一个HASH码。
注意: git cat-file -p XXX eq git show XXX git cat-file -t XXX -p表示打印内容,-t表示取得类型,那么这个XXX,实际上是一个标示,可以是HEAD,HEAD~N,或者HASM码什么的,甚至可以是不完整的HASH都可以。
通过上面的打印 ,其实也清楚了,文件其实也是一个BLOB对象,目录其实也就是一个TREE对象,也看到了他们的HASH码。 那么完整的示意图如下: |
tree-ish表达式
我们先来看一下.git目录的结构:
重点需要关注的就是HEAD,它链接到refs/heads/master,而master中存放的就是HASH码,其实就是一个COMMIT对象! 那么这个MASTER到底是什么东西呢?
通过上面的,我们是否可以得出HEAD eq master ? 实际上在GIT里面,master就是一个分支,即branch,也就是一个文件,里面存放着HASH! 在GIT中,HEAD是可以发生指向变化的,稍后会介绍。
git rev-parse可以用于查看指向的HASH 那么问题来了,怎么定位到master~3的根目录呢?
其实,上面的例子,就是所谓的tree-ish表达式! tree-ish表达式,可以方便我们快速定位到任何一个对象。 |
创建/删除/合并分支
git与其他的版本控制系统,差别还是蛮大的,分支对于git而言,只是一个文件,里面存放HASH码而已。
git branch 列出所有的branch 注意到master前面有一个*号,说明的是当前正在使用的branch
如果我们不想在master分支上,想切换到mybranch1上,该如何操作呢?
如果我们想先创建一个分支,然后切换到这个分支的话,可以分步使用git branch + git checkout 来完成,当然也可以快捷完成:git checkout -b即可。
切换分支,是什么鬼?
切换分支,只是改变了HEAD文件指向而已! 其实这更加准确的说明了,HEAD指向的是当前的branch! 创建分支到底意味着什么?
我们清楚的看到了,mybranch1和master一样,以文件的形式存在,放的是HASH CODE。 此时此刻,其实mybranch1 和 master 一样都指向当前的COMMIT对象! 如下图所示: HEAD的指向就是通过git checkout在不同的分支上来回切换。 下面,我们来做几个小例子:
分支改变了,但没有提交,看看对其他分支的影响:
分支提交后,这个分支就会变化,但是不会影响其他分支的,其他分支看不到这种变化!因为HEAD指针指向的问题。
如果此时此刻,我们对mybranch1分支进行删除,会发生什么呢?
画个图,来说明: 如果我们把mybranch1分支删除掉,那么commit-e对象将会找不到了,因为没有对象可以指向它,会成为“孤儿”,GIT不会允许出现这样的情况,此时我们要做的就是合并!
其实,合并后,只是更新了master的指向,master会指向commit-e而已。 注意git merge执行后的提示“Fast-forward”,这是个什么意思? 其实说的就是,这种合并是一个比较简单的合并方式,因为仅仅只是改变了master的指向就达到了合并的目的。还有一种较为复杂的情况3-WAY MERGE: 如果master分支有新的COMMIT,而mybranch1有2个新的COMMIT,那么怎么合并呢? 此时此刻,就不可以将master指向commit-g那么简单了。 那么实际上,git会对于master以及mybranch1分支的共有部分commit-d、commit-e、commit-g进行比较处理,生成一个新的commit对象完成merge操作。但这对于我们都是透明的,我们其实无需关心,还是直接使用git merge即可! 本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1722466,如需转载请自行联系原作者 |