保存本地 commit 记录的同时合并提交到 origin

开发中需要让开发分支保持整洁,因此本地分支分为两个。

  • 一个是 master 分支,用来和 origin 分支保持一致并提交到 origin 分支。
  • develop 分支,用来做开发。并保存本地的开发记录(commit 记录,因为 rebase 会丢失 commit 记录,我不想丢失)。

现假设我们从 origin 产生本地 master 分支和 develop 分支,在 develop 分支开发,产生了 6 个 commit。

我们现在需要把这四个 commit 合并到 master 分支上并提交到 origin。

图片丢失,幻想一下吧。

那么,假设我们只需要将 commit2、3、4 合并成一个 commit 并整合到 master(比如分到两个开发任务,但是开发的时候忘记提交,代码混合在一起了,但是 2、3、4 是第一个 issue 的),最后 review 并提交到 origin。

Step1、创建分支并在 develop 产生提交

先注意一下:

不要通过 rebase 对任何已经提交到公共仓库中的 commit 进行修改(你自己一个人玩的分支除外)。 一般也不会有权限 push 的

rebase 的作用简要概括为:可以对某一段线性提交历史进行编辑、删除、复制、粘贴;因此,合理使用 rebase 命令可以使我们的提交历史干净、简洁!

以上文字纯属照抄。

首先创建分支:

git branch develop
git branch master(应该克隆下来就有了,按自己的来)

然后我们切换到 develop 分支进行开发。

以下省略开发无数代码。

那么,现在要做的就是将 2-4 的 commit 放入 master 上,并且合并为同一个。

Step2、将 commit 复制到 master 上

切换到 mater 分支上,然后执行如下命令。

git rebase [startpoint] [endpoint] --onto [branchName]

startpoint 表示开始的点,endpoint 表示结束点,但是有点左闭右开的意思。

即如果要合并 2、3、4 的 commit 并提交到 master 上,应当是如下语句。

git rebase 8bedc1d 2c1955b --onto master

前几次提交已经到了 master 分支上了。

那么现在可以进行合并操作了。

Step3、将 master 上的 commit 合并

git rebase -i HEAD~3

其中-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支 HEAD 所指向的 commit(注:该区间指定的是一个前开后闭的区间)。

之后的界面如下,可以使用 vim 进行编辑。大致解释 git 也给出来了。接下来翻译一下。

图片丢失,自行操作一下吧。

翻译如下:

pick:保留该 commit(缩写:p)

reword:保留该 commit,但我需要修改该 commit 的注释(缩写:r)

edit:保留该 commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)

squash:将该 commit 和前一个 commit 合并(缩写:s),两个注释分成两行。

fixup:将该 commit 和前一个 commit 合并,但我不要保留该提交的注释信息(缩写:f),只保留前一个 commit 信息。

exec:执行 shell 命令(缩写:x)

drop:我要丢弃该 commit(缩写:d)

根据我们的需求,只有第一个是 pick,其余全是 squash。

修改如下:

pick dbf1da1 commit 2
s 3454a8f commit 3
s 2c1955b commit 4

wq 保存之后

这个界面可以类似理解为,已经合并完了,但是要你修改一下 commit 信息。所以按照正常的 commit 信息填写即可。

wq 保存。即可看到变更。

此时已经达到目的了。我们的本地 commit 记录保留下来了,并且 master 上也只有 commit2、3、4 的提交。如果不需要保留本地的 commit 记录,则可以直接从第三步开始操作。