git将几个commit合成一个commit

350 阅读3分钟
事情是这样的,习惯了原先杂乱无章的提交代码后,我还是随心所欲的提交代码,但是问题来了,合并分支的时候就会觉得头大,总觉得解决不了那么多冲突,于是曙光同学告诉我如果两个分支 commit 的次数相差不是很多的话,可以使用 cherry-pick 去处理每一次 commit,于是我心慌慌的从早上开始处理,但是很庆幸,十几次 commit 居然没有一次需要我解决冲突,因此我很开心的解决问题下班回家了。哦,对了,在下班之前因为要处理别的分支上的代码,就随手将当前分支的代码 commit 了本地仓库。今天我又修改了一部分代码要提测,使用 git status 的时候发现说我本地的仓库优先于远程仓库一次提交,需要使用 git push 来提交。what???难道不是我再提交的时候一起 push 的吗?于是我急急忙忙的去咨询曙光同学,他跟我说的本地有两次 commit 的话,push 到远程也是两次 commit,这怎么行,这怎么能让别人看到我是一次提交的呢?这怎么能让远程的提交减少呢?然后我就去查资料,终于,功夫不负有心人~~~
背景描述完了,实际上这篇文章解决的就是怎样把本地的多次 commit 合成一次,然后完美的 push 到远程~~

首先,肯定是将本地的文件都 add 然后 commit 了~

然后,我们使用 git log 查看提交的日志:


可以看到优先于远程分支有两次 commit ,现在要做的事情是将这两次 commit 合并成一次。
使用命令 git rebase -i commitId,这里的 commitId 是两次 commit 合并之后需要跟着的那个 commitId,并不是这两次中的某一个 commitId。


然后会进入 vi 编辑模式。


这其中的意思为:
  • pick 的意思是要会执行这个 commit
  • squash 的意思是这个 commit 会被合并到前一个commit
根据现在的需求,需要将 “这是我的第二次提交” 合并到前一个 commit 中,因此要将 “这是我的第二次提交”前面的 pick 改为 squash。


注:vi 模式下,输入 i 进入编辑模式,输入完成后,按下 esc,并且按下 冒号,输入 wq 进行保存。

此时,会跳转到之前 commit message 的编辑界面。


我们将里面的提交信息修改一下。


保存退出后,返回到最初始的命令界面。


看到 successfully 说明我们成功了,然后在输入 git log 看一下日志。


然后,输入 git status 查看一下状态。


很开心的发现本地的分支只领先于远程分支一个提交了,于是可以很愉快的执行 git push了。
在远程看一下提交记录,只有一次,so happy~~~


感谢曙光同学最近给我的科普~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

很开心的发了文章,发给曙光同学查看,他问了我两个问题:

  1. 你commit以后,发现有个地方写的不对,又改了代码,但是你不想再提交一次commit,怎么处理?
  2. 你commit后,发现提交注释写错了,怎么修改?
此等小事怎么可能难倒我(但是我真不会,虽然我有疑问),于是慌忙百度,可以使用 amend,正确的使用方式如下:
git commit --amend
但是百度告诉我了啊,这个命令只能修改最后一次 commit,然后我就很开心的跟曙光同学辩论,这个只能修改最后一次的注释啊,我还是不能操作前一次啊等等~~

事实证明,不熟的东西真的很容易打脸的~~

上述的修改了两次代码不想提交两次,完全可以使用 amend 来解决,正确办法就是,第二次修改完了之后,执行 git add,然后再执行 git commit --amend 就可以。

还是感谢曙光同学的监督呀~~