假设我们在feature分支上进行功能开发时,一个小功能commit了n多次,当feature代码合并到master时,master上就会出现我们这n多次的提交,如果此时,我们需要进行code review或者回退版本时,这n多个commit就会显得十分碍眼,难道我要一个个commit去check吗?
这时候合并commit就显得很重要的。
本地合并多个commit
假设我在本地分支上已经commit了几次,但是还未push到远程仓库,这时候我想把它们合并为一个commit再提交。
如图,我想把最上面两次提交给合并为一个。
git log。
git rebase -i 807ca8 回车
解释下 git rebase -i 807ca8, 807ca8是最新两次commit后的一个commitID,我们想合并最新两个提交,git rebase 会获取807ca8这个提交前面(前面指时间距离当前更近)的两个提交,-i表示进行vim编辑。出现:
我们想要合并的两个commit记录显示在了顶部, 然后键入i可以进行编辑,
下面Commands解释如下:
pick:保留该commit(缩写:p)reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
我们将第二个提交前的pick改为s,将它和前一个commit合并。
然后ESC, 输入:wq保存
在这里,我们可以编辑合并后的提交的提交内容。或者直接esc+:q退出。
此时git log
对比一下,发现合并成功~这时再push到远程仓库。
合并远程commit
如果还想要合并远程commit怎么做呢?
友情提示:远程commit不要随意更改~
方法是一样的。选取commit合并后需要将我们的修改push到远程仓库。
如果运行git push 时报错,改成下面的命令强制提交就好了
git push -u origin master -f
合并仅有的两个commit
在只剩两个commit的情况下,我们使用git rebase会发现有问题,报错如下:
cannot 'squash' without a previous commit,在没有前一个commit时不允许使用squash合并,很好理解,前一个分支都没,你和谁合并呢。
出现这个报错,运行 git rebase --abort 可以退出rebase。
那怎么合并呢?
git reset为你合并。
git reset --soft HEAD^1
git commit --amend
i编辑:wq保存并退出
git push -u origin 分支名 -f
解释一下:
我们发现现在我们只有两次commit,而且没有需要提交的内容。
执行git reset --soft HEAD^1
再git log 发现,最新的提交已经不存在了,只剩一个提交。HEAD^1指向HEAD之前的一个提交。
git status 我们发现那个消失的commit变成了我们本地未提交的更改。
git reset 分支名 意思是回退到某分支(丢弃该分支),
--soft表示,丢弃该提交但是保存这个提交的内容--hard 会丢弃该提交与该提交的内容.
随后 git commit --amend 将status中的内容与剩余那个提交进行合并,同时可以修改提交的注释。
接着push到远程仓库便完成了合并。
更简单的合并方法
如果我们只需要与上一个commit进行合并,我们在本地commit时,
使用下列命令:
1.git add
2.git commit --amend
3.git push -u origin 分支名 -f
git commit --amend 将当前status中的修改与上一个commit进行合并,且可以编辑上一个提交的注释作为合并后的注释。
完成。
处于不断的学习过程中,总结下来为了以后方便查阅。
希望和各位大佬交流。