GIT 合并某几条 commit

使用 git 的工程师,在日常开发中肯定会遇到这样的问题,从 master 上拉出的分支,由于某些原因做了很多修改才提交了 merge request。此时该分支下会有多条 commit,有些 commit 是重要的,需要留存下来的关键节点,还有一些 commit 没那么重要,比如修复了一些小 bug 等,那就不需要保存到远程。

如何将某一些不需要的 commit 合并成一条呢?

当前我正好有一个提交了30次 commit 但还未 merge 到 master 上的分支,以此为例,详细讲述如何只保留关键节点,合并不重要的 commit。

GIT REBASE 指令

git rebase 指令可以理解为重置基准,目的是将当前分支重新设置开始点,从实际效果来看,可以查看当前 commit 与几个 commit 之前的代码,修改了哪些部分。

git rebase -i 中的 -i 为交互模式,即可以干预 rebase 过程中的操作。

假设当前分支有30条 commit,分别为commit 1~30,其中 commit 1为最新的 commit。

如果想将这30个 commit 中的 commit 4~9 合成一个,则需要先输入以下两条指令中的一条:

git rebase -i cb12231 (cb12231 为 commit10 的 commit id) 
git rebase -i HEAD~9

重定位到 commit 10上,如图1所示:

注:1. 本示例为了展示 commit 10 的 commit id,采用了git rebase -i HEAD~10指令;

       2. rebase 到 commit 10的 commit id,才能对 commit 4~9做合并。若 rebase 到 commit 9的 commit id,最多只能对 commit 4~8做合并;


图1.  git rebase 指令示例


图2.   最近10条 commit 示意图

图2中的 commit 顺序从上往下分别为 commit 10 ~ commit 1,即最上面的 commit 为最旧的 commit,最下面的 commit 为最新的 commit。

如果想将这9个 commit 中的 commit 4~9 合成一个,则修改图2中的文字,将 commit 4 ~ commit 8的pick均改为s,即squash(将后面的修改“挤进”早些的 commit),剩余的 commit 保留 pick 状态,如图3所示:


图3.  合并 commit 操作示意图

保存该页面,即将 commit 1~3 原样保留,commit 4~8均合并至 commit 9。


图4.  合并 commit 后的git操作

图4为合并之后 git 软件自行的动作,会将这几个 commit 进行 squash 操作。在完成后,会呈现如图5的示意:


图5.  squash后的示意图

对该页面中的 commit message 编辑,重新形成本次修改后的 commit message。

完成之后即合并了 commit4~9,同时将 commit 1~3 原样保留了下来。


但是在合并 commit 过程中,可能出现冲突,即两次 commit 中修改了同样的地方,那就需要在本地,或者 git 软件中解决冲突。在解决冲突之后,使用

git rebase --continue

继续完成合并动作。

一般冲突不会在自己的几次 commit 中出现,而是在自己的代表与别人修改过的 master 合并时,才会出现。




猜你喜欢

转载自blog.csdn.net/panfengzjz/article/details/79318659