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. docker安装报错failure: repodata/repomd.xml from mirrors.aliyun.com_docker-ce_linux_centos_docker-ce.pro

    1.进入 /etc/yum.repos.d 目录下,将所有有关 docker 的 repo 全部删掉 2.重新添加镜像 sudo yum-config-manager --add-repo https ...

  2. NC24840 [USACO 2009 Mar S]Look Up

    NC24840 [USACO 2009 Mar S]Look Up 题目 题目描述 Farmer John's N (1 <= N <= 100,000) cows, convenient ...

  3. 链表设计与Java实现,手写LinkedList这也太清楚了吧!!!

    链表设计与实现 在谈链表之前,我们先谈谈我们平常编程会遇到的很常见的一个问题.如果在编程的时候,某个变量在后续编程中仍需使用,我们可以用一个局部变量来保存该值,除此之外一个更加常用的方法就是使用容器了 ...

  4. 开启apache2的ssl访问功能

    Ubuntu 20.04 1. Apache2默认安装的时候,ssl模块是不启用的.开启命令: $ sudo apt install apache2 #安装$ sudo a2enmod ssl #开启 ...

  5. Kafka 部署完在服务器端可以访问,而在外部其它电脑访问不了

    Kafka 部署完在服务器端可以访问,而在外部其它电脑访问不了 原因:config/server.properties的listeners和advertised.listeners 不配置的话默认的l ...

  6. 5-12 RabbitMQ 消息队列

    RabbitMQ 什么是RabbitMQ RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现. AMQP :Advanced Message Queue,高级消息队列协议.它是 ...

  7. 牛牛与后缀表达式_via牛客网

    题目 链接:https://ac.nowcoder.com/acm/contest/28537/B 来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 262144K,其他语 ...

  8. stringstrean类中关于clear和str的比较

    stringstream类涉及到多次类型转换的时候容易出现异常错误 因为第一次数据如果读入eof或者输出完整来到eof,此时stringstream会自动为其添上eofbit标志位,此时继续进行任何操 ...

  9. git fetch和git pull对比

    情景重现 你:面试官您好,我是xxx,毕业于xxx学校,工作xxx年,精通各种git命令. 面试官:您好您好,我问个常见的问题考察一下您的技术水平哈.请问,git pull和git fetch有什么区 ...

  10. 体验Lambda的更优写法和Lambda标准格式

    体验Lambda的更优写法 借助Java8的全新语法,上述Runnable接口的匿名内部类写法可以通过更简单的Lambda表达式达到等效: public class Lambda02 { public ...