在用git做版本控制器的时候,经常会遇到以下情况:
1、在做功能的时候,你自己觉得代码没问题了,就本地commit,然后提交代码,测试之后你还有修改的地方,改完之后,本地commit,推到远程。到此功能做完,但是做完之后发现,你的一个功能commit了两次,当然根据实际情况有些时候你为了做一个功能,来回不止两次,这样子的提交会让这个分支看起来有点杂乱。那么你会想要将你的几次commit合并成一个commit后,再提交,那样子分支看上去会非常清爽。
2、当你做功能的时候,你会遇到需要零时提交的情况(比如你在做A任务,突然来了B任务,在你A任务分支上你会先commit一次,等B任务做完,再回来继续做A,做完之后会再次commit),此时你的一个任务有会有多个commit存在。当然这种情况可以使用stash,pycharm里面有个shelf可以用。
3、突然发现之前有的commit 写的很啰嗦,又不想回退太多,只想合并之前的commit
本文的主要目的是教你怎样将git中多次commit合并成一个commit。
(1)
git log看一下当前分支的提交情况,下图中有三个commit点。从先到后是:fix pylint 1, fix flake8 2, fix pep8 3。需求是:把fix pylint 1, fix flake8 2, fix pep8 3这3个commit点清除,重新提交。
首先 使用 git rebase -i 输入tab键,查看提示
我们要接到update git ignore之后,所以我们rebase到这里,输入
git rebase -i HEAD~3
出来一个vim的编辑框,
具体的操作下面的 Commands 说明得很清楚了,
具体可查看git文档:https://git-scm.com/docs/git-rebase
pick就是不变
reword就是修改commit注释
对于 commit 合并可以使用 squash、fixup 指令,
区别是 squash 会将该 commit 的注释添加到上一个 commit 注释中,
fixup 是放弃当前 commit 的注释;
drop 就是删掉这个commit
然后我们将3个 pick 改为drop ,保存退出。
之后再次查看git log。
最近的都drop掉了,此刻,我们就可以重新修改并提交一个新的commit了。
当然如果想查看当前commit 之后的可以输入
git reflog
git reset --hard dd06add 回滚 到之前的就回来了
哈哈 我胡汉三又回来了。
(2)
git log看一下当前分支的提交情况,下图中有三个commit点。从先到后是:fix pylint 1, fix flake8 2, fix pep8 3。需求是:把fix pylint 1, fix flake8 2, fix pep8 3这3个commit点合成一个,重新提交。
依旧是
git rebase -i HEAD~3
然后改成这样
再次查看git log
完美
然后
git push -f
完成
(3)
git log看一下当前分支的提交情况,有两个commit message 都是export data use pandas | xlrd xlwt 。需求是:把export data use pandas | xlrd xlwt这2个commit点合成一个,重新提交。
那我们现在就要 rebase 到 josephus 这个commit message上
然后出现
我们把第二个的pick 改为 squash,使用这个commit 但使用前一个的commit message
改为这样
然后会提示你将两个commit和为一个commit的时候写哪些commit message
删掉留一个就好了
我们再次查看git log
两次commit 已经合成一个commit了 ,而且合成为一个commit message。
大功告成!