0%

Git不完全使用指南 - Git合并多个commit

在我们做新功能的时候,我们可能需要自己新建一个分支,然后在这个分支上开发,由于功能复杂或者功能点很多,或者每改动一个重要的地方都要进行提交一次,这样自己在测试开发时方便回滚等操作,会产生多个临时的commit,这些临时commit其实才是一个功能点,在向团队开发分支合并代码的时候,我们为了避免太多的 commit 而造成版本控制的混乱,通常我们推荐将这些 commit 合并成一个(注意此操作不要用在公共分支,只能用在自己的功能分支上)。

1. git log查看提交记录

首先我们利用git log查看当前分支提交的历史,最近提交在最上面,如下:

1
2
3
4
5
6
7
commit 2d6454c942f3961ad351caf145bedf29c4d3743c

commit d059f47fd7ab863353cd98fb29c98ceb1fe97845

commit 951522a48081b8ab4a529fee706d94c8fe3b16c8

commit 1d85c5a75128b6127de90b9db367dc9d67bdd17a

2. git rebase

这里用到了git rebase命令,这个命令主要用于更新代码和合并commit。假设你本地和服务器目前是同步的,然后你本地做了几次commit,其他人向服务器推送了commit。如果你希望同步服务器的commit,但是本地的commit又不想push到服务器的时候(比如你开发完某个功能,可能需要5个commit)。先fetch,然后rebase服务器的代码。

这里想要合并 1~2的commit,有两种方式

  1. 从HEAD开始往后合并两次提交
1
git rebase -i HEAD~2
  1. 指定要合并的commit之前的版本号
1
git rebase -i 951522a

此时951522a这个commit不参与合并

3. 选取要合并的提交

当输入完以上两个命令会弹出一个文本文件,内容前几行如下:

1
2
pick d059f47 add test.txt
pick 2d6454c Update test.txt

此时将第二个pick改为squash或者s,之后保存并关闭文本编辑窗口即可。注意:

  • pick : 代表合并后的提交用这个提交的注释;
  • s : squash命令的简写,代表合并提交中包含这个提交;
  • d : 代表合并提交中排除这个提交。

改完之后文本内容如下:

1
2
p d059f47 add test.txt
s 2d6454c Update test.txt

保存后会弹出一个新文件,前面是你刚才要合并的两条 commit message,然后将这两条commit message删除,然后重新设置新的message,保存退出,如下:

1
2
3
4
5
# This is a combination of 2 commits.

# This is the commit message #2:

Add and update test.txt

最后就可以发现两条commit message 已经合并为一条了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
commit 9fff5fa09e09836ff2c535486ced2a66f8e4c19a
Author: Juntao Han <499445428@qq.com>
Date: Mon Mar 26 21:24:47 2018 +0800

Add and update test.txt

commit 951522a48081b8ab4a529fee706d94c8fe3b16c8
Author: Juntao Han <499445428@qq.com>
Date: Mon Mar 26 21:03:29 2018 +0800

update .gitignore

commit 1d85c5a75128b6127de90b9db367dc9d67bdd17a
Author: Juntao Han <499445428@qq.com>
Date: Mon Mar 26 20:59:13 2018 +0800

:octocat: Added .gitattributes & .gitignore files

接下来推送到git服务器就好了

向本文提出修改或勘误建议