转自: 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枚举类型的使用方法及其相关知识点。 1. **枚举的声明与初始化** 枚举类型的声明方式类似于类,但以`enum`关键字开头。例如: ```java enum Color { RED, GREEN, BLUE } ``` 这里...
Java中的枚举类型`Enum`是面向对象编程中一种强大的工具,它允许程序员定义自己的常量集合。在Java中,枚举类型不是简单的常量数组,而是一种完整的类,具有类的所有特性,如方法、构造函数和继承。下面将详细探讨`...
在C#中,枚举类型是基于整数类型的,通常使用`enum`关键字来声明。例如: ```csharp enum Colors { Red, Green, Blue } ``` 上述代码定义了一个名为`Colors`的枚举,它有三个成员:`Red`、`Green`和`Blue`。默认...
在这里,`Color`是枚举类型,`RED`, `GREEN`, `BLUE`是枚举的实例,它们默认继承自`java.lang.Enum`类。 2. 访问枚举实例: 你可以通过枚举类型直接访问其实例,例如: ```java Color color = Color.RED; ``` 3. ...
首先,枚举可以看作是一种预定义的类,与基本数据类型(如int、char)相似,但其主要目的是限制变量只能赋值为枚举类型中定义的特定值。以下是一个简单的枚举例子: ```java public enum Color { RED, GREEN, BLUE...
在易语言中,枚举类型(Enum)是一种特殊的数据类型,用于定义一组具有特定名称的常量。这些常量在程序中代表特定的值,使得代码更易于理解和维护。然而,易语言本身并不直接支持枚举类型,因此程序员需要通过一些...
在Spring Boot项目中,枚举类型(Enums)的使用是一种常见...以上所述内容,都是在`springboot-enum-demo-master`项目中可以找到的实际应用示例,可以帮助开发者更好地理解和实现Spring Boot项目中枚举类型的高效使用。
在Python 3.4中,引入了enum模块,它提供了一个Enum类,使得定义和使用枚举类型变得简单而强大。本文将详细介绍如何在Python中使用enum模块定义枚举,包括枚举的基础概念、定义方法、使用场景以及高级应用。 Python...
Java 枚举(enum)是 Java 语言中的一个重要特性,自 Java 5 开始引入。枚举用于定义一组相关的常量,这些常量通常代表一个有限的、...通过深入理解和灵活运用枚举,开发者可以编写出更加清晰和健壮的 Java 应用程序。
接下来,我们可以通过分析`enum_eg`文件中的示例代码,更深入地了解枚举类型的使用。这个文件可能包含了各种枚举类型定义和变量声明的实例,包括如何定义枚举常量、如何在程序中使用它们,以及如何处理枚举值和整数...
在本文中,我们将深入探讨C#枚举类型的实例说明,以及其主要的使用方法。 ### 枚举类型的基本定义 在C#中,枚举类型的定义是通过`enum`关键字来实现的。例如,我们可以通过以下方式定义一个表示一周七天的枚举类型...
本主题将深入探讨枚举类型的概念、使用方式以及它在处理过程中的应用。 首先,让我们了解一下枚举类型的定义。在C#或Java等语言中,枚举是一种特殊的类,包含了若干个命名的常量。例如,我们可以创建一个名为`Color...
今天就让我们跟随涛哥一起,深入理解C语言中的枚举类型,并且探讨它在Linux内核中的应用,以及使用枚举时需要注意的一些编程细节。 首先,枚举类型在C语言中通常有三种使用方法: 1. 先定义枚举类型,再定义枚举...
本文将深入探讨枚举类型的使用及其在不同语言中的实现方式。 首先,我们来看C#中的枚举。在C#中,枚举是一种值类型,可以定义一组有名字的整数常量。通过`enum`关键字来创建枚举,例如: ```csharp enum Color { ...
本文将深入探讨Java枚举类型的特性和用法,并通过具体实例说明其优势所在。枚举类型在Java中的引入标志着一种更为类型安全且灵活的编程方式。 #### 二、Java枚举的基本概念 Java中的枚举是一种特殊的类,用于定义...
在本文中,我们将深入探讨Java枚举类型的基本概念、用法以及它与传统常量定义方式的区别。 一、枚举类型概述 在Java中,枚举是一种特殊的类,用于定义一组相关的值。这些值都是该枚举类型的实例,它们共享相同的类...
本文将深入探讨枚举类型的关键概念及其应用场景,并对比使用`static final`字段的优劣。 #### 二、枚举类型的核心功能 **1. 统一命名的常量** 枚举的主要作用在于以统一命名的方式替换那些变化无常的直接量。例如...
通过本文的详细介绍和代码示例,你应该对如何在Python中使用枚举类型有了深入的理解。枚举类型不仅可以使代码更加清晰,还可以提高代码的可维护性和可读性。希望本文的信息能帮助你在Python项目中有效地使用枚举类型...
本文将深入探讨在MyBatis中如何使用枚举类型,并通过实际的项目"mybatis入门实战之枚举类型"进行讲解。这个项目提供了一个简单的demo,非常适合初学者了解并实践MyBatis的TypeHandler机制。 首先,我们要明白枚举...
枚举类型(Enum)是程序设计中的一种数据类型,它允许我们定义一组具有特定名称的常量。这些常量在程序中通常代表特定的、离散的状态或...同学们,现在你们应该对枚举类型有了深入的理解,记得在实际编程中灵活运用哦!