同样需要先来明确两件事:
- HEAD指针指向的是当前分支
- 分支(master, dev)指向的是最新的提交
一开始,git 中只有一个master分支,严格来讲,HEAD不是指向提交而是指向master,master才是指向提交的,HEAD指向的是当前分支;
这是git最开始的状态,用master指向最新的提交,再用HEAD指向master,这样就能确定当前的分支,以及当前分支的提交点,每次提交,master分支都会向前移动一步,这样随着你不断提交,master分支就会越来越长。
接下来我们来清晰的看下一个分支从创建到合并再到删除,git到底都做了什么。
1、创建并切换分支:
Git checkout -b dev
当创建一个新的分支时,git会去新建一个指针如dev,指向master相同的提交;
当切换分支到dev时,git做的是将HEAD指向dev;
从此以后的所有提交都是在dev分支上,没提交一次修改,dev指针会向前移动一步,HEAD指向dev
Git add .
Git commit -m “d”
2、 合并分支(dev合并到master)
(1) Git checkout master 切换回master分支
此时发生的是:HEAD指针指向master
(2)
Git merge dev 合并分支dev到master上
Git 下面出现的提示信息:
Updating d46f35e..b17d20eFast-forwardreadme.txt | 1 +1 file changed, 1 insertion(+)
注意Fast-forward:这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。(当然也不是每一次合并都是快进模式)
Fast forward模式:
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev
—no-ff:强制禁用Fast forward:
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
3、删除分支
Git branch -d dev
: