前言 #
1991年Linus Torvalds发明了linux内核,从此不断发展壮大,成为当前最流行操作系统之一
2002年,linus选用商业版本控制系统BitKeeper——Bitmover公司,来管理代码
2005年,linux花费十天时间用C写了一个分布式版本控制系统——git,一个月之内linux源码已用git管理
2016年,BitKeeper开源
git分支 #
// 进行一次提交,看git的工作原理
$ git add README test.rb LICENSE
$ git commit -m 'The initial commit of my project'
// 一个commit对象 包含指向快照的指针,作者姓名,邮箱,提交信息等,还包括指向树对象的指针
// 现在,Git 仓库中有五个对象:
// 三个 blob 对象(保存着文件快照)
// 一个 tree 对象 (记录着目录结构和 blob 对象索引)
// 一个commit对象 包含指向快照的指针,作者姓名,邮箱,等所有提交信息,还包括指向tree对象的指针,父对象的指针
第一次提交没有父对象,之后提交父对象指向上次提交
创建分支 #
$ git branch testing
git有一个特殊的HEAD指针,指向当前分支
$ git switch testing //切换分支只是更改了HEAD指针的指向
// 不妨提交一次
$ vim test.rb
$ git commit -a -m 'made a change'
// testing分支向前移动
// 切回master分支, HEAD指向master,工作区恢复到master所指向的快照内容
$ git switch master
// 不妨再做次提交
$ vim test.rb
$ git commit -a -m 'made other changes'
// 出现了历史性的分叉
分支合并 #
// 新建一个分支iss53,并切换到该分支
$ git checkout -b iss53
Switched to a new branch "iss53"
$ vim index.html
$ git commit -a -m 'added a new footer [issue 53]'
// 做一次提交,iss53向前推进
$ git checkout master
$ git checkout -b hotfix
$ git commit -a -m 'fixed the broken email address'
// 切回master分支
// 创建新分支hotfix,并切换到该分支
// 做次提交
$ git checkout master
$ git merge hotfix
// 切换到master, 合并hotfix分支
// 当你试图合并两个分支时, 如果顺着一个分支走下去能够到达另一个分支
// 那么 Git 在合并两者的时候, 只会简单的将指针向前推进(指针右移)
// 因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。
$ git branch -d hotfix
// 合并过后该分支已无用,应删除
$ git checkout iss53
$ git commit -a -m 'finished the new footer [issue 53]'
// 切回iss53分支,继续我们的工作
$ git checkout master
$ git merge iss53
// 现已经修复了iss53,把它合并到master上
你的开发历史从一个更早的地方开始分叉开来(diverged)。 因为,
master
分支所在提交并不是 iss53
分支所在提交的直接祖先,Git 不得不做一些额外的工作。 出现这种情况的时候,Git 会使用两个分支的末端所指的快照(C4
和 C5
)以及这两个分支的公共祖先(C2
),做一个简单的三方合并。
$ git branch -d iss53
// 删除该分支
合并方式 #
$ git merge --no-ff {branch}
// 使用--no-ff参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本演进的清晰,我们希望采用这种做法