Git工作流

实际开发项目使用到的分支:

main:生产环境,也就是你们在网上可以下载到的版本,是经过了很多轮测试得到的稳定版本。
release: 开发内部发版,也就是测试环境。
dev:所有的feature都要从dev上checkout。
feature:每个需求新创建的分支。
下面介绍一下一个新需求过来的git操作流程:
1.从dev分支上checkout -b new-feature,进行开发
2.开发完后,经过自测没问题了,准备发版
3.merge到release分支上进行发版,并打tag
4.有bug就直接在release上进行修改,改完再次发版,打tag,直到测试人员验证完毕
5.这时可以将release分支合并到dev上,也可以删除掉feature分支了,并等待通知是否将此功能上线(发布正式版本,也就是在正式服务器上运行),如果上线,那就merge到main(master)分支,当然了有可能需要将ip改为生产服务器的地址,并打上一个official tag。
6.如果上线后,发现有bug,如果此时main分支已经又合并上新功能B了,但是这个临时的版本又不想包含B的功能,那么可以切换到上次的official tag,checkout -b一个hotfix分支进行bug修复,hotfix分支要进行保留,不能删除。测试没问题就可以发版了,最后可以合并到main上。
一般的项目这套流程应该就足够了。所有的发版tag都会集中到release,main,hotfix分支上,所有的需求都会从dev上拉取,这样能保证代码是完整可用的,是经过每次release合并过来的

指令及其含义

  • git checkout -b xxx:git checkout xxx是指切换到xxx(用local区的xxx替换disk区文件),-b意味着branch,即创建新分支,这条指令合起来意思是创建并切换到xxx。
  • git diff:查看暂存区与disk区文件的差异。
  • git add xxx:将xxx文件添加到暂存区。
  • git commit:将暂存区内容添加到local区的当前分支中。
  • git push :将local区的LocalBranchName分支推送到RemoteHostName主机的同名分支。(若加-f表示无视本地与远程分支的差异强行push)
  • git pull :同上,不过改成从远程主机下载远程分支并与本地同名分支合并。
  • git rebase xxx:假设当前分支与xxx分支存在共同部分common,该指令用xxx分支包括common在内的整体替换当前分支的common部分(原先xxx分支内容为common->diversityA,当前分支内容为common->diversityB,执行完该指令后当前分支内容为common->diversityA->diversityB)。
  • git branch -D xxx:不加-D表示创建新local分支xxx,加-D表示强制删除local分支xxx。

工作流一:

在这里插入图片描述

  1. git clone remote// 到本地
  2. git checkout -b feature 切换至新分支feature ,没有就创建
  3. 修改或者添加本地代码(部署在硬盘的源文件上)
  4. git diff 查看自己对代码做出的改变
  5. git add 上传更新后的代码至暂存区
  6. git commit 可以将暂存区里更新后的代码更新到本地git
  7. git push origin feature将本地的feature分支上传至github上的git

如果在写自己的代码过程中发现远端GitHub上master分支代码出现改变

  1. git checkout master切换回master分支
  2. git pull origin master将远端修改过的代码再更新到本地
  3. git checkout feature回到feature分支
  4. git rebase master把我的修改先都放在一边,然后把master最新的修改拿过来,接着在这个最新修改的基础之上,再把我的commit尝试弄回去,中途可能会出现rebase conflict手动选择保留哪段代码,就相当于我们在最新的master分支上做了修改 ,这也是使用rebase而不是使用merge的好处
  5. git push -f origin feature把rebase后并且更新过的代码再push到远端github上,由于做了rebase所以需要加上-f ,-f表示强行,强行push
  6. 把更新的代码合并到远程master分支里面,pull request的意思是request项目的主人把我这个新的分支的改变给pull到这个项目里去。原项目主人采用pull request 中的 squash and merge 合并所有不同的commit

远端完成更新后

  1. github删除个人远程分支feature
  2. 本地切换到主分支git checkout master && git branch -d feature删除本地的git分支
  3. git pull origin master 再把远端的最新代码拉至本地,这时我们的本地仓库就又和远程一样了。

工作流二:

远程仓库有两个master和test分支

  1. git clone remote克隆仓库
  2. git checkout -b feature切换分支,没有就会新创建并切换
  3. 编写代码并提交本地仓库
  4. 推送到远程test分支
  5. git checkout -b test origin/test意思是切换一个分支,如果分支不存在就会创建并切换到test分支,后面origin/test是指从远程test克隆下来,并与本地test分支建立联系,这时,文件里没有新编写的代码。
  6. 切换到feature分支使用git log查看提交历史记录,记录以前提交的哈希值
  7. 切换到test分支,使用git cherry-pick 哈希值,这时代码就同步过来了,可以再次使用git log查看。
  8. git push到远程test分支
  9. 同步到远程master分支,如果此时远程master分支有更新,需要切换到master分支使用git pull保证本地master分支是最新的,然后使用git cherry-pick 哈希值,这时代码就同步过来了,可以再次使用git log查看,再push到远程分支。

工作流三: git pull

  1. 本地修改代码,远程也更新代码,产生冲突
  2. 使用git pull后需要手动merge
  3. git add .
  4. git commit -m “合并冲突”
  5. git push
  6. git log --graph
    在这里插入图片描述

缺点:提交记录出现分叉,出现很多奇怪的提交记录。

工作流四: git pull --rebase优化提交记录

现象:提交记录出现分叉,出现很多奇怪的提交记录。

业务场景:

在本地分支完成了我功能的开发,现在需要合并到test 分支上,于是我的目标是在test 分支上执行git cherry-pick操作将我的代码检出到test上,因为我要避免有人更新过test分支,所以我在此之前先执行了一下git pull ,出现了一个Merge的vi窗口(过去我一直没注意, 直接就wq出去
.了),其实这个就是导火索! vi窗口如下:

原因

git pull 其实是一个组合操作,其会执行git fetch + git merge (过去其实完全不知道) , 因为
有git merge的存在,所以最后的提交记录看起来就会很乱。

解决方案

使用git pull --rebase 来进行合并本地和远程分支。既可以完美解决这个问题!
git pull --rebase 也是一个组合操作, 其会执行git fetch + git rebase ,我们知道git rebase 就
是解决凌乱记录的一个大杀器,所以可以完美的解决!

  1. 本地修改代码,远程也更新代码,产生冲突
  2. 使用git pull --rebase origin test需要手动处理冲突
    在这里插入图片描述
    current change变为了远程,意味着更新版本是以远程为基础的大的提交,不会是含有本地每次小的提交。
  3. git add .
  4. git rebase --continue
  5. wq即可
  6. git push
  7. git log --graph
    在这里插入图片描述
    这样操作之后我们的提交记录就是非常干净的一条链路了!
    在这里插入图片描述
    补充:
git log --graph

更加清晰的结构查看log记录。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.netcore发布独立版部署

.NetCore 在发布独立版时会打包独立环境,就算服务没有安装环境也能运行,这就是.NetCore跨平台的特性之一。 按照微软的传统配套,c#开发的项目一般都是发布打包程序部署在iis,但是.netcore 跨平台的,就是说当发布独立版…

【BASH】回顾与知识点梳理(三十九)

【BASH】回顾与知识点梳理 三十九 三十九. make、tarball、函数库及软件校验39.1 用 make 进行宏编译为什么要用 makemakefile 的基本语法与变量 39.2 Tarball 的管理与建议使用原始码管理软件所需要的基础软件Tarball 安装的基本步骤一般 Tarball 软件安装的建议事项 (如何移除…

基于AVR128单片机智能传送装置

一、系统方案 1、板载可变电阻(电位器)R29的电压作为处理器ATmega128的模数转换模块中单端ADC0的模拟信号输入(跳线JP13短接)。 2、调节电位器,将改变AD转换接口ADC0的模拟信号输入,由处理器完成ADC0的A/D转…

Android studio 2022.3.1 鼠标移动时不显示快速文档

在使用技术工具的过程中,我们时常会遇到各种各样的问题和挑战。最近,我升级了我的Android Studio到2022.3.1版本,但是在使用过程中,我碰到了一个让我颇为困扰的问题:在鼠标移动到类名或字段上时,原本应该显…

Visual Studio2022史诗级更新,增加多个提高生产力的功能

Visual Studio 2022发布了17.7x版,这次更新中,增加多个提高生产力的功能以及性能进一步改进。 如果要体验新功能,需要将Visual Studio 2022的版本升级到17.7及以上 下面我们看看新增的功能以及改进的功能! 目录 文件比较自动修复代…

新仿百度文库网站源码 免费文库网站源码 文档分享平台源码 实现文档上传下载及在线预览

仿百度文库是一个以PHPMySQL进行开发的免费文库网站源码。主要特点如下: 界面仿照百度文库,使用户在使用时更加熟悉和舒适。支持文档的上传、下载和在线预览功能,方便用户分享和获取各种文档资料。用户可以对自己需要的文档进行悬赏&#xf…

[MyBatis系列③]动态SQL

目录 1、简介 2、if标签 3、foreach标签 4、SQL抽取 ⭐MyBatis系列①:增删改查 ⭐MyBatis系列②:两种Dao开发方式 1、简介 开发中在MyBatis映射文件配置SQL语句,但是前面配置的都是比较简单的,不涉及稍复杂的业务场景。想要应…

服务器数据恢复-AIX PV完整镜像方法以及误删LV的数据恢复方案

AIX中的PV相当于物理磁盘(针对于存储来说,PV相当于存储映射过来的卷;针对操作系统来说,PV相当于物理硬盘),若干个PV组成一个VG,AIX可以将容量不同的存储空间组合起来统一分配。AIX把同一个VG的所…

计算机组成原理学习笔记-精简复习版

一、计算机系统概述 计算机系统硬件软件 计算机硬件的发展: 第一代计算机:(使用电子管)第二代计算机:(使用晶体管)第三代计算机:(使用较小规模的集成电路)第四代计算机:(使用较大规模的集成电路) 冯诺依曼体系结构…

C++ 继承

1.继承的概念及定义 1.1继承的概念 继承 (inheritance) 机制是面向对象程序设计 使代码可以复用 的最重要的手段,它允许程序员在 保 持原有类特性的基础上进行扩展 ,增加功能,这样产生新的类,称派生类。继承 呈现了面向对象 …

【安全】原型链污染 - Hackit2018

目录 准备工作 解题 代码审计 Payload 准备工作 将这道题所需依赖模块都安装好后 运行一下,然后可以试着访问一下,报错是因为里面没内容而已,不影响,准备工作就做好了 解题 代码审计 const express require(express) var hbs require…

Docker使用mysql:5.6和 owncloud 镜像,构建一个个人网盘,安装搭建私有仓库 Harbor

一、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 [rootlocalhost ~]# docker pull mysql:5.6[rootlocalhost ~]# docker pull owncloud[rootlocalhost ~]# docker run -itd --name mysql --env MYSQL_ROOT_PASSWORD123456 mysql:5.6 d45cc5b95f00692881baaf…

Apache StreamPark系列教程第一篇——安装和体验

一、StreamPark介绍 实时即未来,在实时处理流域 Apache Spark 和 Apache Flink 是一个伟大的进步,尤其是Apache Flink被普遍认为是下一代大数据流计算引擎, 我们在使用 Flink & Spark 时发现从编程模型, 启动配置到运维管理都有很多可以抽象共用的地方, 我们将一些好的经验…

Git企业开发控制理论和实操-从入门到深入(六)|多人协作开发

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

《机器学习在车险定价中的应用》实验报告

目录 一、实验题目 机器学习在车险定价中的应用 二、实验设置 1. 操作系统: 2. IDE: 3. python: 4. 库: 三、实验内容 实验前的猜想: 四、实验结果 1. 数据预处理及数据划分 独热编码处理结果(以…

本地部署 Stable Diffusion(Windows 系统)

相对于使用整合包,手动在 Windows 系统下本地部署 Stable Diffusion Web UI(简称 SD-WebUI),更能让人了解一些事情的来龙去脉。 一、安装前置软件:Python 和 Git 1、安装 Python for windows。 下载地址 https://www.p…

数字化、智能化的酒店固定资产管理系统

酒店固定资产管理系统是一种专门为酒店行业定制的管理软件,可以帮助酒店管理者全面、准确地管理固定资产。该系统具有以下实际功能和特点:  资产库存功能:通过扫描二维码或手动输入条形码,完成酒店固定资产的有效总结&#xff0…

浅谈Java中的观察者模式

观察者模式是软件开发中常用的一种设计模式,它通过定义一对多的依赖关系,使得一个对象(主题)的状态变化可以通知多个其他对象(观察者)。 这种模式的优点是解耦和增加扩展性,用于实现对象之间的…

pdf.js构建时,报Cannot read property ‘createChildCompiler‘ of undefined #177的解决方法

在本地和CI工具进行构建时,报如下错误。 Cannot read property createChildCompiler of undefined #177解决方法: 找到vue.config.js,在 module.exports {parallel: false, //新增的一行chainWebpack(config) {....config.module.rule(&…

《自动驾驶与机器人中的SLAM技术》之GNSS相关基础知识总结

简介 本篇基于对《自动驾驶与机器人中的SLAM技术》中的GNSS定位相关基础知识进行总结用于备忘 知识点整理 GNSS(全球卫星导航系统)定位原理 GNSS 通过测量自身与地球周围各卫星的距离来确定自身的位置 , 而与卫星的距离主要是通过测量时间间隔来确定的 GNSS与GPS的关系 GPS(…