Git认真学习(3)

git 的 分支特点,轻量级

什么是分支

什么是commit?

首先我们了解:当commit时,我们commit了什么?

其实我们保存了一个 commit 对象:

  • 一个指针:指向暂存内容快照
  • 包含了这次提交的 作者,时间 等相关信息
  • 包含了0+个指向其 父对象 的指针 (第一个commit是没有父对象的)(指针可以连成链)

比如:当我们 add 3个文件 file-0,file-1,file-2的之后,commit了,我们执行了哪些操作呢?

add

  • 对 其中 每一个文件进行校验和计算
  • 然后 将当前的文件快照(文件快照的对象类型是 blob) 加入git仓库
  • 校验和加入暂存区

commit

  • 计算每一个子目录的校验和
  • 在Git仓库中将这些目录保存为 tree 对象,然后创建一个commit对象,如下图(重要):

这里写图片描述

多次提交之后就会形成一个commit链(出现分支的意思了),如下图:

这里写图片描述


什么是分支?

只要理解分支是链式结构,那么多分支就很明显了,如下:

这是只有主分支的时候:

这里写图片描述

这是添加了一个分支的时候,git branch testing

这里写图片描述

其中 HEAD 是指向当前工作的本地分支,可以使用 git checkout xxx 来切换分支
同时 git checkout -b xxx 就是创建并切换到某一个分支

分支可以应对 实际开发过程中的一些常见问题:比如紧急修复bug,或者要发开一个新的功能,怎么办?
新开个分支啦~


如何合并

实例1,fast forword 合并

列表内容

git checkout master // 切换到主分支
git merge hotfix // 合并hotfix分支

这里写图片描述

合并的时候会出现 Fast Forword 提示,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fast forward)

另外:

git branch -d hotfix // 合并后可以删掉这个 <hotfix> 分支了

实例2,合并双线分支

相同的祖先节点创建新的commit对象,当然也有新的快照,新的 commit对象就有 两个不同的父对象了。

关键的问题是:合并时发生冲突该怎么办?

git status // 查看并解决冲突

解决冲突后:执行 git add . 标记为已经解决的状态

然后 git commit 大功告成!


罗列一些分支管理的命令:

git branch // 给出当前所有分支的清单
git branch -v // 可以查看每个分支对应的 <最后一个commit对象>
git branch --merged // 查看已经并入 **当前分支的** 分支
git branch --no-merged // 查看没有并入当前分支的分支

远程仓库

远程分支是对远程仓库的分支的索引

是一些无法移动的本地分支,只有当git网络交互的时候才会更新

表示形式:(远程仓库)/(分支名) 很可能是来自不同的远程仓库的

用一个实际的例子来解释一下,远程仓库的交互:

  • 首先,你clone了一个远程仓库
  • Git服务器会自动的将此远程仓库命名为origin
  • 下载其中所有的数据
  • 建立一个指向远程仓库的 master 分支的指针 在本地命名为 origin/master (此时这条分支是无法更改数据的)

然后

  • Git又建立了一个属于你自己的本地master分支
  • 始于origin上的master分支的相同位置,开始工作

这里写图片描述

只要不和服务器交互,那么origin/master就不会移动

这里写图片描述

使用 git fetch origin 来从服务器抓取新的更新,此时origin/master 更新(移动)了

这里写图片描述

git remote add xxx xxx.com.... // 这是添加一个多个远程仓库的命令

推送分支

git push (远程仓库名) (本地分支名) // 上传分支
git push (远程仓库名) (本地分支名):(上传之后的远程分支名) // 上传并改名

此时如果你的小伙伴,抓取了你上传的分支

git fetch origin

那么他的远程分支会更新,但是仍然还是不可操作的,怎么才能使我们可以操作这个分支呢?

  1. 创造一条和这个一样的本地新分支
  2. 合并到一个分支
 git merge <远程仓库名>/<某个分支名> // 合并法
 git checkout -b <新分支名字> <远程仓库名>/<某个分支名> // 新建分支法

跟踪分支

从远程分支中 checkout 出来的本地分支,也叫做 跟踪分支

跟踪分支有很大的意义:表示这条本地分支是和 某条远程仓库的分支 是绑定的

也就意味着 push 可以自动推送相应的分支,pull 意味着从这些分支中拉取合并到本地来

现在再看clone操作,就是自动创建了一个 master 分支来 跟踪 origin/master分支

 git checkout -b <新分支名字> <远程仓库名>/<某个分支名> //建立了联系
 或者
 git checkout --track <远程仓库名>/<某个分支名> //以默认名字建立新的分支

删除分支

git push <远程仓库名>/<某个分支名> //相当于将 null push 给了某个远程分支,也就是执行了 删除

分支的rebase

什么是rebase?

merge**(三方:两个最新分支,和它们的最初祖先合并)只是合并的一种方式,还有 另外的一种方式叫做rebase**

rebase的操作大概就是:在一条分支上 执行 另一条分支commits,可以想象为 打补丁

rebase的好处在于,可以产生一个更为整洁的 提交记录

rebase是对于公共仓库的commit是有风险的,之后再补充上来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值