年终奖都没了,还要扣我绩效,门都没有,哈哈。

这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。

文末留言,聊聊你的年终奖。

问题描述

小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开发新功能。

小A在我之前把代码提交到了测试分支,我想提交我的新功能代码到测试分支时发现巨多冲突,脑袋瞬间就炸了,Boom一声惊雷响啊。

PS:因为小A的需求不急,但是改动巨大;我的需求很急,马上要提测,否则就延期扣绩效了,说真的,我着急了,哈哈哈。

分析一下

  1. 首先解决冲突浪费时间,我的新功能代码每次提测到测试分支都需要解决冲突。

  2. 我在测试分支解决冲突,只能按照小A优化后的代码逻辑的去解决,和我自己的分支逻辑并不一致。

  3. 交付给测试同学的测试分支代码,和我自己分支的代码不一致,这种测试是没有意义的。

反思出问题的原因

  1. 工厂模式使用的不合理

  2. 任务分配的不合理

代码层面

TIPS:以下代码示例语言为Go

因为是工厂设计模式,我负责的实现类A和他的实现类B虽然没有直接关系。但是因为他修改了工厂类中的方法定义。

比如之前工厂类中的接口是这么定义的

package factory

type xxx interface {
GetXxxx(ctx context.Context, req aaa.aa) (res bbb.bb, err error)
}

但是小A优化(修改)了工厂类中的接口定义:

package factory

type xxx interface {
GetXxxx(ctx context.Context, req ccc.cc) (res ddd.dd, err error)
}

这样就导致了一个问题:

我想合并我的代码到测试分支也必须将我的实现类像小A一样,修改传参类型和返回类型。

但是我们都在不同的分支上开发,我是没有他定义的类型ccc.cc,ddd.dd的。

我又不能直接把他定义的ccc.cc,ddd.dd要过来,在我自己的分支上开发,一是因为需求不一致,小A的上线周期会比我长;二是这种操作本身就不规范。

解决问题

1.代码层面:

我们想到的方案是合理使用interface

工厂类中方法的入参和出参设置为interface{}类型

package factory

type xxx interface {
GetXxxx(ctx context.Context, req interface{}) (res interface{}, err error)
}

这样就比较容易进行扩展了。

2.Git层面:

方法1的入参和出参设置为interface{}类型的方案,并没有从根本上解决我们的问题。

原因是这样的:

小A的需求是整体优化工厂类和各个实现类的入参、出参,优化内部逻辑,抽取方法。

小A的迭代优化修改变动很大,导致和我实现的新需求有比较大的冲突。

但是他的Git分支又在我之前提交到了测试环境,导致我无法正常提交我的代码。

如果我要提交就要解决各种冲突,解决冲突就要按照小A的优化逻辑去改,提测分支和我自己分支的不一致,难顶啊。

考虑到小A的修改暂时不需要提测,上线周期也比较长。

最终方案:

最终的解决方案是这样的:

  1. 从远程的测试分支拉取了一个备份分支,删除小A提交的远程测试分支
  2. 把我本地需要测试的分支提交到测试分支,交付测试(因为我的需求很急,而小A的需求并不急)

相关命令

这波骚操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家:

Git 重命名远程分支

1.先重命名本地分支

git branch -m 旧分支名称  新分支名称

2.删除远程分支

git push --delete origin 旧分支名称

3.上传新修改名称的本地分支

git push origin 新分支名称

4.修改后的本地分支关联远程分支

git branch --set-upstream-to origin/新分支名称

推荐阅读

【Git必知必会】多人协同开发,紧急修复线上bug的操作指南。

总结

开发起来一时爽,维护起来火葬场。

Git操作不规范,战友提刀来相见!

呼应一下开篇,这是临时解决办法的一个经验分享。肯定还有最优解,但是对我来说不重要,再不使用骚操作就该扣绩效了。

年终奖都没了,还要扣我绩效,门都没有,哈哈。

你的年终奖还好吗,欢迎在评论区讨论。

一起进步

如果觉得这篇文章不错,欢迎点赞评论。

我在博客园写文章不就,希望大家支持一波。

Git操作不规范,战友提刀来相见!的更多相关文章

  1. Git操作学习笔记

    根据廖雪峰老师git教程学习整理 这里需要辨析一下概念.Github是代码托管平台,是协作的工具;而Git是版本控制工具.Git不需要联网,在本机就可以使用 集中式版本控制系统与分布式版本控制系统 S ...

  2. Git操作简单入门及相关命令

    说明:本文内容主要来自文末参考链接内容,此文仅作学习记录.如有转载,请到文末参考链接处. 1 基本概念理解 1.1 Git介绍 Git是分布式版本控制系统. 集中式VS分布式,SVN VS Git. ...

  3. 你要是还学不会,请提刀来见 Typora+PicGo+Gitee + node.js 打造个人高效稳定优雅图床

    你要是还学不会,请提刀来见 Typora+PicGo+Gitee + node.js 打造个人高效稳定优雅图床 经过前面两弹的介绍,相信大家对图床都不陌生了吧, 但是小魔童觉得这样做法还是不方便,使用 ...

  4. Intellij 中的git操作 转!

    http://blog.csdn.net/lovesummerforever/article/details/50032937 Git原理以后会分章节介绍,本次主要说一下intellij怎样操作git ...

  5. 使用Git操作GitHub代码入门教程

    GitHub除了网页操作外,还可以借助本地客户端git(或github for windows)来增删修改远程代码.使用Git操作来连接GitHub可以通过Https或SSH方式,使用SSH方式可以免 ...

  6. 转 git操作小结

    UNDER MIT LICENSE. 公司几乎所有的项目都是使用 git 仓库来管理代码,以前对 git 只有些肤浅的了解,每次提交代码或者上线的时候总是会提心吊胆,生怕出现一些未知的问题.经过三个月 ...

  7. svn 迁移至git操作手册

    svn 迁移至git操作手册 项目交付.版本管理工具变更等情况下,迁移svn旧历史记录有很大必要,方便后续追踪文件的提交历史,文件修改记录比对等.git自带了从svn迁移至git的工具命令,可很好的对 ...

  8. git操作常用命令

    一.使用git 1.git是什么? Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己 ...

  9. IDEA环境下GIT操作浅析之二-idea下分支操作相关命令

    上次写到<idea下仓库初始化与文件提交涉及到的基本命令>,今天我们继续写IDEA环境下GIT操作之二--idea下分支操作相关命令以及分支创建与合并. 1.idea 下分支操作相关命令 ...

  10. IDEA环境下GIT操作浅析之一Idea下仓库初始化与文件提交涉及到的基本命令

    目标总括 idea 下通过命令操作文件提交,删除,与更新并推送到github 开源库基本操作idea 下通过命令实现分支的创建与合并操作 idea 下通过图形化方式实现idea 项目版本控制基本操作 ...

随机推荐

  1. Charles的安装与使用

    Charles是一款抓包工具,可以用来截取和发送手机APP上的各种请求 在windows上安装Charles,确保手机和电脑在同一个WIFI下,加上一些配置,就可以抓取手机上的APP请求 有能力的同学 ...

  2. Hbase之理论

    第1章 HBase简介 1.1 什么是HBase HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储. 官方 ...

  3. 四、Pod 介绍

    一.什么是 Pod ​Pod 是 kubernetes 集群中最小的部署和管理的基本单元,协同寻址,协同调度. ​Pod 是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合. ​Pod 中可以 ...

  4. c++ 关于引用变量你不知道的东西

    引用变量延迟绑定 我们知道引用变量定义时要立刻赋值,告诉编译器他是谁的引用.如果不赋值,编译会失败. 如果引用变量是单个定义的,对他赋值还比较简单. struct test_T { int data; ...

  5. ModuleNotFoundError: No module named 'XXX'

    先来一张表情包: pycharm在小黑框使用pip安装某个包,在解释器没有找到某个包,所以运行程序的时候总是报错. 我相信大家可能都遇到这样的问题. 我下载有3.8.3.10版本的python,我py ...

  6. CLR、CLS、CTS概述

    在学习.NET的过程中,都会不可避免地接触到这三个概念,那么这三个东西是什么以及它们之间的关系是怎样的呢?任何编程语言,如果想要在.NET CLR上执行,就必需提供一个编译器,将此语言的程序编译成.N ...

  7. Go语言核心36讲39

    在上一篇文章中,我介绍了Go语言与Unicode编码规范.UTF-8编码格式的渊源及运用. Go语言不但拥有可以独立代表Unicode字符的类型rune,而且还有可以对字符串值进行Unicode字符拆 ...

  8. 二叉树总结——BiTree

    在C++编译器下可直接运行 #include <stdio.h> #include <malloc.h> //算法思想:先读入根结点数据,并且创建根结点,在读入左子树数据并创建 ...

  9. npm安装hexo报错

    报错提示 npm WARN saveError ENOENT: no such file or directory, open '/home/linux1/package.json' npm noti ...

  10. React综合使用联系

    index.js import React from 'react' import ReactDOM from 'react-dom' import CartSimple from './CartSi ...