『现学现忘』Git分支 — 41、分支基本操作(二)
提示:接上篇
6、新建一个分支并且使分支指向指定的提交对象
使用命令:git branch branchname commitHash。
我们现在本地库中只有一个 master 分支,并且在 master 分支有三个提交历史。
需求:创建一个 testing 分支,并且testing 分支指向 master 分支第二个版本。
# 1.查看提交历史记录
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git log --graph --oneline
* b97ccfd (HEAD -> master) 第3次提交,新增内容:branch test v3
* f72a9fe 第2次提交,新增内容:branch test v2
* fa2439a 第1次提交,新增readme.txt文件
# 2.创建testing分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git branch testing f72a9fe
# 3.查看提交历史记录,此时我们还在master分支上
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git log --graph --oneline
* b97ccfd (HEAD -> master) 第3次提交,新增内容:branch test v3
* f72a9fe (testing) 第2次提交,新增内容:branch test v2
* fa2439a 第1次提交,新增readme.txt文件
# 4.切换到testing分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git checkout testing
Switched to branch 'testing'
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git log --graph --oneline
* f72a9fe (HEAD -> testing) 第2次提交,新增内容:branch test v2
* fa2439a 第1次提交,新增readme.txt文件
# 5.再来查看readme.txt文件内容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ cat readme.txt
branch test v1
branch test v2
如上,我们看到新创建的 testing 分支,创建在master分支的第二个版本上了。
HEAD 指针的移动状态如下图:
执行git branch testing f72a9fe命令,创建testing 分支后:

执行git checkout testing命令,切换分之后:

总结:
在日常工作中,我们可以这样的操作,切换到之前的版本,或者其他人之前写过的版本。我们把自习需要的代码进行保存,然后就可以在切换到自己开发的分支上,应用这些代码,同时把刚才创建的分支删除掉即可。
(该操作在工作中非常的实用)
7、思考:
git checkout -b branchname commit-Hash命令,
能否代替下面两个命令:
git branch branchname commitHashgit checkout branchname
答案是可以的。
示例如下:
# 1.查看本地库中所有的分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git branch
* master
# 2.查看当前分支的提交历史
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git log --oneline
b97ccfd (HEAD -> master) 第3次提交,新增内容:branch test v3
f72a9fe 第2次提交,新增内容:branch test v2
fa2439a 第1次提交,新增readme.txt文件
# 3.创建testing分支,并切换
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git checkout -b testing f72a9fe
Switched to a new branch 'testing'
# 4.查看testing分支的提交历史
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git log --oneline
f72a9fe (HEAD -> testing) 第2次提交,新增内容:branch test v2
fa2439a 第1次提交,新增readme.txt文件
# 5.查看readme.txt是否是V2版本
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ cat readme.txt
branch test v1
branch test v2
8、项目分叉历史的形成
查看当前版本库的如上,此刻正在 testing 分支的上工作,在 readme.txt 文件在第二个版本。
需求:我需要在 testing 分支的上,修改 readme.txt 文件,并提交新版本。
# 1.查看版本库状态
# 分支情况
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git branch
master
* testing
# 分支的提交历史
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git log --oneline
f72a9fe (HEAD -> testing) 第2次提交,新增内容:branch test v2
fa2439a 第1次提交,新增readme.txt文件
# 2.修改readme.txt文件并提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ echo "branch test v333 testing" >> readme.txt
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git commit -a -m 'testing 分支的提交'
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory
[testing 7ba443e] testing 分支的提交
1 file changed, 1 insertion(+)
# 3.查看testing分支历史提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git log --oneline --graph
* 7ba443e (HEAD -> testing) testing 分支的提交
* f72a9fe 第2次提交,新增内容:branch test v2
* fa2439a 第1次提交,新增readme.txt文件
# 4.查看所有分支的历史提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ git log --oneline --graph --all
* 7ba443e (HEAD -> testing) testing 分支的提交
| * b97ccfd (master) 第3次提交,新增内容:branch test v3
|/
* f72a9fe 第2次提交,新增内容:branch test v2
* fa2439a 第1次提交,新增readme.txt文件
我们可以看到,现在这个项目的提交历史已经产生了分叉。
在实际工作中,是因为你创建了一个新分支,并切换过去进行了一些工作,可能随后又切换回 master 分支进行了另外一些工作,这样针对的是不同分支进行改动,就会在工作目录中产生项目的分叉历史。
你可以在不同分支间不断地来回切换和工作,并在时机成熟时将它们合并起来。 而所有这些工作,你需要的命令只有
branch、checkout和commit。
此时 HEAD 指针的状态如下图:

9、分支的总结
由于 Git 的分支实质上仅是包含,所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效。 创建一个新分支就相当于往一个文件中写入 41 个字节(40 个字符和 1 个换行符),如此的简单能不快吗。
这里简单说明一下:
# 1.查看.git/refs/heads目录
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ ll .git/refs/heads/
total 2
-rw-r--r-- 1 L 197121 41 4月 16 22:07 master
-rw-r--r-- 1 L 197121 41 4月 17 11:26 testing
# 可以看到.git/refs/heads目录存放的是版本库中的分支。
# 2.查看testing文件只呢个中的内容给
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ cat .git/refs/heads/testing
7ba443e4f6591631af4276bd3aa7356ff0f61fac
# 可以看到是一个提交的索引,对比上图中的`7ba443e`提交,你就明白了。
# 3.在往深说一点,查看.git/HEAD文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (testing)
$ cat .git/HEAD
ref: refs/heads/testing
# .git/HEAD文件就是之前说的HEAD指针,指向了当前正在工作的分支。
# 是不是一切都非常的简单高效。
这与过去大多数版本控制系统形成了鲜明的对比,它们在创建分支时,将所有的项目文件都复制一遍,并保存到一个特定的目录。 完成这样繁琐的过程通常需要好几秒钟,有时甚至需要好几分钟。所需时间的长短,完全取决于项目的规模。
而在 Git 中,任何规模的项目都能在瞬间创建新分支。 同时,由于每次提交都会记录父对象,所以寻找恰当的合并基础(即共同祖先)也是同样的简单和高效。 这些高效的特性使得 Git 鼓励开发人员频繁地创建和使用分支。
『现学现忘』Git分支 — 41、分支基本操作(二)的更多相关文章
- 『现学现忘』Git分支 — 38、Git分支介绍
目录 1.Git分支简介 2.Git分支与SVN分支的区别 3.工作中为什么要使用分支 4.Git分支管理的好处 1.Git分支简介 几乎所有的版本控制系统都以某种形式支持分支. 使用分支意味着,你可 ...
- 『现学现忘』Git基础 — 5、Git的协作模式
目录 1.分布式工作流程 2.集中式工作流 3.分支工作流 4.GitFlow 工作流(最流行) 5.Forking 工作流(偶尔使用) 6.总结 1.分布式工作流程 与传统的集中式版本控制系统(CV ...
- 『现学现忘』Git后悔药 — 27、版本回退介绍
目录 1.什么版本回退 2.需要了解两个知识点 (1)HEAD是什么 (2)HEAD指针用法 3.git reflog命令介绍 1.什么版本回退 版本回退也可以叫回滚. 若修改过的文件,不仅添加到了暂 ...
- 『现学现忘』Git分支 — 39、Git中分支与对象的关系
目录 1.Git对象之间的关系 2.提交对象与分支的关系 (1)提交对象与分支的关系 (2)分支说明 (3)HEAD与分支的关系 1.Git对象之间的关系 我们之前学了Git的三个对象:提交对象.树对 ...
- 『现学现忘』Git分支 — 40、分支基本操作(一)
目录 1.创建分支 (1)创建分支 (2)图示理解 2.查看分支列表 3.分支切换 4.查看所有分支的最后一个提交 5.删除分支 1.创建分支 (1)创建分支 Git 是怎么创建新分支的呢? 很简单, ...
- 『现学现忘』Git对象 — 16、Tree对象详解
目录 1.Tree对象介绍 2.Tree对象说明 (1)初始化一个新的本地版本库 (2)创建一个树对象(重点) (3)创建第二个文件(重点) (4)将第一个树对象加入暂存区,使其成为新的树对 3.总结 ...
- 『现学现忘』Git基础 — 21、git diff命令
目录 1.git diff 命令说明 2.比较工作区与暂存区中文件的差别 3.比较暂存区与本地库中文件的差别 4.总结git diff命令常见用法 5.总结 1.git diff 命令说明 在comm ...
- 『现学现忘』Git基础 — 2、Git和SVN的区别
1.Git和SVN的区别 (1)SVN(集中式版本管理系统) 集中式的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者 ...
- 『现学现忘』Git基础 — 3、Git介绍
目录 1.Git的历史 2.Git的特点 3.Git在项目协作开发中所解决的问题 1.Git的历史 Git是目前世界上最先进的分布式版本控制系统,开源.免费. Git 是 Linus (林纳斯)为了帮 ...
随机推荐
- (WebFlux)002、如何打印日志与链路ID
一.背景 最近在持续改造项目,想通过日志查看用户所有的接口链路日志.在原来基于SpirngMVC的时候,那是比较好处理的,通过ThreadLocal,放入TraceId,就可以把一个TraceId传到 ...
- Java四大引用详解:强引用、软引用、弱引用、虚引用
面试官考察Java引用会问到强引用.弱引用.软引用.虚引用,具体有什么区别?本篇单独来详解 @mikechen Java引用 从JDK 1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活 ...
- LuoguP2254 [NOI2005]瑰丽华尔兹 (单调队列优化DP)(用记忆化过了。。。)
记忆化 #include <cstdio> #include <iostream> #include <cstring> #include <algorith ...
- vivo 基于 JaCoCo 的测试覆盖率设计与实践
作者:vivo 互联网服务器团队- Xu Shen 本文主要介绍vivo内部研发平台使用JaCoCo实现测试覆盖率的实践,包括JaCoCo原理介绍以及在实践过程中遇到的新增代码覆盖率统计问题和频繁发布 ...
- [CISCN2019 华北赛区 Day1 Web2]ikun-1|python反序列化
考点:JWT身份伪造.python pickle反序列化.逻辑漏洞 1.打开之后首页界面直接看到了提示信息,信息如下: 2.那就随便注册一个账号进行登录,然后购买lv6,但是未发现lv6,那就查看下一 ...
- Kingbase V8R6集群安装部署案例---脚本在线一键缩容
案例说明: KingbaseES V8R6支持图形化方式在线缩容,但是在一些生产环境,在服务器不支持图形化界面的情况下 ,只能通过脚本命令行的方式执行集群的部署或在线缩容. Tips: Kingb ...
- KingbaseES函数如何返回结果集
函数返回值一般是某一类型值,如int,varchar,date等,返回结果集时就需要用到setof语法. 创建数据 create table class(id number primary key, ...
- Job And Schedule (V8R6C4)
KingbaseES 数据库提供了 kdb_schedule 扩展,使得用户能通过类似oracle job 的方式进行job调用.kdb_schedule 提供了三个Schema :dbms_job ...
- 聊聊单点登录(SSO)中的CAS认证
SSO介绍 背景 随着企业的发展,一个大型系统里可能包含 n 多子系统, 用户在操作不同的系统时,需要多次登录,很麻烦,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录. web 系 ...
- Windows 2012 R2上搭建IIS管理用户的隔离模式FTP
Windows 2012 R2上搭建IIS管理用户的隔离模式FTP Windows自带的FTP现在可以提供基于非OS用户的管理,这提高了安全性.即使FTP用户名和密码泄露,也不会对操作系统造成进一步的 ...