《Pro Git》Git分支笔记
Git分支简介
在Git中,有个校验和的概念,主要用于验证数据完整性,它是一个40位16进制字符串,使用SHA-1哈希算法生成。校验和也标识了Git中每一个对象。
我们由前一章阅读了解到Git保存的是文件快照而非内容差异变化。而暂存和提取操作中怎么保存文件快照呢?这和对象又有什么关联?
首先,暂存操作(git add)为每一个文件计算出校验和,Git使用Blob对象保存这些文件快照,而文件校验和保存到暂存区。
提交操作(git commit)为每一个子目录计算校验和,然后将该校验和保存为树对象,一个树对象包含了多个Blob对象索引和目录结构信息,接着结合指向树对象的指针和所有提交信息为一个提交对象。除第一个提交对象外,其他提交对象都包含指向上一个提交对象的指针(父对象)。

从概念视角看,Git分支实质上是指向提交对象的可变指针。初始化(git init)时默认创建分支master或main。每次提交,当前分支都会向前移动,也就是指向新的提交对象。
创建分支
根据之前的内容,创建分支也就是创建一个指向当前提交对象的可移动指针。
Git会有一个HEAD指针指向当前分支,当我们创建新分支时,HEAD并不会移动,也就是创建新分支不会切换到新分支。创建一个名为testing的分支的命令是git branch testing,分支情况如下:

你可以使用git log --oneline --decorate查看各个分支所指对象。
切换分支
切换分支的命令:git checkout <branch-name>。
切换分支意味着改变HEAD指针指向。
切换分支有什么用呢?
当我们切换分支后,若进行提交,则原HEAD指向的指针不变,仍指向上一个提交,当前HEAD指向的指针(即当前分支)则指向当前提交。这意味着我们可以新建分支并切换到新分支来开发新功能,等到时机成熟再合并。
Git的分支操作为什么比其他VCS快?
从物理视角看,Git 分支是通过一个特殊的文件存储的。这个文件位于
.git/refs/heads/目录下,每个分支对应一个文件。每当你创建一个新的分支或进行提交时,Git 会在这些文件中更新对应的分支信息。每个分支文件实际上包含一个 40 个字符长的 SHA-1 哈希值,这个哈希值指向对应分支的最新提交对象。所以从这个角度来看,分支实际上是一个包含 SHA-1 哈希值的文件。因此,操作Git分支也就是对该文件的修改,当然比直接复制全部目录文件的方法快。
不过,要注意切换分支工作目录会回到切换到的分支的最后一次提交时的状态,所以最好保持一个干净的状态再切换分支。当然也有别的解决方法:暂存和修补提交。
分支的新建与合并
分支的新建与切换可以一步完成:git checkout -b <branch-name>。
那什么时候适合新建分支呢?
开发新功能、修复Bug、版本发布、多人协作等...
当我们完成新分支的任务后,可能需要将该分支合并到主分支。合并呢,也会遇到多种情况。比如,
待合并分支与目标分支是包含关系,其中目标分支是待合并分支的父分支,且从目标分支到待合并分支的提交历史是线性的,这种合并是没有冲突的。完成合并后,当前分支指针指向了待合并分支的最新提交。这称为快进合并(Fast-Forward)。
待合并分支与目标分支从公共祖先处分叉,这种情况下,带合并分支、目标分支与两者的公共祖先分支三者做合并。与快进合并不同的是,git会做一个新快照并创建一个提交指向它,这称为一次合并提交。
如果你在两个不同的分支中,对同一个文件的同一个地方进行了不同修改,合并它们的时候就会发生合并冲突,git会提示
CONFLICT:...,虽然执行合并后,git依然作了合并,但是没有自动创建一个新的合并提交,这就等你去解决冲突来手动提交。你可以使用git status来查看因合并冲突而处于未合并(unmerged)状态的文件。Git会在有冲突的文件处加入标准的冲突解决标记,格式如下:<<<<<<< HEAD:文件1
文件1冲突部分A
=======
文件2冲入部分B
>>>>>>> 待合并分支:文件2
你必须将上面内容替换成A或B之一。
当然你也可以选择使用图形化工具解决冲突,运行git mergetool命令来查看适合的工具。
最后,再次使用git status查看冲突是否已解决。
分支管理
# 查看所有分支,*号对应当前分支
$ git branch
iss53
* master
testing
# 查看每个分支的最后一次提交,也就是所指向的提交
$ git branch -v
iss53 93b412c fix javascript issue
* master 7a98805 Merge branch 'iss53'
testing 782fd34 add scott to the author list in the readmes
# 查看已合并到当前分支的分支列表,该列表中未带*号的都是可以安心删除的
$ git branch --merged
iss53
* master
# 查看未合并到当前分支的分支列表,这些分支包含了未合并的内容,所以不可删除,但可以`-D`强制删除
$ git branch --no-merged
testing
# 查看其它分支的合并状态
$ git branch --no-merged testing
topicA
featureB
《Pro Git》Git分支笔记的更多相关文章
- 《Pro Git》学习笔记
1.Git远程模型示意图 Remote:远程仓库 Repository:本地仓库 Index:暂存区 workspace:当前工作区 2.取得Git仓库 2.1 初始化新仓库 git init ...
- git学习小结 (笔记)
Modesty helps one to go forward, whereas conceit makes one lag behind. "虚心使人进步,骄傲使人落后" 注:本 ...
- git的学习笔记(二):git远程操作
1.创建ssh key ssh-keygen -t rsa -C "your_email@example.com" 执行命令后会在用户的家目录生成.ssh的隐藏文件夹,文件夹里有公 ...
- HIT2019春软件构造->Git&Github学习笔记
由于软件构造课程需要,学习使用git,以下作为学习笔记. 一.Git初始化及仓库创建和操作 1.基本信息设置(设置签名) 命令 项目级别/仓库级别:仅在当前本地库范围内有效 git ...
- Git Flow 分支管理简述
概述 Git 是什么 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的 ...
- git tag 常用笔记
git tag 常用笔记 查看 tag 列出现有 tag git tag 列出 v1.4.2 相关的 tag git tag -l "v1.4.2" 查看指定 tag 的信息 gi ...
- Git源代码管理笔记
很早之前也学过git但是没有详细的记录,这次是做个复习,巩固 若有不对的地方请您指出 目录 Git和SVN有什么区别? 什么是Git? github仓库 Star和Fork Pull request ...
- [常用工具] git基础学习笔记
git基础学习笔记,参考视频:1小时玩转 Git/Github 添加推送信息,-m= message git commit -m "添加注释" 查看状态 git status 显示 ...
- Git多分支 远程仓库 协同开发以及解决冲突
目录 一.Git多分支及远程仓库 1.Git多分支 2.正常密码链接远程仓库 3.ssh公钥私钥方式链接远程仓库 三.协同开发及解决冲突 1.协同开发 2.解决冲突 四.线上分支合并及远程仓库回滚 1 ...
- git 创建分支 并 提交到远程分支
git branch(分支命令的使用http://hbiao68.iteye.com/blog/2055493 0.可以通过git branch -r 命令查看远端库的分支情况 1,从已有的分支创建新 ...
随机推荐
- 2021-11-29:给定一个单链表的头节点head,每个节点都有value(>0),给定一个正数m, value%m的值一样的节点算一类, 请把所有的类根据单链表的方式重新连接好,返回每一类的头节点
2021-11-29:给定一个单链表的头节点head,每个节点都有value(>0),给定一个正数m, value%m的值一样的节点算一类, 请把所有的类根据单链表的方式重新连接好,返回每一类的 ...
- pycharm eslint 关闭
pycharm 关闭eslint 文件->设置->语言和框架->JavaScript->代码质量工具->ESLint
- TLS 加速技术:Intel QuickAssist Technology(QAT)解决方案
作者:vivo 互联网服务器团队- Ye Feng 本文介绍了 Intel QAT 技术方案,通过Multi-Buffer技术和QAT硬件加速卡的两种方式实现对TLS的加速 一.背景 当前 TLS 已 ...
- 【数据库】时区及JDBC的时区设置
JDBC连接时有个TimeZone配置,这玩意到底有用吗?我是使用Postgresql和Mysql两个数据库验证的.结果如下: 数据库 部署方式 版本 JDBC连接TimeZone参数 JDBC连接s ...
- APP调用第三方(微信)登录(最详细的实现流程)
最近使用weexplus做了个app 用户需要的是可以使用第三方微信实现登录(虽然网上有很多相关的什么申请开发者账户.appid.openid等资料:但是都是讲的中间的那一部分请原谅我是个菜鸟,脑补开 ...
- 密码暴力破解工具——九头蛇(hydra)使用详解及实战
转载出处:https://zhuanlan.zhihu.com/p/540998739 二.使用方法 语法:Hydra 参数 IP 服务 参数: -l login 小写,指定用户名进行破解 -L fi ...
- 【lwip】15-NETCONN接口
前言 终于到接口层了. 原文:李柱明博客:https://www.cnblogs.com/lizhuming/p/17442931.html 框架描述 前面我们已经学完了,都知道raw接口了,其实 ...
- GIS融合之路(三)CesiumJS和ThreeJS相机同步
同样在这篇文章开始前重申一下,山海鲸并没有使用ThreeJS引擎.但由于ThreeJS引擎使用广泛,下文中直接用ThreeJS同CesiumJS的整合方案代替山海鲸中3D引擎和CesiumJS整合. ...
- 走近高德驾车ETA(预估到达时间)
1. 什么是驾车ETA 临近节假,长途自驾返乡的你是否曾为无法预知路上到底有多堵而纠结?通勤上班,作为有车一族的你是否在为路况变幻莫测的早晚高峰而烦恼?外出旅行,赶火车.赶飞机的你是否还在为担心错过班 ...
- Java在算法竞赛中的一些技巧
转载请注明出处(- ̄▽ ̄)- 谈到算法竞赛中使用Java,那么有一个绕不开的点就是如何快速地输入输出.通常来说,Scanner类固然可以帮助我们顺利地完成各种输入要求,而syso(System.o ...