如何使用Git将多个commit合并

1,026 阅读5分钟

背景

在开发过程中, 我们总是会多次的提交commit message, 那么最后我们合在主分支上的时候就会显得杂乱无章, 那我们该怎么处理这种情况呢? 接下来我分几种情况来解决一下.

情景一: 本地已经提交过一次commit, 但是这时我又修改了一些内容, 但是又不想再提交一次commit, 怎么办.

这种情况就可以直接使用 git commit --amend , 这个命令可以用来更改commit message, 也可以将这一次的修改放在commit中. 然后保存退出, 这样就保存了修改, 而且只提交一个commit message . 具体操作如下.

  1. 首先使用git log 查看一下已经提交的commit

此时我们提交了一次commit, 当我们这时候修改了内容

2. 修改内容后, 使用git status查看需要提交的内容

我们可以看见此时我有需要提交的内容, 但是我不想又新创建一个一个commit怎么办呢

3. 使用git add .,然后我们使用git commit --amend命令

然后就会进入到这个界面, 此时我们将commit message改为"第一次提交(合并后)", 然后wq保存退出.

4. 此时我们在使用git log看一下我们提交的commit massage.

我们可以看见只有一个commit了

情景二: 本地已经提交多次commit, 但是我想把多次的commit合在一次, 作为一次提交.

此情景下我们可以使用两种方法来解决

  • 方法一

    1. 首先还是一样,我们使用git log查看一下我们的提交记录.

    此时我本地分支我提交了四次commit, 我想合成一次commit该怎么做呢?

2. 我们可以使用git reset --soft这个命令

使用之后我们可以看见我们已经回到第一次版本中了.

这个稍微多说一句, 解释一下为什么要用 git reset --soft 这个命令哈, 因为我们回退版本会有两个命令, 一个是git reset --hard, 一个是git reset --soft, 他们两个不同的地方呢, 就是第一个命令不仅仅是将版本回退到指定版本, 还会重置暂存区, 代码也会回退到这个版本,而第二个是软回退, 就是说将版本回到指定版本后, 但是该版本之后提交的内容将移动到暂存区

3. 此时我们使用git status查看一下代码是否已经回到暂存区了呢

确实回到暂存区了, 那么这个就跟情景一相同了, 我们就可以用git commit --amend操作了.

  • 方法二
  1. 这个时候我们时光倒流, 回到刚开始的时候, 使用git log查看提交记录

一样, 四次提交记录, 但是我们要用另外一种方法将它合成一个commit

  1. 然后这时候我们使用git rebase -i这个命令.

然后会出现如下界面, 红色是操作区域, 绿色区域是指令说明区域

指令说明
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)

3. 所以此时我们将2,3,4次的pick都改为s, wq保存退出

4. 接下来我们就会进入到如下界面

我们可以使用dd删除一行

修改之后, 保存退出

5. 然后可以看见更新成功

6. 最后我们使用git log再次查看一下

已经变成我们先要的commit了, 完成

  • 区别

情景二有两种解决方法, 那两种方法的原理是什么呢?

git reset --soft 原理就是将代码回退到某个版本, 然后我们再一次进行提交, 此时我们提交的时候可以选择上一个commit或者新创建一个commit.

git rebase 原理就是只是合并commit, 没有对代码进行提交, 而且git rebase 可以合并一个区间, 比如我提交了4次,但是我想保留第1次和第4次,那么我就可以使用 git rebase -i [startpoint] [endpoint] 将第2次和第3次合并, 如果不指定就是开区间, 终点默认指向当前分支的版本上. (合并区间可以自己实操一下哟)

情景三, 那我们有的时候已经把代码push到自己的分支上了,那这个该怎么办呢

遇到这样情况也不用慌, 我们可以按照一二情景将代码合并成自己想要的commit后, 使用 git push -f命令, 这命令可以覆盖掉之前提交的commit, 所以, 在操作之前, 一定要想好自己要替换哪些commit, 这个部分就不在继续操作了

注意

注意以上操作都是针对于本地分支以及自己的远端分支, 不要在公共分支上操作哟.

最后

暂时我只能想到这些情景, 如果有需要补充的可以留言说明哟, 给大家推荐一篇有关Git原理的文章吧.