目录
本篇的内容,来自于对《Pro Git》这本书学习的总结。
分支的原理
假设现在有一个工作目录,里面包含了三个将要被暂存和提交的文件。 暂存操作会为每一个文件计算校验和(使用SHA-1 哈希算法),然后会把当前版本的文件快照保存到Git 仓库中(Git 使用 blob 对象来保存它们),最终将校验和加入到暂存区域等待提交:
$ git add README test.rb LICENSE
$ git commit -m 'The initial commit of my project'
当使用 git commit 进行提交操作时,Git 会先计算每一个子目录(本例中只有项目根目录)的校验和,然后在Git 仓库中这些校验和保存为树对象。 随后,Git 便会创建一个提交对象,它除了包含上面提到的那些信息外,还包含指向这个树对象(项目根目录)的指针。如此一来,Git 就可以在需要的时候重现此次保存的快照。
现在,Git 仓库中有五个对象:三个 blob 对象(保存着文件快照)、一个树对象(记录着目录结构和 blob 对象索引)以及一个提交对象(包含着指向前述树对象的指针和所有提交信息)。Git 的分支,其实本质上仅仅是指向提交对象的可变指针。
$ git checkout -b iss53
新建一个分支并同时切换到那个分支上
等效于:
$ git branch iss53
$ git checkout iss53
Git 的默认分支名字是 master。 它会在每次的提交操作中自动向前移动。
git branch 查看分支
git branch -v 如果需要查看每一个分支的最后一次提交。--merged 与 --no-merged 这两个有用的选项可以过滤这个列表中已经合并或尚未合并到当前分支的分支。
git branch -d testing 删除分支。当分支包含了还未合并的工作,尝试使用 git branch -d 命令删除它时会失败,使用git branch -D testing可以强制删除。
$ git merge iss53 分支合并
遇到冲突时,Git 会暂停下来,等待你去解决合并产生的冲突。你可以在合并冲突后的任意时刻使用 git status 命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件 。解决文件里的冲突后,使用 git add来将其标记为冲突已解决,然后再git commit 来完成合并提交
$ git merge --no-ff -m "merged bug fix 101" iss53 选项“--no--ff”关闭快速合并,默认开启了快速合并的选项