git rebase 合并多个commit 方法

在开发过程中,有时一个任务会分几次commit提交,这样可能对于有些分支要cherry pick时会比较麻烦,这是我们可以通过git rebase 将几个commit合并为一个commit,再推送到远端

git rebase -i

这里指的是通过交互的手段执行git rebase, 也是合并commits 的好方法

例子

假设当前git日志文件内容是这样

➜  test git:(master) git log --oneline
bb44232 (HEAD -> master) 增加第f行
5d2e760 增加第b行,增加第c行
f443e25 增加第a行,增加第行
48d5c58 增加第6行,增加第7行,增加第8行
c4b45e6 增加第五行
0469b01 增加第四行,修改commit
cd80e8f 22222
295e1a6 11111
a772b51 1. 增加testgit文件

我想合并这几个commit

bb44232 (HEAD -> master) 增加第f行
5d2e760 增加第b行,增加第c行
f443e25 增加第a行,增加第行
48d5c58 增加第6行,增加第7行,增加第8行

1. 要先找出48d5c58 增加第6行,增加第7行,增加第8行之前的commit-id c4b45e6

执行以下命令

git rebase -i c4b45e6

会进入vim 并显示以下内容

pick 48d5c58 增加第6行,增加第7行,增加第8行
pick f443e25 增加第a行,增加第行
pick 5d2e760 增加第b行,增加第c行
pick bb44232 增加第f行 # Rebase c4b45e6..bb44232 onto c4b45e6 (4 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

命令参数解释:

pick:保留该commit(缩写:p)

reword:保留该commit,但我需要修改该commit的注释(缩写:r)

edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)

squash:将该commit和前一个commit合并(缩写:s)

fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)

exec:执行shell命令(缩写:x)

drop:我要丢弃该commit(缩写:d)

将下面几行的pick 换成s 即可,代表将下面几个合并到最近的(即pick 48d5c58)commit上,并生成一个新的commit(包括48d5c58就都没有了)

pick 48d5c58 增加第6行,增加第7行,增加第8行
s f443e25 增加第a行,增加第行
s 5d2e760 增加第b行,增加第c行
s bb44232 增加第f行 # Rebase c4b45e6..bb44232 onto c4b45e6 (4 commands)
# ...

之后可能冲突(跨commit rebase时可能会冲突),就解决冲突

然后执行git add 和 git rebase --continue

最后会弹出vim,让你填写这个最后合并的commit的注释信息

填写完 wq,就ok了

执行成功信息

➜  test git:(master) git rebase -i c4b45e6
[detached HEAD 7d9155b] 增加第6行,增加第7行,增加第8行;增加第a行,增加第行;增加第b行,增加第c行
Date: Tue Aug 13 17:46:37 2019 +0800
2 files changed, 17278 insertions(+)
create mode 100644 package-lock.json
Successfully rebased and updated refs/heads/master.

查看git 日志

7d9155b (HEAD -> master) 增加第6行,增加第7行,增加第8行;增加第a行,增加第行;增加第b行,增加第c行
c4b45e6 增加第五行
0469b01 增加第四行,修改commit
cd80e8f 22222
295e1a6 11111
a772b51 1. 增加testgit文件
42c86e2 Initial commit from Create React App

可以看到c4b45e6之上的commit都合成了一个commit了(即7d9155b,一个新的commitid)

git rebase合并多个commit总结的更多相关文章

  1. 巧用 git rebase 合并多个 commit。

    一.为什么需要合并多个 commit 呢?   有时候,我们开发一个功能. 修修补补 commit 了很多次,过多的 commit 会显得很复杂. 不够直观,不能比较清晰查看那些 commit 是对应 ...

  2. git rebase 合并提交

    git rebase 合并提交 合并最近多次提交记录 语法 git rebase -i HEAD~n 1.进入合并模式 合并最近三次提交 git rebase -i HEAD~3 然后你会看到一个像下 ...

  3. Git自动化合并多个Commit

    目录 git rebase逻辑 git editor的修改 处理git-rebase-todo文件 Python实现 当我们有多个commit或者从开源处拿到多个commit时,想合成一个commit ...

  4. git rebase 合并提交 解决超过100M文件的提交不能推送问题

    git log 现在可以看到有3个提交: change 1.mp4 size to small //发现不能推送,又改回小于100M add 1.mp4 big 改变为超过100M add 1.mp4 ...

  5. git rebase -i命令修改commit历史

    [TOC] 修改commit历史的前提 修改历史的提交是可能有风险的,是否有风险取决于commit是否已经推送远程分支,未推送,无风险,如果已推送,就千万不要修改commit了. 修改commit历史 ...

  6. 巧用 git rebase 将某一部分 commit 复制到另一个分支

    一.为什么需要将一个 commit 复制到其他分支上去呢? 在我们的实际开发的过程中,我们的项目中会存在多个分支. 在某些情况下,可能需要将某一个分支上的 commit 复制到另一个分支上去.   二 ...

  7. git rebase VS git merge? 更优雅的 git 合并方式值得拥有

    写在前面 如果你不能很好的应用 Git,那么这里为你提供一个非常棒的 Git 在线练习工具 Git Online ,你可以更直观的看到你所使用的命令会产生什么效果 另外,你在使用 Git 合并分支时只 ...

  8. 记一次使用commit提交大文件无法推送到远程库解决问题过程及git rebase使用

    记一次使用commit提交大文件无法推送到远程库解决问题过程及git rebase使用 目录 大文件无法push到远程仓库 问题 commit的大文件无法push到远程库解决办法 git filter ...

  9. git第七节---git merge和git rebase

    # git merge和git rebase 都可以进行分支合并 #git merge 合并后保留记录两个分支的记录 #git rebase合并后会展示成一个分支的记录,另一个分支的提交实际生成了一个 ...

随机推荐

  1. MySql查询日周月

    常用计算日期的函数 日 date(日期) = CURDATE() 自然周 YEARWEEK(date_format(日期,'%Y-%m-%d') , 1) = YEARWEEK(now() , 1) ...

  2. python小题目练习(一)

    题目:输出1+2+3+4+5+--+100的总数,并打印出这行式子 代码展示:# 1.定义一个初识变量total,用于后面每次循环进行累加值 total = 0# 2.利用for循环遍历累加for i ...

  3. CF484A Bits

    CF484A Bits 题目 https://codeforces.com/problemset/problem/484/A 题解 思路 知识点:贪心,位运算. 每位独立考虑,要使 \(1\) 的数量 ...

  4. 梯度下降GD,随机梯度下降SGD,小批量梯度下降MBGD

    阅读过程中的其他解释: Batch和miniBatch:(广义)离线和在线的不同

  5. vue Blob 下载附件报错

    vue Blob 下载附件报错,不妨试试: window.location.href=后台地址

  6. World Tour Finals 2019 D - Distinct Boxes 题解

    太神了,专门写一篇题解 qwq 简要题意:给你 \(R\) 个红球和 \(B\) 个蓝球,你要把它们放到 \(K\) 个箱子里,要求没有两个箱子完全相同(即两种球个数就相同),求 \(K\) 的最大值 ...

  7. Stream流中的常用方法

    count package com.yang.Test.StreamStudy; import java.util.stream.Stream; /** * 统计荷属:count * 正如旧集合Col ...

  8. 2506-nginx的配置-域名分发与负载均衡(只有配置无原理)

    nginx的安装 Windows7:官网下载,是一个压缩包,运行解压缩后的exe文件即启动了nginx,需注意的是,Windows(win7)的80端口默认被微软的IIS占用,需改成别的端口,例如80 ...

  9. mysql查询版本

    系统环境下 :mysql -V; mysql内:select version();

  10. Javaweb-文件上传和邮件发送

    1.文件上传 新建空项目 准备工作 在maven仓库里下载commons io 和 commons fileupload两个jar包 实用类介绍 文件上传注意事项 为保证服务器安全,上传文件应该放在外 ...