使用 git rebase 合并多个 commit

首先我们查看一下当前提交历史:

atreus-MBP:code (test) $ git log -4 --oneline
da3ba01 (HEAD -> test) 3
9d2725f 2
44f23cb 1
61e7d87 (origin/test) merge: Merge branch 'test' of https://gitee.com/atreus1125/code into test

我们通过 git rebase -i 61e7d8744f23cb9d2725fda3ba01 这三个提交合并,这里的 61e7d87待合并的提交区间的前一个提交的哈希值

atreus-MBP:code (test) $ git rebase -i 61e7d87
[detached HEAD 92d933c] 1 & 2 & 3 2
 Date: Wed Jan 24 12:06:50 2024 +0800
 1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/test.

执行之后会进入到 vim 编辑器中,每一行代表一个 todo 项。我们这里需要 pick 第一个提交并将后面两个提交向前压缩。

修改前:

pick 44f23cb 1
pick 9d2725f 2
pick da3ba01 3

# Rebase 61e7d87..da3ba01 onto 61e7d87 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
#                    commit's log message, unless -C is used, in which case
#                    keep only this commit's message; -c is same as -C but
#                    opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
#         create a merge commit using the original merge commit's
#         message (or the oneline, if no original merge commit was
#         specified); use -c <commit> to reword the commit message
# u, update-ref <ref> = track a placeholder for the <ref> to be updated
#                       to this position in the new commits. The <ref> is
#                       updated at the end of the rebase
#

修改后:

pick 44f23cb 1
squash 9d2725f 2
squash da3ba01 3

# Rebase 61e7d87..da3ba01 onto 61e7d87 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
#                    commit's log message, unless -C is used, in which case
#                    keep only this commit's message; -c is same as -C but
#                    opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
#         create a merge commit using the original merge commit's
#         message (or the oneline, if no original merge commit was
#         specified); use -c <commit> to reword the commit message
# u, update-ref <ref> = track a placeholder for the <ref> to be updated
#                       to this position in the new commits. The <ref> is
#                       updated at the end of the rebase
#

:wq 保存后会自动进入注释编辑,这里需要修改我们想要保留的最终 commit message。

修改前:

# This is the commit message #2:

2

# This is the commit message #3:

3

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Wed Jan 24 12:06:50 2024 +0800
#
# interactive rebase in progress; onto 61e7d87
# Last commands done (3 commands done):
#    squash 9d2725f 2
#    squash da3ba01 3
# No commands remaining.t/COMMIT_EDITMSG" 28L, 610B
# You are currently rebasing branch 'test' on '61e7d87'.
#
# Changes to be committed:
#       modified:   src/main/java/file
#

修改后:

1 & 2 & 3

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Wed Jan 24 12:06:50 2024 +0800
#
# interactive rebase in progress; onto 61e7d87
# Last commands done (3 commands done):
#    squash 9d2725f 2
#    squash da3ba01 3
# No commands remaining.t/COMMIT_EDITMSG" 28L, 610B
# You are currently rebasing branch 'test' on '61e7d87'.
#
# Changes to be committed:
#       modified:   src/main/java/file
#

保存后即可完成 rebase,此时 git 日志如下:

atreus-MBP:code (test) $ git log -2 --oneline
92d933c (HEAD -> test) 1 & 2 & 3
61e7d87 (origin/test) merge: Merge branch 'test' of https://gitee.com/atreus1125/code into test

相关推荐

  1. 使用 git rebase 合并 commit

    2024-01-25 13:04:02       32 阅读
  2. js实现word合并使用docx-merger库

    2024-01-25 13:04:02       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-25 13:04:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-25 13:04:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-25 13:04:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-25 13:04:02       20 阅读

热门阅读

  1. openssl3.2/test/certs - 043 - 4096-bit leaf key

    2024-01-25 13:04:02       38 阅读
  2. v-if 导致 elementui 表单校验失效问题解决

    2024-01-25 13:04:02       31 阅读
  3. linux Socket 缓存 介绍

    2024-01-25 13:04:02       34 阅读
  4. 看完「繁花」我悟了:认真赚钱,终成大佬

    2024-01-25 13:04:02       43 阅读
  5. Git搭建

    Git搭建

    2024-01-25 13:04:02      35 阅读
  6. 《设计模式的艺术》笔记 - 状态模式

    2024-01-25 13:04:02       29 阅读
  7. C++高级编程——STL:list容器、set容器和map容器

    2024-01-25 13:04:02       33 阅读
  8. SpringMVC知识点简单规整

    2024-01-25 13:04:02       31 阅读
  9. Swiper轮播图后端接口实现

    2024-01-25 13:04:02       34 阅读
  10. LFU算法

    LFU算法

    2024-01-25 13:04:02      32 阅读
  11. 聊聊PowerJob的MapProcessor

    2024-01-25 13:04:02       27 阅读