要切换到一个已存在的分支,你需要使用 git checkout 命令。 我们现在切换到新创建的
testing 分支去:
$ git checkout testing
这样 HEAD 就指向 testing 分支了。
分支简介
Figure 6. HEAD 指向当前所在的分支
那么,这样的实现方式会给我们带来什么好处呢? 现在不妨再提交一次:
$ vim test.rb
$ git commit -a -m 'made a change'
Figure 7. HEAD 分支随着提交操作自动向前移动
如图所示,你的 testing 分支向前移动了,但是 master 分支却没有,它仍然指向运行 git
分支简介
Figure 8. 检出时 HEAD 随之移动
这条命令做了两件事。 一是使 HEAD 指回 master 分支,二是将工作目录恢复成 master 分 支所指向的快照内容。 也就是说,你现在做修改的话,项目将始于一个较旧的版本。 本质上 来讲,这就是忽略 testing 分支所做的修改,以便于向另一个方向进行开发。
Note
分支切换会改变你工作目录中的文件
在切换分支时,一定要注意你工作目录里的文件会被改变。 如果是切换到一个较 旧的分支,你的工作目录会恢复到该分支最后一次提交时的样子。 如果 Git 不能 干净利落地完成这个任务,它将禁止切换分支。
我们不妨再稍微做些修改并提交:
$ vim test.rb
$ git commit -a -m 'made other changes'
现在,这个项目的提交历史已经产生了分叉(参见
项目分叉历史
)。 因为刚才你创建了一个 新分支,并切换过去进行了一些工作,随后又切换回 master 分支进行了另外一些工作。 上述 两次改动针对的是不同分支:你可以在不同分支间不断地来回切换和工作,并在时机成熟时 将它们合并起来。 而所有这些工作,你需要的命令只有 branch 、 checkout 和 commit 。 分支简介Figure 9. 项目分叉历史
你可以简单地使用 git log 命令查看分叉历史。 运行 git log --oneline --decorate --graph
--all ,它会输出你的提交历史、各个分支的指向以及项目的分支分叉情况。
$ git log --oneline --decorate --graph --all
* c2b9e (HEAD, master) made other changes
| * 87ab2 (testing) made a change
|/
* f30ab add feature #32 - ability to add new formats to the
* 34ac2 fixed bug #1328 - stack overflow under certain conditions
* 98ca9 initial commit of my project
由于 Git 的分支实质上仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,
所以它的创建和销毁都异常高效。 创建一个新分支就像是往一个文件中写入 41 个字节(40 个字符和 1 个换行符),如此的简单能不快吗?
这与过去大多数版本控制系统形成了鲜明的对比,它们在创建分支时,将所有的项目文件都 复制一遍,并保存到一个特定的目录。 完成这样繁琐的过程通常需要好几秒钟,有时甚至需 要好几分钟。所需时间的长短,完全取决于项目的规模。而在 Git 中,任何规模的项目都能在 分支简介
分支简介