Git使用之如何合并多个commit

前言

我们在开发的时候, 有时候可能会提交多个业务零散的commit, 这些个commit内容合在一块才算是一个完整的任务

为了使得提交记录美观简洁, 同时缓解强迫症症状, 那么我们需要将这些个commit合并成一个commit

如果你要合并的是最近几次commit, 那么可以使用git reset --soft进行commit撤销处理, 如下:

1
git reset --soft HEAD^3

如果你要合并的是历史中间几次commit, 那么得用到git rebase -i指令了

具体操作

假设我们需要将以下最近两个记录进行合并:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
commit def5adef853da4cc05752bdb36577c127be71ba5
Author: xxx
Date: Thu Dec 28 16:01:36 2017 +0800

优化代码

commit f36801544670e00b2f59a28e19017d2786c4085e
Author: xxx
Date: Thu Dec 28 15:59:46 2017 +0800

修复

commit 00b2f59a28e19017d2786c4085e9a28e19017d278
Author: xxx
Date: Thu Dec 28 16:59:46 2017 +0800

修复bug
(END)

那么我们执行以下命令:

1
2
3
4
git rebase -i 00b2f59

或者
git rebase -i HEAD~3

这里的commit id是需要进行合并commit的前一个, 命令执行后, 会自动打开vim文本编辑器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pick f368015 修复
pick def5ade 优化代码

# 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
  • reword: 表示修改该commit的注释
  • edit: 表示保留该commit 同时对代码内容进行修改
  • squash: 表示将该commit合并到上一个commit
  • fixup: 表示将该commit合并到上一个commit 同时丢弃该commit注释
  • exec: 执行shell
  • drop: 删除该commit

这里我们使用squash指令进行合并, 内容修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pick f368015 修复
squash def5ade 优化代码

# 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~

表示将def5ade合并到f368015

wq内容保存后, 将进入到注释修改编辑页:

1
2
3
4
5
6
7
8
9
# This is a combination of 2 commits. 
# first commit
优化代码

# second commit
修复
# Please enter the commit message for your changes. Lines starting 

# with '#' will be ignored, and an empty message aborts the commit.

我们可以对注释进行选择, 不需要的就用#号注释掉, 或者修改成别内容, 保存后, 直接开始自动合并

合并完毕后, 如果你想撤销合并 返回到合并前的状态, 可以使用以下指令:

1
git rebase --abort

通过rebase方式的合并, 会合并生成一个新的commit id, 被合并的commit可以在reflog中找回

本文为作者原创 转载时请注明出处 谢谢

B站入口

打赏通道

微信公众号二维码如下:

img

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%