Git存储快照流

分支简介

  • 当进行commit操作时,git会保存一个提交对象(commit object)。改提交对象会包含一个指向暂存内容快照的指针,该对象还包含提交信息和指向父对象的指针

  • git 的分支,其实本质上仅仅是指向提交对象的可变指针。Git 的默认分支名字是master。在多次提交操作后,你其实已经有一个指向最后那个提交对象的master分支。他会在每次提交操作中自动向前移动。

  • git 的“master”分支并不是一个特殊分支。它跟其它分支完全没有区别。之所以几乎每一个仓库都有master分支,是因为git init 命令默认创建它,并且大多数人都懒得去改动它。

分支创建

git branch testing 这会在当前所在的提交对象上创建一个指针

git有一个名为HEAD的特殊指针。指向当前所在的本地分支。git branch仅仅会创建一个新分支,并不会切换到新分支去。

可以使用git log命令查看各个分支当前所指的对象,使用 –decorate选项

git log --oneline --decorate

分支切换

使用git checkout命令切换分支

git checkout testing

这样HEAD就指向testing分支了

在testing分支上再提交一次

git commit -a -m "made a change"

testing分支向前移动,但是master 分支却没有,它仍然指向运行git checkout时所指的对象。切换回master分支查看

git checkout master

这条命令做了两件事。一是使HEAD指向master分支,二是将工作目录恢复成master分支所指向的快照内容。项目将始于一个较旧的版本。从本质上讲,这就是忽略testing分支所做的修改,以便于向另一个方向进行开发。

分支切换会改变工作目录中的文件,在切换分支时,工作目录中的文件会被改变。如果是切换到一个较旧的分支,工作目录会恢复到该分支最后一次提交时的样子。如果git 不能干净利索地完成这个任务,它将禁止切换分支。

在master分支上再提交一次

git commit -a -m "made other change"

现在,这个项目的提交历史已经产生了分叉,可以使用git log 命令查看分叉历史。

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

它会输出你的提交历史、各个分支的指向以及项目的分支分叉情况。

分支的新建与合并

git checkout -b iss53

这条指令相当于

git branch iss53
git checkout iss53

创建一个分支同时切换到那个分支上,在切换分支时,要留意工作目录和暂存区里那些还没有被提交的修改,它可能会和你即将检出的分支产生冲突从而阻止 git切换到该分支。最好在切换分支前,保持一个干净的状态。

修改完成后,使用下列指令来合并分支

git merge iss53

合并后,使用git status指令来查看因冲突而不能合并的文件,在手动处理冲突后,再提交一次

git commit -a -m "merge"

合并完成,iss53分支已经不再需要了,可以使用-d选项来删除分支

git branch -d iss53

分支管理

git branch
  • 查看当前分支列表 git branch -v
  • 查看每个分支的最后一次提交 --merged --no-merged 两个选项用来过滤和查看已合并到当前分支的分支和未合并到当前分支的分支 然后对已合并的分支进行删除。