git commit 合并

背景

开发过程中可能有多个commit,直接合并到master分支会让master分支的git log看起来非常错乱。有一种做法就是在合并到master分支之前,在自己开发分支上将多次提交的commit合并成一个。

git squash

第一步:新建一个等待合并到master的squash分支

project-name  git:(dev-branch) git checkout master
project-name  git:(master) git checkout -b squash-branch

第二步:将dev分支合并到squash分支中并提交

project-name  git:(squash-branch) git merge --squash dev-branch
project-name  git:(squash-branch) git add .
project-name  git:(squash-branch) git commit -m 'xxx'
project-name  git:(squash-branch) git push

此时不论dev-branch中有多少个commit,squash-branch中都只有一个commit

第三步:在gitlab上提MR给项目owner,

project-name git:(squash-branch) git checkout master
project-name  git:(master) git merge --no-ff squash-branch

此时master分支上合并进来的也只有一个commit

git rebase

俗称变基操作,实际操作中,若是多人协作开发,则有可能会发生冲突。
第一步:git log查看一下历史

image.png

比如这次开发commit了三次,现在要合并和三个commit,先找到第一次提交commit的hash:
d1a5ec....................

第二步:git rebase - i d1a5ec................


image.png

此时可以看到三次提交的commit信息,第二个红框标注的是接下来要用的命令

第三步:将所有的pick换为s,然后wq保存
注意:d(drop)会丢弃commit!!!操作要非常小心!!

image.png

第四步:这里展示了所有的commit信息,手动删除你不想要的。


image.png

只留自己想提交的信息


image.png

第五步:git push -f 强制推送 -f必须要

第六步:git log命令查看是否生效
自己去试吧~

番外:
git rebase -i --root 可改变master的第一个commit

遇到不能删分支的情况,先切换到master分支,再用-D删除
$ git checkout master

$ git branch -d Test_Branch
If above command gives you error - The branch 'Test_Branch' is not fully merged. If you are sure you want to delete it and still you want to delete it, then you can force delete it using -D instead of -d, as:

$ git branch -D Test_Branch
To delete Test_Branch from remote as well, execute:

git push origin --delete Test_Branch

对于已经提交上去的commit,可通过amend去修改,覆盖最后一次commit

git commit --amend -m "New commit message"
git push -f // 强制提交

你可能感兴趣的:(git commit 合并)