让Git变美的技巧 2022-04-01 17:54 > 收集一些Git使用时的小技巧,持续更新 ## 1、git commit --amend ### 场景 假如你正在做一个需求,叫做新增配置管理。现在你完成了代码的编写,然后使用Git提交了代码,并push到了这次需求的远程分支。 但是刚刚push之后你想到,有一个地方写错了,或者少写了几句代码。于是你将其修复掉,然后再次提交,这样,一个需求就有了两次提交记录,而第二次仅仅是对第一次的修复或者补充。他们完全可以是一次提交。 ![](http://minio.riun.xyz/riun1/2022-04-01_2orZyMQTRlPhDfVbnB.jpg) 这种情况下要怎么办呢? git commit --amend就是为这种情况而生的([官方文档](https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%92%A4%E6%B6%88%E6%93%8D%E4%BD%9C)):最终你只会有一个提交——第二次提交将代替第一次提交的结果。 ### 解决 > 为了方便使用master分支做示例 第一次进行提交: ![](http://minio.riun.xyz/riun1/2022-04-01_2osb2pZ8yHzvXA5tT6.jpg) 推送: ![](http://minio.riun.xyz/riun1/2022-04-01_2osbKzfuXyXijfxHeN.jpg) 这时候发现有漏的内容,赶紧补充并再次提交。注意,提交的时候点击“提交选项”,并选择“修改最后一次提交”。弹出框选择“是”: ![](http://minio.riun.xyz/riun1/2022-04-01_2ow9W9MMhlQXL65aQ3.png) 这时候就会看到,上次的提交Message“新增配置管理”已经自动出来了,点击“提交”即可: ![](http://minio.riun.xyz/riun1/2022-04-01_2oseSZVjSSwKSsXryO.jpg) 然后再点击“推送”(**注意千万不要拉取!**): ![](http://minio.riun.xyz/riun1/2022-04-01_2osfXtdC24V1ZHA67m.jpg) 弹出框勾选“强制推送”(如果没有强制推送选项,则可在“工具”->“选项”->Git栏下方找到“启用强制推送”和“使用安全的强制推送”,点击选中即可),最后点击推送按钮,弹出框选择“是”: ![](http://minio.riun.xyz/riun1/2022-04-01_2osgUglTpvbOQebFzw.jpg) 最后可看到,只有一次提交记录,并且内容是两次提交的内容: ![](http://minio.riun.xyz/riun1/2022-04-01_2osjfIuKuEFivHqyM4.jpg) ![](http://minio.riun.xyz/riun1/2022-04-01_2osjN1QQirDw7TKMRh.jpg) ### Tips 1、这个命令对于已提交未推送,和已提交已推送的都起作用。 2、如果是Mac,则sourceTree可能会没有开启强制推送的选项,那么到最后强制推送的一步可以使用命令: `git push origin branchName --force-with-lease(-f也可)` 分支名注意换成你自己的分支。推送成功后source Tree可能不会即时显示正常,可以重新打开应用或标签页即可。不放心也可也使用git log查看是否只有一次提交。使用git status查看工作区是否干净。 ## 2、rebase rebase有好多用法,常用的比如: 1、将a分支合并到master分支,但是不用merge的方式,用rebase的方式,这样就能使提交记录变成一条条直线,而不是各种交错的线。 2、将多个commit合并成一个。这个是不是跟前面amend有点像?不过他们说不一样的,amend说在提交的时候,合并上一个;而rebase是在提交之后,甚至说已经push到远程了,我还想把好多commit合并成一个(这些commit在逻辑上实现了同一个功能,因此就想弄成一个提交)这时候就能用rebase了。 ### 2.2 rebase将多个commit合并成一个 提交了多个commit,并且都推到远程了,MR的时候嫌太多commit了,想要合并成一个,怎么办? > 这位老哥的教程,写的非常详细,这里我只是记录一下,方便我以后回看。请看老哥原汁原味带图片的教程:https://blog.csdn.net/Spade_/article/details/108698036 --- > 操作前先切换到自己的分支,在做下面的操作的时候不要担心,rebase时git会创建一个临时分支并自动切换到临时分支,如果操作失误,则可以手动切换到自己的分支即可;操作成功,则git会自动切换到本来的分支并删除临时分支 1、git log -22 查看前22个commit(因为我提交的实在很多,数了数有22个,就一下查看到底。看下自己首次提交是不是第22个) 2、git rebase -i HEAD~22 执行命令后会进入vim编译器,看到一个历史版本的提交记录,每个记录前面都是pick开头,我这里只想留一个commit,所以最后一次提交不动,其他我的提交全部把pick修改为fixup,这个表示丢弃当前commit,就是说当前commit会被丢弃(只是commit提交记录丢弃,代码不会丢弃)注意,不是你的commit不要修改! 修改后直接保存退出(Esc然后:wq) 3、git push --force 强制推送到远程(和amend一样,必须强制推送),如果出错的话可以使用git push origin 分支名 --f 看下commit记录,22条已经变成一条了。 --END--
发表评论