文章目录

  • 前言
  • 分支机制简述
    • 创建分支
    • 切换分支
  • 基本的分支与合并操作
    • 基本的分支操作
    • 基本的合并操作
    • 基本的合并冲突处理
  • 分支管理
  • 与分支有关的工作流
    • 长期分支
    • 主题分支
  • 远程分支
    • 推送
    • 跟踪分支
    • 拉取
    • 删除远程分支
  • 变基
    • 基本的变基操作
    • 变基操作的潜在危害
    • 只在需要的时候执行变基操作
    • 变基操作与合并操作的对比
  • 总结

前言

几乎每个版本控制系统都支持某种形式的分支功能。分支意味着偏离开发主线并继续你自己的工作而不影响主线开发。在很多版本控制工具中,这么做存在着比较昂贵的成本,因为常常需要去对整个源代码目录进行一次复制,而对于大型项目,这种复制会耗去很长时间。
而Git很好的解决了这个问题,怎么做的?看下面的博客你就懂了。

分支机制简述

要想真正理解Git分支机制,我们要首先回过头来看一下Git是如何存储数据的。
正如前面的博客所言,Git并没有采用变更集(changeset)或是差异的方式存储数据,而是采用一系列快照的方式。
当你发起提交时,Git存储的是提交对象,其中包含了指向存储区快照的指针。提交对象也包括作者姓名和邮箱地址、已输入的提交信息以及指向其父提交的指针。初始提交没有父提交,而一般的提交会有一个父提交;对于两个或多个分支的合并提交来说,存在着多个父提交。
精通Git(三)——Git分支机制-编程知识网

现在Git仓库中有5个对象:3个blob对象(分别保存了你的三个文件的内容)、1个树对象(记录着目录结构以及blob对象和文件名之间的关系),以及一个提交对象(包含着提交的全部元数据和指向根目录树对象的指针)

Git分支只不过是一个指向某次提交的轻量级的可移动指针。Git默认的分支名是master。当你发起提交时,就有了一个指向最后一次提交的master分支。每次提交它都会自动向前移动。

创建分支

创建分支
git branch branch_name
精通Git(三)——Git分支机制-编程知识网

查看各个分支当前所指向的对象。
git log --oneline --decorate
精通Git(三)——Git分支机制-编程知识网

切换分支

操作如下
精通Git(三)——Git分支机制-编程知识网
以上的命令一共做了两件事。他会把HEAD指针(Git的HEAD指针不同于其他版本控制系统,是一个指向当前所在的本地分支的指针
移回到master分支,还会把工作目录的文件恢复到master分支指向的快照的状态。这也就意味着,从这时起,你所做的修改将基于项目的较老版本。总而言之,上述操作回滚了你在testing分支上所做的工作,使你能向另一个方向进行开发工作。
精通Git(三)——Git分支机制-编程知识网

当你准备好了就可以合并这些修改(见后文)
Git中的分支实际上就是一个简单的文件,其中包含了该分支所指向提交的长度为40个字符的SHA-1校验和。正因如此,Git分支创建和删除的成本很低。而且Git提交时保存了父对象的指针,当进行合并操作时Git会自动寻找合适的合并基础,操作起来非常简单。

基本的分支与合并操作

现在我们要展示一个简单的分支和合并案例,其中的工作流可供真实项目借鉴。要遵循的步骤如下:

  • 在网站上开展工作;

  • 为新需求创建分支;

  • 在新分支上展开工作;
    这时,你接到一个电话,说项目有一个很严重问题需要紧急修复。你随后会这样做:

  • 切换到你的生产环境分支;

  • 创建新的分支进行此次问题的热修补工作;

  • 通过测试后,合并热修补分支并推送到生产环境中;

  • 切换回之前的需求分支上继续工作。

基本的分支操作

操作如下
精通Git(三)——Git分支机制-编程知识网

现在,你接到一个电话,说网站突然有个问题需要立即修复。如果没有Git的帮助,你要么把你的修复补丁和issu53的变更一起部署,要么就花费大量精力去恢复之前针对的issu53所做的工作,好让你制作的修复补丁单独上线。如今你要做的就是切换回master分支即可。
但先别急,在你切换分支之前要注意的是,如果你的工作目录或者暂存区存在着未提交的更改,并且这些更改与你要切换的分支冲突。Git就会不允许你切换分支。在切换分支时,最好是保持一个干净的工作区域。后面我们会介绍几种绕过这个问题的办法:存储和修改提交。就现在而言,让我们假定你已经提交了所有更改,操作如下
精通Git(三)——Git分支机制-编程知识网精通Git(三)——Git分支机制-编程知识网

然后删除hotfix分支,切回issu53分支,继续我们的工作
精通Git(三)——Git分支机制-编程知识网
继续操作如下
精通Git(三)——Git分支机制-编程知识网
值得注意的是,issu53分支并不包含你在hotfix分支上做的操作。如果需要上述修补工作并入issu53,就需要执行git merge master使得master分支合并到issu53中,或者可以等到要把issu53合并回master分支时再把热修补的工作整合进来。

基本的合并操作

现在issu53的工作已经完成,我们需要合并回主分支。操作如下
git checkout master
git merge issu53
精通Git(三)——Git分支机制-编程知识网

与之前简单的向前移动分支指针不同,这次Git会基于三方合并的结果创建一个新的快照,然后创建一个提交指向新的快照。这个提交叫做合并提交“。合并提交的特殊性在于它拥有不止一个父提交”
删除issu53分支
精通Git(三)——Git分支机制-编程知识网

基本的合并冲突处理

有时候,上述合并过程并不会那么顺利。如果你在要合并的两个分支上都改了同一个文件的同一部分内容,Git就没办法干净的合并这两个分支。如下
精通Git(三)——Git分支机制-编程知识网
精通Git(三)——Git分支机制-编程知识网

你只需要进入将文件删除,修改成你想要的那样就可以解决了。然后再次合并就OK。
你也可以使用图形化工具来解决冲突git mergetool.
精通Git(三)——Git分支机制-编程知识网

冲突解决后,相应的文件就进入了暂存区,然后使用git commit命令来完成此次合并提交。
精通Git(三)——Git分支机制-编程知识网

分支管理

前面我们已经分析了git branch 与 git branch -v。另外还有两个很有用的选项是--merged--no-merged。这两个选项分别是筛选已并入当前分支的所有分支和筛选尚未并入的所有分支。
查看那些分支已经并入当前分支:
git branch --merged
查看那些分支没有并入到当前分支:
git branch --no-merged
精通Git(三)——Git分支机制-编程知识网
注意:如果你没有合并到当前分支,是不能直接删除的,如果实在想删除就使用-D选项
精通Git(三)——Git分支机制-编程知识网

与分支有关的工作流

长期分支

长期分支指的是在较长时间内多次把一个分支合并到另一个分支上去,而合并的这个分支就用来存放发放版本的代码。
很多使用Git的开发者都喜欢构建他们自己的工作流。例如,其中一种流程就是master分支只存放稳定版本的代码,即已经发布的版本或即将发布的版本的代码。他们还会使用另一个叫做develop或 next的平行分支用于开发,或是用于测试代码的稳定性。

主题分支

与长期分支不同,在任何规模的项目上主题分支都非常有用。主题分支是指短期的,用于实现某一特定的功能及其相关工作的分支。

远程分支

远程分支指的是指向远程仓库的分支指针,这些指针存在于本地且无法被移动。当你与服务器进行任何网络通信时,他们会自动更新。远程分支有点像书签,他们会提示你上一次连接服务器时远程仓库中每个分支的位置。
使用git fetch xxx 命令将远程服务器的数据同步到本地

推送

当需要同别人共享某个分支上的工作成果时,就要把它推送到一个具有写权限的远程仓库。你的本地分支并不会自动同步到远程仓库,必须要显式地推送那些你想与别人共享的分支。
使用git push (remote) (branch)命令即可。
如果不想每次推送时都键入密码,可以设置一个“凭据缓存”。最简单的设置方式就是把凭据信息暂时保存在内存中几分钟,这只需要执行git config --global credential.helper cache命令即可。

跟踪分支

基于远程分支创建的本地分支会自动成为跟踪分支,或者有时候也叫做游分支。
跟踪分支是远程分支直接关联的本地分支。如果

拉取

git fetch命令会拉取本地没有的远程所有最新更改数据,但这条命令完全不会更改你的工作目录。它只会从服务器上读取数据,然后让你自己进行合并。初次之外,还有一个git pull命令,这条命令在大多数情况下基本等同于git fetch + git merge

删除远程分支

当你和你的同事已经完成一个功能,并且把工作合并到了远程的master分支之后,你已经不再需要包含这个功能的远程分支了。可以通过git push --delete选项来删除远程分支。
基本上可以说,以上命令只是删除了远程服务器上的分支指针。Git会保留数据一段时间,直到下一次触发垃圾回收。所以,即使误删了分支,一般来说也很容易进行恢复。

变基

在Git中,要把更改从一个分支整合到另一个分支,有两种主要方式:合并和变基。

基本的变基操作

之前我们讲过,要整合不同的分支,最简单的办法就是使用merge命令。该命令会对两个分支上的最新提交快照以及这两个提交快照最近的共同祖先,进行一次三方合并,并创建一个新的合并提交。实际上,除了上述方式之外还有一种方式:你可以把另一个分支的提交的更改以补丁的形式应用到另一个分支上。这种操作就叫做变基。使用如下命令
git checkout xxx
git rebase master
变基的工作原理是:首先找到两个要整合的分支(你当前的分支和要整合到的分支)的共同祖先,然后取得当前所在分支的每次提交引入的更改(diff),并把这些更改保存为临时文件,这之后将当前分支重置为要整合的分支,最后在该分支上依次引入之前保存的每个更改。
总结:
变基就是把某条开发分支线上的工作在另一个分支线上按顺序重现。而合并操作则是找出两个分支的末端,并把他们合并在一起。

变基操作的潜在危害

变基操作可以带来种种好处。但它并不是完美无缺、其缺点可以总结成一句话:不要对已经存在于本地仓库之外的提交执行变基操作。——即不要对已经推送到远程服务器的公开提交进行变基操作。
这是因为在执行变基操作时,实际上是抛弃了已有的某些提交,随后创建了新的对应提交。

只在需要的时候执行变基操作

如果你将变基操作看作在推送数据前整理和处理提交的一个手段,并且你只对那些仅存在于本地还没有公开的提交进行变基操作,那么一切都不会有问题。反之,如果你对那些已经推送了的提交执行变基操作,而这时其他人可能已经基于这些提交进行了自己的开发工作,那么那就可能会遇到大麻烦,使用git pull --reabse = git fetch + git rebase remote/branch来减轻你的痛苦。

变基操作与合并操作的对比

区别:合并不会更改实际的历史记录,变基则会更改历史记录。结合这两种操作的优点的操作方式是,对本地尚未推送的更改进行变基操作,从而简化提交历史,但绝不能对任何已经推送到服务器的更改进行变基操作。

总结

相信现在你应该可以自由创建和切换到新的分支,在不同的分支之间切换,并对本地的不同分支进行合并操作。你也应该可以将你的分支推送到远程服务器来分享你的工作成果,与其他人在某个分支上进行协作,对本地尚未推送的分支进行变基操作。
后面将对如何搭建自己的Git仓库托管服务器进行分析和学习。

查看全文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/191367.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章:

精通Git(三)——Git分支机制-编程知识网

精通Git(三)——Git分支机制

文章目录前言分支机制简述创建分支切换分支基本的分支与合并操作基本的分支操作基本的合并操作基本的合并冲突处理分支管理与分支有关的工作流长期分支主题分支远程分支推送跟踪分支拉取删除远程分支变基基本的变基操作变基操作的潜在危害只在需要的时候执行变基操作变基操作与……

精通Git(三)——Git分支机制-编程知识网

彻底理解Java并发:synchronized关键字

本篇内容包括:Synchronized 关键字简介、synchronized 的修饰对象、对象的内存布局(64位)、Synchronized 锁升级过程等内容。 一、Synchronized 关键字简介
Synchronize 翻译成中文:同步,使同步。synchronized&#x……

精通Git(三)——Git分支机制-编程知识网

15-奇异值分解

奇异值分解1-奇异值分解的定义与性质1.1 定义1.2 紧奇异值分解1.3 截断奇异值分解1.4 几何解释2-奇异值分解与矩阵近似2.1 弗罗贝尼乌斯范数2.2 矩阵的最优近似2.3 矩阵的外积展开导读: 奇异值分解singular value decomposition-SVD:是一种矩阵因子分解方法&#xf……

精通Git(三)——Git分支机制-编程知识网

React面向组件编程(定义组件,组件三大核心属性,组件事件处理、组件收集表单数据、高阶函数和函数的柯里化)

目录
一、React中定义组件
1、函数式组件
2、类式组件
二、组件三大核心属性
1、组件三大核心属性1: State(状态)
2、组件三大核心属性2: props
3、组件三大核心属性3: ref 三、组件事件处理
1、事件处理 四、组件收集表单数据
1、受控组件
2、非受控组件 五、高阶函……

精通Git(三)——Git分支机制-编程知识网

水文水资源-智慧水务水利监测方案 水文自动测报系统 降水量、流量、流速

平升电子水文水资源-智慧水务水利监测方案水文自动测报系统实现对江河流域水位、降水量、流量、流速、水质、闸门开启度、墒情等数据的实时采集、报送和处理。为防汛抗旱减灾提供科学依据和有效信息共享,保障人民群众生命财产安全,满足水利和经济社会发展……

精通Git(三)——Git分支机制-编程知识网

[兔子私房课]MybatisPlus开发详解与项目实战01

目录 一分钟了解Mybatis-plus
特性
学会Mybatis-plus,我们能简化哪些操作
快速入门
1. 引入依赖
2. 数据准备
3. 配置文件
4. Bean
5. Mapper
6. 启动类
7. 测试类
开启SQL日志
为什么UserMapper继承了BaseMapper就有了selectList方法?
SQL……

精通Git(三)——Git分支机制-编程知识网

Unity计算着色器视频教程

Unity计算着色器视频教程
利用 GPU 的力量
课程英文名:Learn to Write Unity Compute Shaders
此视频教程共14.0小时,中英双语字幕,画质清晰无水印,源码附件全 下载地址
课程编号:303 百度网盘地址:htt……

精通Git(三)——Git分支机制-编程知识网

maven项目排除/屏蔽parent的plugin

parent有两个module,其中module-web依赖module-api,
parentmodule-apimodule-web其中module-api是一些基础的东西,module-web是将来要部署的项目,
maven项目中,parent的pom里定义了插件:
<build>&……

精通Git(三)——Git分支机制-编程知识网

java 内部类

小镇做题家
前段时间很火的一个话题“小镇做题家”,我没有具体了解,我以为是在鼓励一些努力拼搏的人。
某一天,禁不住好奇,我打开了百度百科,看了看小镇做题家的解释 就是指一些村里或者小镇的人,通过学习……

精通Git(三)——Git分支机制-编程知识网

Ribbon源码解析

基于 spring-cloud-starter-netflix-ribbon-2.2.5.RELEASE。 0. 目录1. 测试用例2. 源码解读2.1 AutoConfig之 LoadBalancerAutoConfiguration2.2 AutoConfig之 RibbonAutoConfiguration2.3 执行阶段 – LoadBalancerInterceptor(实现负载均衡的入口)2.4 执行阶段 – RibbonLoadB……

精通Git(三)——Git分支机制-编程知识网

【面试题 高逼格利用 类实现加法】编写代码, 实现多线程数组求和.

编写代码, 实现多线程数组求和.关键1. 数组的初始化关键2. 奇偶的相加import java.util.Random;public class Thread_2533 {public static void main(String[] args) throws InterruptedException {// 记录开始时间long start System.currentTimeMillis();// 1. 给定一个很长的……

精通Git(三)——Git分支机制-编程知识网

一个python训练

美国:28:麻省理工学院,斯坦福大学,哈佛大学,加州理工学院,芝加哥大学,普林斯顿大学,宾夕法尼亚大学,耶鲁大学,康奈尔大学,哥伦比亚大学,密歇根大学安娜堡分校,约翰霍普金斯大学,西北大学,加州大学伯克利分校,纽约大学,加州大学洛杉矶分校,杜克大学,卡内基梅隆大学,加州大学圣地……

精通Git(三)——Git分支机制-编程知识网

Mybatis03学习笔记

目录 使用注解开发
设置事务自动提交
mybatis运行原理
注解CRUD
lombok使用(偷懒神器,大神都不建议使用)
复杂查询环境(多对一)
复杂查询环境(一对多)
动态sql环境搭建
动态sql常用标签……

精通Git(三)——Git分支机制-编程知识网

设置或取得c# NumericUpDown 编辑框值的方法,(注意:不是Value值)

本人在C#开发中使用到了NumericUpDown控件,但是发现该控件不能直接控制显示值,经研究得到下面的解决办法
NumericUpDown由于是由多个控件组合而来的控件,其中包含一个类似TextBox的控件,若想取得或改变其中的值要使用如下方法
N……

精通Git(三)——Git分支机制-编程知识网

使用NPOI 技术 的SetColumnWidth 精确控制列宽不能成功的解决办法(C#)

在使用NPOI技术开发自动操作EXCEL软件时遇到不能精确设置列宽的问题。

ISheet sheet1 hssfworkbook.CreateSheet("Sheet1");
sheet1.SetColumnWidth(0, 50 * 256); // 在EXCEL文档中实际列宽为49.29
sheet1.SetColumnWidth(1, 100 * 256); // 在EXCEL文……

精通Git(三)——Git分支机制-编程知识网

Mysql 数据库zip版安装时basedir datadir 路径设置问题,避免转义符的影响

本人在开发Mysql数据库自动安装程序时遇到个很奇怪的问题,其中my.ini的basedir 的路径设置是下面这样的:
basedir d:\测试\test\mysql
但是在使用mysqld安装mysql服务时老是启动不了,报1067错误,后来查看window事件发现一个独特……

精通Git(三)——Git分支机制-编程知识网

java stream sorted排序 考虑null值

项目里使用到排序, java里没有像C# 里的linq,只有stream,查找stream.sorted源码看到有个
Comparator.nullsLast
然后看了一下实现,果然是能够处理null值的排序,如:minPriceList.stream().sorted(Comparator.comparing(l -> l.g……

精通Git(三)——Git分支机制-编程知识网

spring @EnableConfigurationProperties 实现原理

查看DataSourceAutoConfiguration源码,发现如下代码: Configuration ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) EnableConfigurationProperties(DataSourceProperties.class) Import({ DataSourcePoolMetadataProvidersCon……

精通Git(三)——Git分支机制-编程知识网

postman请求https网址没有响应,但是用浏览器有响应,解决办法

遇到个问题:同一个get请求的url,postman请求https网址没有响应,但是用浏览器有响应
url是https开头的,查看错误描述里有一个SSL的选项: 然后根据描述关掉这个选项: 然后就没问题了,能正常请求及……

精通Git(三)——Git分支机制-编程知识网

java @Inherited注解的作用

看到很多注解都被Inherited进行了修饰,但是这个Inherited有什么作用呢?
查看Inherited代码描述:
Indicates that an annotation type is automatically inherited. If an Inherited meta-annotation is present on an annotation type decl……