`
rjw
  • 浏览: 57600 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入理解枚举类型enum

    博客分类:
  • git
git 
阅读更多

转自: http://www.cnblogs.com/dsxniubility/p/5817776.html

 

记一次git amend事故处理方案

 

一、问题回顾

问题是git commit --amend 引起的。 一条commit已经push到远端develop了,但是后来又在这条commit上进行了amend操作,导致这条commit的哈希码发生了变化。并且后续又在这条commit之后进行了N条commit操作。

<Begin>

大概的情况画了个简图,如图所示。下面的绿色就是最后相同的地方,红色的那条做的是相同的功能message是一样的,但是提完develop之后又改动了很多然后使用amend挤压了。

这个时候比较头疼了,因为那条amend的commit里面是发生了太多改动,我采用的是可以避免冲突的方法,但是会改develop的commit树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git checkout develop
 
git reset 2c4532  //上面97,98,99的改动会被放出来
 
git stash //先把这些改动存起来
 
git reset --hard 5d67bc  //等于是把96完全剔除了,代码回到了95的状态
 
git cherry-pick 8a6f7f  //把那一条修改后的功能commit(96的feature)粘贴过来,这一步100%不会有冲突
 
git stash pop  //把之前存起来的那些改动再放出来,这一步不能保证100%无冲突,但实际由于两个功能模块离得比较开,所以也没有发生冲突。
 
git add .   git commit -m " " //把develop上面的97,98,99三条commit 挤压成了一条后commit
 
git cherry-pick 86f6cc d34c7 2817f5 //这一步把feature分支的97,98,99三条commit粘贴过来,因为这三条基本是基于8a6f7f开发的,所以也没有发生冲突。 董铂然博客园

<End>

这样改完之后develop的commit树如上图所示(第97条就是把之前的97,98,99挤压成的1条),可以编译通过功能都能实现。 但是缺点是这时候需要强推develop了。

 

组里另一个人提出的解决方案是

<Begin>(图再贴一遍 省的往上翻)

1
2
3
4
5
6
7
8
9
10
11
12
13
git checkout feature  //操作都在feature分支进行,不动develop的代码
 
git reset 5d67bc   //把feature分支上“不科学”的commit 96,97,98,99 全部放出来
 
git stash  //全部临时存起来
 
git rebase develop   //快进一下,合入了所有develop的新代码 100%无冲突
 
git stash pop   //把之前揉在一起的4条commit的代码一起放出来,这时候会有大量冲突。
 
git add .  git commit -m "fix"  //解决冲突后commit一下 
 
//然后再把最后的一条commit merge入develop,最后的结果时develop如下

<End>

可以看出这种做法,不需要强制push develop的代码。理论上更加科学,但是中间需要解决大量的冲突。

事后反省一下,觉得两种方法其实各有优劣,如果组内成员不多,可以在大家的监督下 完成强推develop的操作。 因为解决了大量冲突可能会比 非常清晰了解差异后-f强推develop更容易出现错误。 当然如果是大型项目,几十人团队,并且远端都绑上了编译检查,和merge规则的项目也只能使用第二种方法了。

 

二、其他经验

对于一个码农而言,比写出bug更恐怖的是把代码弄丢了或弄乱了。 对于这种问题也是有一种统一的解决方案

①.git reset --hard  哈希码 , 这条非常普遍,如果出现问题有点乱直接回到一个安全的commit

②.git reflog    对于有rebase或merge这种操作,第一条指令就用不了了,因为被污染的并不仅仅是最后一条commit。 这时要用这个万能恢复指令,回到一个操作的哈希码。

③.但是前两种方法都是对于一些已经加入过git的代码进行恢复。 如果一些代码还没有commit 这时候弄丢了 那些指令就都帮不了你了。 这时候只能看IDE有没有local history了。(local history相当于IDE帮你实现了一个类似于git的功能)之前就有过一次第3种情况的经历,当时是把没commit的代码给reset了 使用localhistory得以恢复。好在现在iOS的xcode 和 Android的Android Studio都是有local history的,

  • Xcode 的local history在 导航栏 → View → Version Editor → show Version Editor 
  • Android Studio 的local history在 左边文件目录 → 选中根目录 → show local history

 

如果上文说的问题有更好的解决方案,也欢迎一起讨论。

分享到:
评论

相关推荐

    Java枚举类型Enum的用法

    接下来,我们将深入探讨Java枚举类型的使用方法及其相关知识点。 1. **枚举的声明与初始化** 枚举类型的声明方式类似于类,但以`enum`关键字开头。例如: ```java enum Color { RED, GREEN, BLUE } ``` 这里...

    Java中的枚举类型Enum示例源代码

    Java中的枚举类型`Enum`是面向对象编程中一种强大的工具,它允许程序员定义自己的常量集合。在Java中,枚举类型不是简单的常量数组,而是一种完整的类,具有类的所有特性,如方法、构造函数和继承。下面将详细探讨`...

    枚举语句enum用法详解

    在C#中,枚举类型是基于整数类型的,通常使用`enum`关键字来声明。例如: ```csharp enum Colors { Red, Green, Blue } ``` 上述代码定义了一个名为`Colors`的枚举,它有三个成员:`Red`、`Green`和`Blue`。默认...

    高阶Java-Java枚举类型 enum 应用详解

    在这里,`Color`是枚举类型,`RED`, `GREEN`, `BLUE`是枚举的实例,它们默认继承自`java.lang.Enum`类。 2. 访问枚举实例: 你可以通过枚举类型直接访问其实例,例如: ```java Color color = Color.RED; ``` 3. ...

    深入谈谈java的枚举(enum)类型

    首先,枚举可以看作是一种预定义的类,与基本数据类型(如int、char)相似,但其主要目的是限制变量只能赋值为枚举类型中定义的特定值。以下是一个简单的枚举例子: ```java public enum Color { RED, GREEN, BLUE...

    易语言模拟枚举类型

    在易语言中,枚举类型(Enum)是一种特殊的数据类型,用于定义一组具有特定名称的常量。这些常量在程序中代表特定的值,使得代码更易于理解和维护。然而,易语言本身并不直接支持枚举类型,因此程序员需要通过一些...

    springboot项目中枚举类型的最佳实践

    在Spring Boot项目中,枚举类型(Enums)的使用是一种常见...以上所述内容,都是在`springboot-enum-demo-master`项目中可以找到的实际应用示例,可以帮助开发者更好地理解和实现Spring Boot项目中枚举类型的高效使用。

    Python中的枚举类型:使用`enum`模块的深入指南

    在Python 3.4中,引入了enum模块,它提供了一个Enum类,使得定义和使用枚举类型变得简单而强大。本文将详细介绍如何在Python中使用enum模块定义枚举,包括枚举的基础概念、定义方法、使用场景以及高级应用。 Python...

    java 枚举(enum) 详解(学习资料)

    Java 枚举(enum)是 Java 语言中的一个重要特性,自 Java 5 开始引入。枚举用于定义一组相关的常量,这些常量通常代表一个有限的、...通过深入理解和灵活运用枚举,开发者可以编写出更加清晰和健壮的 Java 应用程序。

    枚举类型定义与变量声明定义的不同方法

    接下来,我们可以通过分析`enum_eg`文件中的示例代码,更深入地了解枚举类型的使用。这个文件可能包含了各种枚举类型定义和变量声明的实例,包括如何定义枚举常量、如何在程序中使用它们,以及如何处理枚举值和整数...

    C# 枚举类型的实例说明

    在本文中,我们将深入探讨C#枚举类型的实例说明,以及其主要的使用方法。 ### 枚举类型的基本定义 在C#中,枚举类型的定义是通过`enum`关键字来实现的。例如,我们可以通过以下方式定义一个表示一周七天的枚举类型...

    5-枚举类型、输入输出、处理

    本主题将深入探讨枚举类型的概念、使用方式以及它在处理过程中的应用。 首先,让我们了解一下枚举类型的定义。在C#或Java等语言中,枚举是一种特殊的类,包含了若干个命名的常量。例如,我们可以创建一个名为`Color...

    跟涛哥一起学嵌入式30:C语言枚举类型深入剖析.pdf

    今天就让我们跟随涛哥一起,深入理解C语言中的枚举类型,并且探讨它在Linux内核中的应用,以及使用枚举时需要注意的一些编程细节。 首先,枚举类型在C语言中通常有三种使用方法: 1. 先定义枚举类型,再定义枚举...

    枚举类型的使用

    本文将深入探讨枚举类型的使用及其在不同语言中的实现方式。 首先,我们来看C#中的枚举。在C#中,枚举是一种值类型,可以定义一组有名字的整数常量。通过`enum`关键字来创建枚举,例如: ```csharp enum Color { ...

    java枚举类型说明

    本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举类型在Java中的引入标志着一种更为类型安全且灵活的编程方式。 #### 二、Java枚举的基本概念 Java中的枚举是一种特殊的类,用于定义...

    理解java枚举类型

    在本文中,我们将深入探讨Java枚举类型的基本概念、用法以及它与传统常量定义方式的区别。 一、枚举类型概述 在Java中,枚举是一种特殊的类,用于定义一组相关的值。这些值都是该枚举类型的实例,它们共享相同的类...

    Java中的“枚举类型

    本文将深入探讨枚举类型的关键概念及其应用场景,并对比使用`static final`字段的优劣。 #### 二、枚举类型的核心功能 **1. 统一命名的常量** 枚举的主要作用在于以统一命名的方式替换那些变化无常的直接量。例如...

    Python中的枚举类型:使用指南与实践应用

    通过本文的详细介绍和代码示例,你应该对如何在Python中使用枚举类型有了深入的理解。枚举类型不仅可以使代码更加清晰,还可以提高代码的可维护性和可读性。希望本文的信息能帮助你在Python项目中有效地使用枚举类型...

    mybatis入门实战之枚举类型

    本文将深入探讨在MyBatis中如何使用枚举类型,并通过实际的项目"mybatis入门实战之枚举类型"进行讲解。这个项目提供了一个简单的demo,非常适合初学者了解并实践MyBatis的TypeHandler机制。 首先,我们要明白枚举...

    程序设计-枚举类型.pptx

    枚举类型(Enum)是程序设计中的一种数据类型,它允许我们定义一组具有特定名称的常量。这些常量在程序中通常代表特定的、离散的状态或...同学们,现在你们应该对枚举类型有了深入的理解,记得在实际编程中灵活运用哦!

Global site tag (gtag.js) - Google Analytics