频道栏目
首页 > 资讯 > 其他综合 > 正文

git的学习详解

17-10-11        来源:[db:作者]  
收藏   我要投稿

一、git中数据保存的大致方式:
每次提交,git会生成一个commit对象,commit对象的结构如下,主要包括3个部分:
包含提交的直接相关信息:提交时间,作者,message等等。
包含0个或多个指向祖先的指针:如果是首次提交,就没有祖先,如果是合并,就会有两个祖先,一般的,就只有一个祖先
指向根的指针:在暂存和提交过程中,git会对文件以及文件夹计算校验和,如下图所示,git用tree对象保存目录信息,在用blob对象保存文件信息


git对象模型简化版
git对象模型简化版

经过几次提交后,git的历史结构可以看做如下图所示的样子:
绿色表示提交对象,紫色表示文件对象,黑色箭头代表两条指针指向祖先和文件快照-根目录的树对象。

这里写图片描述)
提交历史结构图

 

二、分支的结构
Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。
创建一个分支,
git branch dev
仅仅是创建一个分支指针,指向当前最新的提交,所以这也特别快。
出现多个分支时,git使用HEAD表示当前工作的分支。
在新进行提交,从创建分支点开始,新分支会长出一条新的分支路径的,就像树一样长出新的枝丫一样,如图。


这里写图片描述
两个分支都进行提交

 

3、分支操作
创建分支
git branch [branch-name]
git branch -b [branch-name] 创建并切换到该分支
删除分支
git branch -d iss53 只能删除已合并过的分支,如果没合并过则不能直接删除,需要使用 -D强制删除

查看分支

git branch
iss53
* master
testing

注意看 master 分支前的 * 字符:它表示当前所在的分支。也就是说,如果现在提交更新,master 分支将随着开发进度前移。若要查看各个分支最后一个提交对象的信息,运行git branch -v:

iss53 93b412c fix javascript issue
* master 7a98805 Merge branch 'iss53'
testing 782fd34 add scott to the author list in the readmes

要从该清单中筛选出你已经(或尚未)与当前分支合并的分支,可以用 –merge 和 –no-merged 选项

合并分支:
合并分支有两种情况,具有直接祖先关系分支的合并,祖先分支合并子分支的内容,只需要祖先分支的指针指向子分支即可,git的提示也会显示fast forward信息如图:


这里写图片描述
合并前

这里写图片描述
合并后
 
不是直接祖先关系的合并:
如图,git会对两个分支最新节点,以及他们的公共祖先节点三个commit进行合并计算,进而合并。如图

这里写图片描述
不在同一条链的的分支的合并
 

这里写图片描述
合并之后
可以看到合并之后新增了C6的commit节点,他有两个祖先节点。
遇到冲突时的分支合并
1、合并很可能遇到冲突,发出合并命令后发生冲突的,git会进行合并,但不提交,需要解决冲突之后再提交,显示如下
Project/mygrit (dev)
$ git merge master
Auto-merging test_commit_repeat.txt
CONFLICT (content): Merge conflict in test_commit_repeat.txt
Automatic merge failed; fix conflicts and then commit the result.

xxxx MINGW64 /e/Learning Project/mygrit (dev|MERGING)

2、通过git status 查阅哪些文件发生了冲突:
会显示 You have unmerged paths 并在unmerged paths里面显示冲突的文件。

3、合并过程中git会再冲突文件冲突位置加上标识符(貌似不太好),可以手动打开文件处理,或者使用专门的合并工具。输入git mergetool 回车,根据提示调出工具,合并完成后保存并退出,回到git bash窗口,git 会自动将冲突文件暂存,后面再提交即可完成本次合并。
对于合并工具,可以使用配置选项进行制定。

两种分支:
长期分支
由于 Git 使用简单的三方合并,所以就算在较长一段时间内,反复多次把某个分支合并到另一分支
如图


这里写图片描述

 

特性分支
在任何规模的项目中都可以使用特性(Topic)分支。一个特性分支是指一个短期的,用来实现单一特性或与其相关工作的分支,一天之内建立、使用、合并再删除多个分支是常见的事。可以不那么顾虑的新建以及删除分支。

远程分支管理

当从远程克隆仓库或者fetch来之后,本地会保有一个远程分支的指针,但它是不可改动的,只能创建本地分支之后再改动。
如果有多个远程仓库,会和同一仓库的多个分支类似放入这样的远程分支。

将本地分支添加到远程仓库中
git push origin serverfix:serferfix

删除远程仓库的分支
如果不再需要某个远程分支了,可以用这个非常无厘头的语法来删除它:git push [远程名] :[分支名]。
git push origin :serverfix
要注意,这个命令很容易和添加弄混,有种方便记忆这条命令的方法:记住我们不久前见过的 git push [远程名] [本地分支]:[远程分支] 语法,如果省略 [本地分支],那就等于是在说“在这里提取空白然后把它变成[远程分支]”

跟踪分支
远程分支是无法编辑的,从远程分支分化出新的本地分支:
git checkout -b serverfix origin/serverfix
从远程分支 checkout 出来的本地分支,称为跟踪分支(tracking branch)。跟踪分支是一种和远程分支有直接联系的本地分支。在跟踪分支里输入git push,Git 会自行推断应该向哪个服务器的哪个分支推送数据。反过来,在这些分支里运行 git pull 会获取所有远程索引,并把它们的数据都合并到本地分支中来。

相关TAG标签
上一篇:python开发练习题:Merge Intervals
下一篇:jQuery-Selectors中contains(text),:empty,:has(selector),:parent,:hidden,:visible的用法
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站