Git撤销已Push的Merge

2024-10-23 18:07:51 8


复现场景

  1. 现有一个分支 master
  2. 基于master创建分支merge
  3. master正常commit & push C
  4. merge正常commit & push DE
  5. merge合并到master, commit为M
A -- B -- C -- M (master)
         \     /
          D -- E (merge)
  1. master push


现在因为某些原因要撤销这次合并

操作方法

  1. git log 找到合并的那次commit hash (名称一般为 Merge branch xxx)
  2. git revert -m 1 hash 保留创建分支后master的提交C, 抛弃merge的提交DE
    1. -m 1表示保留master分支的更改 (保留第一个父提交 即合并前的主分支)
    2. -m 2表示保留merge分支的更改 (保留第二个父提交 即被合并的分支)
  3. git revert会再创建一个commit, 可以看到内容是撤销了DE
  4. 将commit push, 这次撤销合并就完成了
  5. 假如第2步选择-m 2, 那么就可以看到master上的C被撤销, DE被保留


生产操作, 一般都是选择-m 1, 即保留master后续的commit.

因为master主干代码都是最稳定的



其他情况 一

  1. 假如mergeDE后, 将masterC合并到merge
  2. merge再做了一次提交F
  3. master又做了一次提交G
  4. 最终将merge合并到master


这种是比较常见的场景.


需求开始时, 从master拉个新分支.

新分支写完后准备合并.

发现冲突了, 然后把master的代码合到新分支, 涉及冲突的, (可以)重新作为新分支的一个commit.

最终将新分支的代码合并到master上线


其他情况 二

  1. 假如mergeDE后, 将masterC合并到merge
  2. merge再做了一次提交F
  3. 最终将merge合并到master


git log看, master最新的commit是mergeF

属于master的有ABC, merge的DEF


方法一

这种可以先找到C的hash

然后

git reset --hard <commit_hash_of_C>

然后强制推送到remote

git push origin master --force

缺点就是master不会有DEF的相关记录了 (merge仍然有), 且会影响到其他人的合并

如果合并后刚push, 可以用reset再push (仓库允许强制push)


方法二

基于master的C创建新分支, 再替换master


方法三

git rebase -i HEAD~7

交互性的选择保留或丢弃最近7个提交


方法四

一个一个revert


Git撤销已Push的Merge

复现场景现有一个分支 master基于master创建分支mergemaster正常commit & push Cmerge正常commit & push D和E将merge合并到master, commit为MA -- B -- C -- M (master) \ /
2024-10-23

常见Git Commit Type

feat(Feature):表示添加新功能或功能改进。例如:feat: 添加用户登录功能fix(Bug Fix):表示修复了一个错误或缺陷。例如:fix: 修复注册页面无法提交的问题docs(Documentation):表示更新文档,如README、帮助文档等的变更。例如:docs: 更新安装指南
2023-10-10

使用git将项目上传到github

git clone https://github.com/xxx/xxx.gitgit add . (注:别忘记后面的.,此操作是把xxx文件夹下面的文件都添加进来)git commit -m "提交信息" (注:“提交信息”里面换成你需要,如“first commit”)git push -u o
2020-05-18

freemarker 时间显示不正常 设置时区

项目在本地开发的时候显示正常,部署上服务器就一直差8个小时,最后发现freemarker官方文档有这样的说明time_zone:时区的名称来显示并格式化时间。 默认情况下,使用JVM的时区。 也可以是 Java 时区 API 接受的值,或者 "JVM default" (从 FreeMarker 2
2020-03-28
IDEA 2019.1 xml 不高亮

IDEA 2019.1 xml 不高亮

前几天更新了idea后,发现xml里的代码都没有了高亮,变得跟记事本一个德性了打开setting ,搜索 File Types,找到xml项, 查看下方的匹配格式,果然没有xml,(idea真是厉害)点击右方的+,输入*.xml,点击ok,解决问题
2020-03-28

npm install 淘宝镜像

npm install --registry=https://registry.npm.taobao.org
2020-03-28
Java中方法的参数传递机制

Java中方法的参数传递机制

来看一段代码 public class Man { private String name; private Integer age; public String getName() { return name; } publi
2020-03-28
基于自定义注解手写权限控制

基于自定义注解手写权限控制

方法一: AOP 方法二: 拦截器项目结构项目依赖<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-w
2020-03-28

Docker 部署 详细全过程 附代码

Docker 部署本站 全过程环境:CentOS7.61. 安装Docker其他版本CentOS可以参考这个https://help.aliyun.com/document_detail/187598.html查看本机内核版本,内核版本需高于 3.10uname -r 确保 yum 包最新yum u
2020-03-28

SpringBoot 启动普通java工程

引入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.0.9</version> </dependency>
2020-03-28

Vue.js DOM操作

<template> <input type="button" @click="reply($event)" value="回复"> </template> export default { methods: { replyFun(e) {
2020-03-29
CentOS7编译调试OpenJDK12

CentOS7编译调试OpenJDK12

1. 下载源码https://hg.openjdk.java.net/jdk/jdk12点击左侧的browse,再点击zip,就可以下载zip格式的源码压缩包。unzip xxx.zip 解压文件2. 安装jdkyum install java-11-openjdk-devel -y3. 运行con
2020-04-23
编写自己的Spring Boot Starter

编写自己的Spring Boot Starter

1.新建一个maven项目命名规则统一是xxx-spring-boot-starter完整pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"
2020-06-29