最近在提交项目的时候,遇到了这样一个问题,就是出现了多个没有保存的本地的commit,在push到远程仓库的时候显示git push remote rejected{change ### closed}
,仔细看了下问题,主要是因为自己本地的commit中出现了这样的情况:多个commit之间虽然commit-id不同,但是change-id 重复了,而在push的时候会把多个commit都提交上去,导致出错。
在网上查了下这个问题,大多数的解决方案是:
重新执行commit --amend
删除掉原来的commit id, 之后查看会自动生成新的commit-id,这样就会解决commit id 重复的问题。
但是实际上我的问题在于change-id 冲突,即便我按照这种方式重置了commit-id,依旧没办法解决问题。
一直在纠结要不要备份之后再reset的时候,师兄给我一个好的建议,就是——把本地的多个commit合并,再重新push
Git合并多个commit 的方式
-
git log 查看提交日志
举个例子,查看到的git提交历史(由近及远):
$ git log commit 3bf6es .... commit 7h90ed .... commit 54g8ji .... commit 67udif ....
-
git rebase 合并多个commit
想要合并1~3条commit有两个办法:
- 从HEAD版本开始过去的三个版本
git rebase -i HEAD~3
- 指明要合并的版本之前的版本号
git rebase -i 67udif
两个方法的效果相同,都是将前三条commit合并为一个
-
pick 选取合并之后的提交
执行完
rebase
命令之后,弹出的内容大概如下pick 3bf6es 'issueID #145: ****'.... pick 7h90ed 'fix: *****'.... pick 54g8ji 'feat: ******'....
这种情况下,只能pick一个,其余修改为
squash
或者s
,修改之后如下:pick 3bf6es 'issueID #145: ****'.... s 7h90ed 'fix: *****'.... s 54g8ji 'feat: ******'....
:wq
保存并退出,Git会主动压缩我们的提交历史,
1) 如果有冲突:修改冲突,保留最新的历史,不然修改被discard了。修改之后记得git add . git rebase
如果想放弃本次合并,执行
git rebase --absort
2) 如果没有冲突或者解决完冲突,则会进入编辑界面# This is a combination of 4 commits # The first commit's message is: .... # The 2nd commit's message is: .... # The 3rd commit's message is: .... # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an ....
:wq
保存并退出,输入git log 检查commit的历史就会发现commit已经合并了
将这个合并之后,我的change-ID冲突也就解决了,确保工作区干净之后,可以push了~