git是一个开发利器,现在的程序员都离不开它 可能对于git,不少人命令用的很溜,但并不了结底层实现 这会导致当碰到git相关的开发环境问题时不好解决,或者委曲求全,比如从新clone一个新的repo
git优于之前的clearcase以及svn的版本管理软件的重要特性之一,就是非常轻量级的branch操作,极大的提升了效率。 这里介绍一下git branch的两种常用合并merge策略以及原理。
git三大对象:
- 数据对象blob
- tree对象
- commit对象
commit对象的格式很简单:它先指定一个顶层树对象,代表当前项目快照; 然后是可能存在的父提交(前面描述的提交对象并不存在任何父提交); 之后是作者/提交者信息(依据你的 user.name 和 user.email 配置来设定,外加一个时间戳); 留空一行,最后是提交注释。
$ git cat-file -p fdf4fc3
tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579
author Scott Chacon <[email protected]> 1243040974 -0700
committer Scott Chacon <[email protected]> 1243040974 -0700
first commit
Git 的分支,其实本质上仅仅是指向commit对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支。 master 分支会在每次提交时自动向前移动。
rebase变基合并方式
这种是比较常用的合作开发方式,即个人先git stash暂存本地开发内日,之后通过rebase主支上的内容到本地
之后再git stash pop 先做本地合并, 之后再远程推送到远端master主支
|
这里的experiment就是在变基之后的结果
merge合并方式
直接把某个branch上的改动merge过来,常用与主支去merge其他分支的改动:
比如当前的master主支上指向的是c4这个commit对象,而issue53的branch在经过了多个本地fix递交后指向的是c5这个commit对象
之后我们用git merge命令来把issue53的改动merge到master
$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)
这里就最终在master形成了c6这个提交:

参考 GitScmBook