在用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。
大功告成!
本文围绕git版本控制展开,介绍了使用git时会遇到多次commit使分支杂乱的情况,如功能多次修改提交、临时提交等。重点讲解了将git中多次commit合并成一个commit的方法,通过git rebase -i等指令操作,还提及了不同指令的区别及使用场景。
1764

被折叠的 条评论
为什么被折叠?



