- 分支简介
- 提交对象:Git保存的不是文件的变化或者差异,而是一系列不同时刻的文件快照。在进行提交操作时,Git会保存一个提交对象(commit object)该提交对象会包含一个指向暂存内容快照的指针。但不仅仅是这样,该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象,而由多个分支合并产生的提交对象有多个父对象。
- 暂存操作: 暂存操作会为每一个文件计算校验和(使用SHA-1哈希算法),然后会把当前版本的文件快照保存到Git仓库中(Git使用blob对象来保存他们),最终校验和加入到暂存区域等待提交
- 提交操作: 当使用git commit进行提交操作时, Git会先计算每一个子目录的校验和,然后在Git仓库中这些校验和保存为树对象。随后,Git便会创建一个提交对象,它除了包含上面提到的哪些信息外,还包含指向这个树对象(项目根目录)的指针。如此一来,Git就可以在需要的时候重现此次保存的快照。
- blob对象保存文件快照, 树对象记录着目录结构和blob对象索引,提交对象包含着指向树对象的指针和所有提交信息
- Git分支其实本质上仅仅是指向提交对象的可变指针。Git的默认分支名字是master。在多次提交操作之后,其实已经有一个指向最后那个提交对象的master分支。它会在每次的提交操作中自动向前移动
- Note: Git的“master”分支并不是一个特殊的分支, 跟其他分支完全没有区别。之所以几乎每个仓库都有master分支,是因为git init命令默认创建它,并且大多数人懒得去改动它
- 分支创建
- 如何创建分支: git branch命令只是创建了一个可以移动的新的指针
- 怎么知道当前在那个分支上: git有一个名为HEAD的特殊指针。在git中它是一个指向当前所在的本地分支(将HEAD想象为当前分支的别名)。
- 使用git log --decorate命令查看当前分支所指的对象
- 分支切换
- 使用git checkout命令从testing分支切换到master分支上: git checkout做了两件事。一是使HEAD指回master分支,二是将工作目录恢复成master分支所指向的快照内容。
- Note: 分支切换会改变你工作目录中的文件。在切换分支时,一定要注意你工作目录里的文件会被改变。如果是切换到一个较旧的分支,你的工作目录会恢复到该分支最后一次提交时的样子。如果Git不能干净利落的完成这个任务,它将禁止切换分支
- 由于git分支实质上仅是包含所指对象校验和(长度为40的SHA-1值字符串)的文件,所以它的创建和销毁都异常的高效。创建一个分支相当于往一个文件中写入41个字节。
- fast-forward:
- 当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么Git在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧–这就叫做“快进(fast-forward)”。
- 推送
- 本地分支并不会自动与远程仓库同步–你必须显示地推送想要分享的分支。
- 使用git push将本地分支推送到远程仓库