git学习系列(二)---- git的分支

最近在学习git,对git也有了新的认识,写一些总结,文章基本总结于 Pro Gitcss

其余git相关文章:git

git学习系列(一)---- git的基础知识vim

本章主要介绍git的分支segmentfault

分支简介

首先,git 保存的不是文件的变化或者差别,而是一系列不一样时刻的文件快照。
在进行提交操做(commit)时,git会保存一个提交对象(commit object)。
提交对象主要包括如下内容:服务器

1.指向暂存内容快照的指针
2.做者的姓名和邮箱
3.提交时输入的信息
4.指向它的父对象的指针(初次提交无)

clipboard.png

git 的分支,其实本质上仅仅是指向提交对象的可变指针。学习

注: git的默认分支名字是 master。git 的 “master” 分支并非一个特殊分支。 它就跟其它分支彻底没有区别。
之因此几乎每个仓库都有 master 分支,是由于 git init 命令默认建立它,而且大多数人都懒得去改动它。

分支建立

git branch testing

这会在当前所在的提交对象上建立一个指针。那么,Git 又是怎么知道当前在哪个分支上呢?它有一个名为 HEAD 的特殊指针,指向当前所在的本地分支fetch

clipboard.png

分支切换

git checkout testing

这样 HEAD 就指向 testing 分支了。spa

clipboard.png

这时候咱们再进行一次提交,会发现 你的 testing 分支向前移动了,可是 master 分支却没有3d

clipboard.png

这个时候咱们再切回master分支, 并进行一些修改与提交指针

git checkout master
vim test.rb
git commit -a -m 'made other changes'

这个项目的提交历史已经产生了分叉,你能够在不一样分支间不断地来回切换和工做,并在时机成熟时将它们合并起来
clipboard.png

你能够简单地使用 git log 命令查看分叉历史

git log --oneline --decorate --graph --all

clipboard.png

跟踪分支

从一个远程跟踪分支检出一个本地分支会自动建立一个叫作 “跟踪分支”,跟踪分支是与远程分支有直接关系的本地分支。 若是在一个跟踪分支上输入 git pull,git 能自动地识别去哪一个服务器上抓取、合并到哪一个分支。

设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支,你能够在任意时间使用 -u 或 --set-upstream-to 选项运行 git branch 来显式地设置。

git branch -u origin/serverfix
或者
git branch --set-upstream-to=origin/[branch]  [branch]

设置追踪分支后可直接使用git pull 不用再指定远程分支
若是想要查看设置的全部跟踪分支,可使用 git branch 的 -vv 选项

git branch -vv

clipboard.png

拉取

当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工做目录中的内容,它只会获取数据而后让你本身合并。
举例:

git fetch origin 他们会在本地生成一个远程分支 origin/serverfix,指向服务器的serverfix 分支的引用。能够运行 git merge origin/serverfix 将这些工做合并到当前所在的分支
当抓取到新的远程跟踪分支时,本地不会自动生成一份可编辑的副本(拷贝)。 换一句话说,这种状况下,不会有一个新的 serverfix 分支
只有一个不能够修改的 origin/serverfix 指针。 git checkout -b serverfix origin/serverfix。这会给你一个用于工做的本地分支,而且起点位于 origin/serverfix。

删除远程分支

git push origin --delete serverfix

基本上这个命令作的只是从服务器上移除这个指针。 Git 服务器一般会保留数据一段时间直到垃圾回收运行,因此若是不当心删除掉了,一般是很容易恢复的。

本期就先讲这么多,分支的合并放在下一期讲,也是为了比较合并(merge)与变基(rebase)的一些差别