《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,从已有的分支创建新 ...
随机推荐
- selenium 执行js脚本
使用 selenium 直接在当前页面中进行js交互 使用selenium 执行 Js 脚本 要使用 js 首先要知道 js 怎么用,现在举个简单得例子,就用12306举例子, 它的首页日期选择框是只 ...
- 2021-07-31:给定数组father,大小为N,表示一共有N个节点,father[i] = j 表示点i的父亲是点j, father表示的树一定是一棵树而不是森林,给定数组values,大小为N
2021-07-31:给定数组father,大小为N,表示一共有N个节点,father[i] = j 表示点i的父亲是点j, father表示的树一定是一棵树而不是森林,给定数组values,大小为N ...
- SICP:元循环求值器(Python实现)
求值器完整实现代码我已经上传到了GitHub仓库:TinySCM,感兴趣的童鞋可以前往查看.这里顺便强烈推荐UC Berkeley的同名课程CS 61A. 在这个层次结构的最底层是对象语言.对象语言只 ...
- Django4全栈进阶之路4 APP注册
在 Django 4 中,应用(app)的注册是通过在项目的 settings.py 文件中添加应用名称来实现的.具体步骤如下: 在项目的根目录下创建一个应用目录,该目录应包含一个 apps.py 文 ...
- 计蒜客蓝桥杯省赛模拟G
题目 一天蒜头君得到 n 个字符串 si,每个字符串的长度都不超过 1010. 蒜头君在想,在这 n 个字符串中,以 si 为后缀的字符串有多少个呢? 输入格式 第一行输入一个整数 n. 接下来 n ...
- 各种版本的Linux 镜像下载网址
今天发现Linux 镜像下载网址感觉很不错,分享给有需要的小伙伴们 访问地址 Linux操作系统各版本ISO镜像下载(包括oracle linux\redhat\centos\ubuntu\debia ...
- 如何洞察 C# 程序的 GDI 句柄泄露
一:背景 1. 讲故事 前段时间有位朋友找到我,说他的程序界面操作起来很慢并且卡顿等一些不正常现象,从任务管理器看了下 GDI句柄 已经到 1w 了,一时也找不出什么代码中哪里有问题,让我帮忙看下,其 ...
- java调用WebService(未完成)记录篇
背景: 因工作需要和一个Sap相关系统以WebService的方式进行接口联调,之前仅听过这种技术,但并没有实操过,所以将本次开发相关的踩坑进行记录 通过一个实例来认识webservice 服务端 首 ...
- 检测到 #include 错误。请更新 includePath。已为此翻译单元 禁用波形曲线
也有可能是VSCode抽风了 重启就好
- Stable Diffusion AIGC:3步成为P图大师
摘要:instructPix2Pix文字编辑图片是一种纯文本编辑图像的方法,用户提供一张图片和文本编辑指令,告诉模型要做什么,模型根据编辑指令编辑输入的图像,最终输出用户想要的图像. 本文分享自华为云 ...