最近在合并上游代码,遇到了一个问题:某个 commit 杂糅了几个不同的特性修改,这可能会导致 rebase 上游代码时需要再对该 commit 进行额外的代码冲突处理

解决方法:合并上游分支前,拆分杂糅的 commit,并将其中不同的特性修改合并(Squash)回相关的 commit。可以直接通过命令行进行操作,可以参考:Break a previous commit into multiple commits。也可以通过 JetBrains 家内置的 Git 进行操作,下面会介绍 IDEA 图形化操作的方法

非先前 commit 的拆分

对于刚提交的 commit,要拆分多个 commit 是非常容易的,因为我们只要 soft reset commit,将 commit 内容撤销回至 暂存区,就可以随意提交 commit

如果对于 soft reset 不太了解,可以参考我之前的博客:Git 中的回退操作:reset 和 revert

先前 commit 的拆分

先前 commit 指的是:在目标 commit 后已经有了若干个 commit。它无法直接通过 soft reset 进行拆分,因为这样会丢失后续的 commit,如下图,我们需要拆分 B commit,我们就无法直接使用 soft reset ,因为这样会丢失 CD commit 的修改

所以我们需要使用 rebase,具体步骤:

  1. 在 交互式 (interactive) rebase 中将 B 标记为 edit,这时 B 后面的 commit 会被暂时隐藏起来
  2. 使用 soft resetB 撤销回 暂存区
  3. B 的修改内容分多个 commit 提交 B1B2
  4. 使用 rebase 的 continue 将刚才隐藏的 CD 恢复回来

实例准备

演示使用 IDEA,其实 JetBrains 家的使用逻辑差不多,示例仓库使用:Learn Go with Tests

git clone git@github.com:quii/learn-go-with-tests.git

需要用到 Rebase,IDEA 默认保护主分支,改写 commit 记录的功能会被禁用

需要先取消分支保护,移除 Protected branches 中的 master;main

假设我们需要将下面 commit 拆分为两个:

1. 启动 Rebase 并标记目标 commit 为 edit

点击 Interactively Rebase from Here...

选择需要拆分的 commit,右键选择 Stop to Edit,然后再点击 Start Rebasing

这时有右下角会提示您正在处于 Rebase 状态

选择框可以选择 Continue 即继续 Rebase,Abort 则会退出 Rebase

commit 列表也会显示感叹号

2. 使用 soft reset 将 commit 撤销回 暂存区

我们需要先 soft reset 到目标 commit 的上一个 commit

选择上一个 commit,右键选择:Reset Current Branch to Here...

选择 Soft,这样目标 commit 的修改就会退回到暂存区



3. 将暂存区改动分为若干个 commit 提交

这个时候我们就可以继续分开提交两次 commit



查看 log,两条 commit 被成功提交

4. 使用 rebase 的 continue 恢复剩下的 commit

这时候我们需要继续 Rebase,将剩下的 commit 还原回去:点击右下角分分支按钮,选择 Continue Rebase

完成 Rebase 后,剩余的 commit 就会被追加到我们新提交的 commit 后面,至此我们就完成了先前 commit 的拆分

Rebase edit 的拓展

因为这里的案例只是拆分 commit,没有对 commit 进行修改,如果是修改的话,修改完成后需要使用 git add 将文件标记为已修改,才能使用 rebase 的 continue,这样该 commit 就会被修改。后续的 commit 有可能与本次的改动产生冲突,需要手动处理冲突

参考资料

Break a previous commit into multiple commits

IDEA (任意 JetBrains IDE)拆分先前 commit的更多相关文章

  1. JetBrains IDE 基本快捷键

    转载自:https://nextfe.com/jetbrains-ide-shortcuts/ 一个好的手艺人很熟悉他的工具.软件开发者也不例外.所以,在编程的过程中,值得了解一些键盘快捷键,以免因为 ...

  2. webstorm+nodejs+JetBrains IDE Support+chrome打造前端开发神器

    #webstorm+nodejs+JetBrains IDE Support+chrome打造前端开发神器 -- 工欲善其事 必先利其器 ##各工具介绍 `webstorm`是**JetBrains* ...

  3. WebStorm + JetBrains IDE Support 实现自动刷新功能

    WebStorm 7.0 + live eidt + JetBrains IDE Support 实现自动刷新功能, WebStorm 7.0 已自带live eidt扩展 并可更改端口,WebSto ...

  4. WebStorm使用JetBrains IDE Support调试

    1.安装WebStorm 2.安装谷歌的chome浏览器,并切换到开发者模式 3.下载并安装 JetBrains IDE Support(将2.0.7_0.crx文件直接拖到谷歌浏览器中就会自动安装) ...

  5. 关闭jetbrains ide support 正在调试此浏览器提示

    1 安装JetBrains IDE Support插件 插件地址 2 启用插件 3 设置访问端口 4 WebStorm中设置Live Edit 5 关闭"JetBrains IDE Supp ...

  6. JetBrains IDE全新UI预览版来了,要做简洁与强大兼顾的IDE

    5月23日,JetBrains发布了一篇博文,透露他们正在实现一套全新的界面界面. 他们认为目前行业中的用户界面趋势已经发生了演变,很多新用户认为JetBrains IDE的界面过于笨重,而且过时.所 ...

  7. IDE:IDEA Commit Changes Dialog local changes refresh

    IDEA提交代码,一直卡着不动,显示:Commit Changes Dialog local changes refresh 修改方法为: go to settings - version contr ...

  8. mac 下jetbrains IDE系列IDE主题

    1.直接粘贴导入 使用shift+command+g键进入: ~/Library/Preferences/ 在下边找到当前的IED(WebStrom.IdealIC.PyCharm) 然后在下边找到c ...

  9. Jetbrains IDE 中 compass sass 设置

    环境 Ubuntu 13.10 1. 安装ruby sudo apt-get install ruby 如果后面安装 compass 时遇到安装失败,提示:“[Ubuntu] ERROR: Faile ...

  10. PyCharm 恢复默认设置 | JetBrains IDE 配置文件安装目录

    网上的答案为什么都乱七八糟并且全都全篇一律?某度知道是发源地? 先说 Mac 按需运行下面的 rm 删除命令 # Configuration rm -rf ~/Library/Preferences/ ...

随机推荐

  1. NC50940 Running Median

    题目链接 题目 题目描述 For this problem, you will write a program that reads in a sequence of 32-bit signed in ...

  2. NC16645 [NOIP2007]矩阵取数游戏

    题目链接 题目 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵 ...

  3. 【Unity3D】角色控制器(CharacterController)

    1 简介 ​ 控制角色移动的组件主要有:Transform 组件.Rigidbody 组件.CharacterController 组件.Transform 组件通过控制角色位置实现移动,Rogidb ...

  4. Java设计模式-外观模式Facade

    介绍 外观模式(Facade),也叫"过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 外观模式通过定义一个一致的接口, ...

  5. 《深入理解Java虚拟机》(四) 调优工具、指令

    目录 JVM 调优的概念 jps 1.options 功能选项 2.hostid jstat 1.vmid格式 2.interval 和 count 3.option jinfo jmap jhat ...

  6. [攻防世界][Reverse]xxxorrr

    将目标文件拖入IDA 反汇编main函数 __int64 __fastcall main(int a1, char **a2, char **a3) { int i; // [rsp+Ch] [rbp ...

  7. go语言range语句中的值的坑

    在range语句中生成的数据的值是真实集合元素的副本,它们不是原有元素的引用.这意味着更新这些值将不会 修改原来的数据,同时也意味着使用这些值的地址将不会得到原有数据的指针. package main ...

  8. 【Filament】Filament环境搭建

    1 前言 ​ Filament 是一个实时物理渲染引擎,用于 Android.iOS.Linux.macOS.Windows 和 WebGL 平台.该引擎旨在提供高效.实时的图形渲染,并被设计为在 A ...

  9. 修改centos7虚拟机的用户密码

    在忘记原密码无法登录桌面的情况下,修改centos7的用户密码 非常规启动,进入编辑启动菜单 在启动GRUB菜单中选择编辑选项,按键e进入编辑; 找到linux16开头的一行,在该行中寻找ro的所在地 ...

  10. 【LeetCode剑指offer#05】回文链表的两种解法+删除链表中间节点(链表的基本操作)

    回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表.如果是,返回 true :否则,返回 false . 示例 1: 输入:head = [1,2,2,1] 输出:true 示 ...