1.Git主干
Git以时间为主线对版本进行管理的,而这条时间主线就是Git主干,主干上的每一个节点就是一个版本,即一次commit提交。在主干上可以定义多个指针,指向不同的节点,Git默认会创建一个名称为master的指针;
默认情况下用户操作的就是master指针,但用户通过命令对操作的指针进行切换,用户每次提交一次,就会形成一个新的节点,当前操作的指针就会向前移动一次;
2.Git分支:
指针的移动轨迹,一个指针就是一个分支,不同的指针操作不同的分支:master的分支的移动轨迹和主干是重复的,所以master主分支,master中有一个特殊的指针HEAD,所以指向当前分支的当前节点,Git创建一个分支就是创建一个指针,分支的切换就是修改指针的指向,commit都是提交到当前分支,多分支下可以在各个分支之间进行任意的切换,各自的提交与其他分支是无关的。
HEAD:当前分支的节点
3.分支的合并
当前dev分支上的工作完成之后,需要将其合并到主分支master上,合并过程其实很快,只需要将master指针指向dev指针指向的节点,然后再将HEAD指针指向master指针指向的节点即可,即分支的合并就是修改了两个指针的指向而已。
对于合并的较形象的理解是:合并就是将原来在dev分支上的节点,全部都投射到master分支上,即全部合并到master分支上
4.合并后的删除
将dev分支合并到master分支修改的仅仅是master与HEAD指针,而dev指针并未修改,即仅仅是将dev上的节点投射到master分支上,并未将master分支上的节点投射到dev分支上。dev分支上的节点会少于master分支的节点。
5.分支基本操作
1>创建并切换分支:git checkout -b 分支名称
创建并切换到dev分支: git checkout -b dev <==>
(1)git branch dev:新建分支dev
(2)git checkout dev:切换到分支dev
2>查看系统的分支:
git branch
3>切换分支:
git checkout 分支名称
4>删除分支:
git branch -d 分支名称
删除某分支,必须保证当前分支不能是被删除的分支:
例如当前在dev分支就不能删除dev,先切换到其他分支再删除dev
5>合并分支:
git merge
如果将B合并到A,需要切换到A上面;
实例:
将dev合并到master上:
(1)dev提交hello.html; (git commit之后添加到版本库)
(2)dev合并到master上;
切换到master分支:git checkout master
查看master主分支下的hello.html:cat hello.html,没有发生变化;
将dev分支合并到master分支,必须要确保当前是master: git branch
合并: git merge dev
再次在master分支下查看hello.html,已经合并了;
6>分支合并与冲突
Git的冲突检测单位是文件,即当不同的分支对同一个文件进行修改后进行合并,就会产生冲突,这是与svn不同的。
svn冲突检测单位是文件中的列:若两个分支修改的不是同一个文件,合并时不会产生冲突,但若修改的是同一个文件上的不同行的内容,合并时也不会产生冲突,如果修改的是同一个文件上同一行上的不同列,在合并时候也不会产生冲突,只有两个分支修改的是同一个文件同一行的同一列的内容时候才会产生冲突;
修改dev分支下的内容添加并提交到dev
修改master分支下的内容添加并提交到master
切换到master分支: git checkout master
合并分支:git merge dev
查看状态 git status
查看master分支下hello.html的内容:
解决冲突:
手动修改冲突的内容,然后add添加并commit提交;
查看两个分支解决完冲突之后的内容:
master中是解决冲突之后的内容,dev分支是无改变的内容,是合并前的版本;
合并解决冲突之后需要注意:冲突解决之后提交的最终版本即合并后的版本仅仅是master分支中的版本,即对于解决冲突后的master的版本超前于dev中的版本;
由于合并的本意是将dev分支完成或阶段性完成的工作提交到master分支中,dev分支的工作就暂告一个段落,后面dev分支的工作再开始的时候,要与master分支的内容保持一致,从master分支内容开始,所以一般在合并后,会立即将dev分支删除,再开始时,重新创建dev分支。
查看master分支中的版本,为解决冲突后合并的最终版本。
7>查看历史版本中合并显示:冲突解决记录
可以在命令后添加--graph选项,展示图形化的提交记录
git log --pretty=oneline --graph
该方式下的commitid显示的是全长度id,可以以简写的commitid显示,只需要添加--abbrev-commit
git log --pretty=oneline --graph --abbrev-commit
8>删除dev分支:
切换到master分支,再删除dev分支:
git checkout master
git branch -d dev