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、版本发布、多人协作等...

当我们完成新分支的任务后,可能需要将该分支合并到主分支。合并呢,也会遇到多种情况。比如,

  1. 待合并分支与目标分支是包含关系,其中目标分支是待合并分支的父分支,且从目标分支到待合并分支的提交历史是线性的,这种合并是没有冲突的。完成合并后,当前分支指针指向了待合并分支的最新提交。这称为快进合并(Fast-Forward)。

  2. 待合并分支与目标分支从公共祖先处分叉,这种情况下,带合并分支、目标分支与两者的公共祖先分支三者做合并。与快进合并不同的是,git会做一个新快照并创建一个提交指向它,这称为一次合并提交

  3. 如果你在两个不同的分支中,对同一个文件的同一个地方进行了不同修改,合并它们的时候就会发生合并冲突,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分支笔记的更多相关文章

  1. 《Pro Git》学习笔记

    1.Git远程模型示意图 Remote:远程仓库 Repository:本地仓库 Index:暂存区 workspace:当前工作区 2.取得Git仓库 2.1 初始化新仓库     git init ...

  2. git学习小结 (笔记)

    Modesty helps one to go forward, whereas conceit makes one lag behind. "虚心使人进步,骄傲使人落后" 注:本 ...

  3. git的学习笔记(二):git远程操作

    1.创建ssh key ssh-keygen -t rsa -C "your_email@example.com" 执行命令后会在用户的家目录生成.ssh的隐藏文件夹,文件夹里有公 ...

  4. HIT2019春软件构造->Git&Github学习笔记

    由于软件构造课程需要,学习使用git,以下作为学习笔记. 一.Git初始化及仓库创建和操作  1.基本信息设置(设置签名)  命令        项目级别/仓库级别:仅在当前本地库范围内有效 git ...

  5. Git Flow 分支管理简述

    概述 Git 是什么 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的 ...

  6. git tag 常用笔记

    git tag 常用笔记 查看 tag 列出现有 tag git tag 列出 v1.4.2 相关的 tag git tag -l "v1.4.2" 查看指定 tag 的信息 gi ...

  7. Git源代码管理笔记

    很早之前也学过git但是没有详细的记录,这次是做个复习,巩固 若有不对的地方请您指出 目录 Git和SVN有什么区别? 什么是Git? github仓库 Star和Fork Pull request ...

  8. [常用工具] git基础学习笔记

    git基础学习笔记,参考视频:1小时玩转 Git/Github 添加推送信息,-m= message git commit -m "添加注释" 查看状态 git status 显示 ...

  9. Git多分支 远程仓库 协同开发以及解决冲突

    目录 一.Git多分支及远程仓库 1.Git多分支 2.正常密码链接远程仓库 3.ssh公钥私钥方式链接远程仓库 三.协同开发及解决冲突 1.协同开发 2.解决冲突 四.线上分支合并及远程仓库回滚 1 ...

  10. git 创建分支 并 提交到远程分支

    git branch(分支命令的使用http://hbiao68.iteye.com/blog/2055493 0.可以通过git branch -r 命令查看远端库的分支情况 1,从已有的分支创建新 ...

随机推荐

  1. 这个字段我明明传了呀,为什么收不到 - Spring 中首字母小写,第二个字母大写造成的参数问题

    问题现象 vSwitchId.uShape.iPhone... 这类字段名,有什么特点?很容易看出来吧,首字母小写,第二个字母大写.它们看起来确实是符合 Java 中对字段所推崇的"小驼峰命 ...

  2. 面试精灵:Java后端靠谱、强大的面试题网站(稳拿offer)

    ​面试精灵:一个给力的Java后端面试题网站. 网址:https://offer.skyofit.com 这套题真实.高频.全面.有详细答案.保你稳过面试,让你成为offer收割机.题目包括:Java ...

  3. 2022-11-06:给定平面上n个点,x和y坐标都是整数, 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。 返回最短距离,精确到小数点后面4位。

    2022-11-06:给定平面上n个点,x和y坐标都是整数, 找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的. 返回最短距离,精确到小数点后面4位. 答案2022-11- ...

  4. 2022-08-17:以下go语言代码输出什么?A:运行时 panic;B:32;C:编译错误;D:0。 package main func main() { var x *struct {

    2022-08-17:以下go语言代码输出什么?A:运行时 panic:B:32:C:编译错误:D:0. package main func main() { var x *struct { s [] ...

  5. 2022-08-14:k8s安装PostgreSQL,yaml如何写?

    2022-08-14:k8s安装PostgreSQL,yaml如何写? 答案2022-08-14: yaml如下: apiVersion: apps/v1 kind: Deployment metad ...

  6. vue全家桶进阶之路38:Vue3 组件内部路由守卫

    在 Vue Router 中,可以为路由和路由组件注册全局的路由守卫,也可以在组件内部注册路由守卫. 组件内部的路由守卫有以下几种: beforeRouteEnter:在路由进入组件前被调用,但是在组 ...

  7. 没想到还有这种骚操作~如何使用Golang实现无头浏览器截图?

    前言 在Web开发中,有时需要对网页进行截图,以便进行页面预览.测试等操作. 而使用无头浏览器来实现截图功能,可以避免手动操作的繁琐和不稳定性. 这篇文章将介绍:使用Golang进行无头浏览器的截图, ...

  8. POJ - 2251 地下城主

    You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...

  9. Kali安装GVM

    1.安装gvm ┌──(rootkali)-[/home/kali] └─# gvm-setup 1 ⨯ [>] Starting PostgreSQL service [-] ERROR: T ...

  10. 「Python实用秘技14」快速优化Python导包顺序

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第14 ...