Git分支
分支功能主要可以让开发人员在分支上开发,使多个人协作办公,而不会受到主干的影响
轻松的切换分支
鼓励分支开发,时常合并分支。
Git提交背后的管理方式:git会保存一个提交对象,这个对象保存一个指向暂存区域内容快照的指针,同时还包含了做着姓名,email地址,提交的注释,
还有指向父提交(上一次提交)的指针,当这个指针没有任何指向,提交时初始提交
当指针只有一个指向,说明是一个常规的提交
当指针有两个指向或者多个时,说明这次提交结果是两个或者多个分支进行合并的结果。
实战演练:
向git仓库中提交三个文件,并提交
当运行提交后,git会为每一个子文件计算校验码,并且将他们保存为树形结构到仓库中,随后git会保存一个commit对象,这个对象包含了元数据信息以及指向根项目树的指针
此时Git仓库包括了五个对象:三个文本文件,一个树形对象列出所有目录下的文件内容,以及一个提交对象包括指向root树的指针和所有的提交元数据信息。
如果在这次提交的基础上,做出一些修改并再次提交,那么下一次提交会保存一个指向下次提交的指针。
git分支运作方式:
- 默认分支是master分支
- Git分支非常轻量级,可以流畅的手动切换
- 每一次进行提交,都会将master分支的指针自动向后移动一个版本
新建分支
git branch <分支名> 新建一个指向当前分支所指向快照的分支,
Git如何知道当前所在的分支?
Git有一个特殊的指针叫做HEAD指针,它指向了当前所在的分支
git log -–oneline –-decorate
查看分支指针的指向
切换分支
git checkout testing 切换分支到testing分支上,此时分支指针的示例图为
Head通常指向的是当前分支,当修改工作目录下文件内容,再次提交,会发现master分支会落后testing分支一个版本
现在HEAD指向testing,没有指向master分支,使用git checkout master命令切回master分支
此时指向示意图为:
需要注意的是,切换分支回到master分支后,工作目录下的内容也会随之发生改变,这里testing分支主要做出的改变是向test.rb添加内容,切换回master分支后,工作目录下面test.rb里面的内容也会回到master分支下的状态
切回master分支后,再对test.rb文件进行修改,随后进行提交,此时HEAD指向示意图为:
使用git log --oneline --decorate --graph –all 可以在命令行窗口查看分支指向结构图
Git与其他VCS版本控制工具主要区别在于:其他VCS版本控制工具在创建新的分支时,会项目的所有文件拷贝到另外一个文件夹,如果项目很大,那么这个拷贝过程会显得相当漫长
而Git在新建分支时,只是创建一个包含40位SHA-1校验码字符,指向所做的提交,新建而删除分支显得非常轻量级
使用git checkout -b 创建一个分支,并切换到这个新建的分支
分支合并
分支合并是团队开发过程中必要的一环,在一个完整的项目过程中,小组成员负责不同模块,每个成员在主干分支的基础上建立新的分支,开发完成后,将分支合并回主干分支,以此推动项目的进展。
实例:
在工作目录下新建一个test.txt文件,执行git init命令,然后修改test.txt文件加入新内容,后使用git commit -m ‘first commit’ 命令提交到仓库,重复修改提交过程三次,此时分支状态图为:
随后使用git checkout -b test1命令新建一个分支iss53分支,
此时分支状态图为:
在iss53分支上修改txt文件中的内容,新增 iss53 add content 。
此时分支状态图为:
现在切换回master分支,使用命令 git checkout master
假设另外一个小组成员在master分支基础上,新建一个hotfix分支,也修改了txt中的文件,并进行了提交,
此时分支状态图为:
我们现在切回master分支并合并hotfix分支,
此时分支状态图为:
可以看到master指向有C2移动到了C4和hotfix指向相同,说明git合并分支,只是改变指针对象而已,合并后,master指针会自动的指向子分支所指向的位置。
合并后我们不再需要hotfix分支,那么可以使用git branch -d hotfix命令删除hotfix分支
切换到iss53分支后,编辑txt文件,新增一些内容 iss53 add content 2
此时分支状态图为:
现在尝试将iss53合并到master分支,不过master合并分支iss53和合并分支hotfix分支是不太一样的,合并hotfix分支的时候,master分支是hotfix分支的祖先,现在合并iss53分支,master分支和iss53分支只是共有一个父亲C2而已,
为了解决这样合并分支的情形,git创建一个C4和C5合并后的快照,并指向这个快照,
然而master分支和iss53分支都对txt文件进行了修改,发生了合并时的文件冲突。
在每次合并分支后,要想查看分支合并过程中产生冲突的文件,可以使用git status命令进行查看。
打开txt文件后可以发现git帮我们自动生成了两个分支所做的修改,并将它们都放在了txt文件当中
对txt文件进行修改,然后使用git add命令将这个文件加入到暂存区,这样git就会知道所欲的冲突已经被解决,不过仍然对所做的修改进行提交
使用git commit命令对已经解决冲突的txt文件进行提交后,会出现下面的内容
可以选择输入解决冲突所做的改变,以及理由,方便日后查看
分支管理
git branch命令查看所有的分支
git branch –merged:查看所有被合并的分支
git branch –no-merged:查看所有没有被合并进来的分支
git branch -d 要删除一个分支,需要注意的是,删除一个没有被合并的分支,git会提示删除失败,并提示是否使用-D选项进行强行删除,不过你得确定删除没有被合并的分支不会丢失信息。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。