Idea-Git与命令行操作合并多次commit为一个/合并提交--图解

简介说明​

        本文用实例介绍如何合并git的提交。用Idea可视化和命令行操作两种方法进行展示。

​为什么需要合并提交​

        实际开发会有这种场景:开发在开发分支修复了某个bug,但提交了多个commit,将它cherry pick到测试分支很麻烦,如果只将一个提交cherry pick到测试分支就会很方便。

​action含义​

pick:git会应用这个补丁,以同样的提交信息(commit message)保存提交

reword:git会应用这个补丁,但需要重新编辑提交信息

edit:git会应用这个补丁,但会因为amending而终止

squash:git会应用这个补丁,但会与之前的提交合并

fixup:git会应用这个补丁,但会丢掉提交日志

exec:git会在shell中运行这个命令

方案1:使用Idea
​需求描述​

下边红框里的3此提交已经push到远程仓库,现在想把它合并为一条,这样方便cherry pick到其他分支。

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第1张图片

​第1步:在首次提交记录上rebase​

本处的首次提交是“第1次修改”。

右键“第1次修改”=> Interactively Rebase from Here

​第2步:合并提交(选squash或fixup)​

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第2张图片

选中“第2次修改”=> 点击“Squash”

选中“第3次修改”=> 点击“Squash”

这里也可以ctrl+A,然后点击“Squash”,效果一模一样。

结果如下:

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第3张图片


第1次提交默认是“pick”。本处Idea无法设置,写死是pick
Reword:可以修改单个的提交信息
Squash那个下拉还可以选择“fixup”。

​第3步:重命名提交​

选中“第1次修改”=> Reword=> 输入新的提交信息

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第4张图片

修改“第1次提交”为:“第1,2,3次提交”,改完效果如下

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第5张图片

​第4步:执行rebase​

点击上边一步的“Start Rebasing”之后,提交结果如下:(3条提交合并为了一条)

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第6张图片

​第5步:push​

        本步我采用Force Push,因为这个bug分支只有我自己改。

         如果他人也在这个里边,要用Merge,见下方“push详解”。如果与别人在同一个分支,还Force Push,会覆盖别人的代码,小心被套麻袋????

 Force Push,结果如下:(成功提交)

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第7张图片

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第8张图片

注意事项
上一步中,如果选择“Push”,而不是“Force Push”,则push被拒绝,需要选择操作:

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第9张图片

“Merge”:原先的3条提交信息还在,只是会新生成1个整合后的提交。

“Rebase”:后边需要force push,原先的3条提交信息会被替换为1条提交。

​若选择“Merge”​

        如果点击“Merge”,原先的3条提交信息还在,只是会新生成一个整合后的提交(示例中是“第1,2,3次修改”)。

结果如下:

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第10张图片

​若选择“Rebase”​

结果:

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第11张图片

此时需要Force Push,结果如下:(成功提交)

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第12张图片

如果上一步又选了“Push”,结果如下:(再次出现了选择“Merge”还是“Rebase”)

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第13张图片

 如果点击“Rebase”,结果如下:(提交记录恢复原样)

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第14张图片

  如果点击“Merge”,结果跟上边“​若选择“Merge”​”是一样的:

Idea-Git与命令行操作合并多次commit为一个/合并提交--图解_第15张图片

方案2:使用命令
       

(1)git log看一下当前分支的提交情况,下图中有三个commit点。从先到后是:add 1 line,add 2 line, add 3 line。需求是:把add 2 line, add 3 line这两个commit点合并成一个commit点。

 (2)开始合并,敲下面这个命令:这里面的commitId是你要合并的两个commit后所形成的一个commitId需要跟着的commitId。在这边也就是add 1 line的commitId.

git rebase -i commitId

 其中,-i 的参数是不需要合并的 commit 的 hash 值,这里指的是第一条 commit, 接着我们就进入到 vi 的编辑模式

 进入vi模式后,在键盘上敲i键进入insert模式。这时候先看看这里面的东西是什么含义,

pick 的意思是要会执行这个 commit
squash 的意思是这个 commit 会被合并到前一个commit
我们这边需要将"add 3 line"这个commit合并前前一个commit,也就是合并到“add 2 line”的commit中,那就需要修改成如下的:

 修改完成后,按esc键,冒号,输入wq进行保存。之后会继续跳转到commit message 的编辑界面:

注释中有写第一个commit信息和第二个commit信息,现在需要你合并这两个信息成一个commit信息。我这边合并成如下信息:

然后你就保存退出,跳回到最初的命令界面:

 看到successfully的字样就说明成功了。再git log看一下commit情况:

 从图中就看到已经将add 2 line和add 3 line的commit合并成了this is combination of 2 commit

你可能感兴趣的:(idea,git,intellij-idea,git,java)