赞
踩
我们提交代码的时候不小心提交错了怎么办?
提交的message不小心漏掉了字母?提交的代码好像忘改了一个拼错的单词?提交了好几次了有点乱,能不能合在一起?master分支更新了,更我切出的时候不一样怎么办???诸如此类等等情况,我们的reset和rebase闪亮登场~~人生不可以重来,但是commit可以。
我提交的时候message写成了如图”第一次提交,我的第一次“,感觉怪怪的,我要改一下,改成:”第一次提交,我的第一次文件提交“;
要想完成message的修改,
第一种方法:使用amend
指令可以直接修改哦~,我们输入git commit --amend
会打开一个交互式修改窗口,如图:
可以看到第一行就是我们的错误message了,我们直接修改保存即可。这个窗口的操作跟Linux的文本编辑器是一样的,不会的宝子跟我一起操作哦~在编辑界面按下英文状态下的i
键(insert的意思),即可进入插入模式,这个模式下我们可以实现编辑和插入,正确进入插入模式左下角会有INSERT提示:
然后输入进行修改,修改完成后先按一下Esc
键,然后输入英文状态下的冒号,后面再接上wq
,如图:
回车就修改成功了~,我们再使用git -log
指令查看,会发现已经修改成功了,如图:
第二种方法:使用reset
指令修改,我们使用指令git reset --soft
即可完成,但是此指令又不是直接修改,我们先来看一下目前git的状态,使用git status
指令查看状态:
我们可以看到,没有任何变动;现在我们在a.txt上进行修改,查看状态:显示modified
然后添加到暂存区,然后提交,提交信息是"我修改了a.txt文件",我们好像没有说修改的内容是什么,现在我们来尝试修改提交信息,把内容加上;
我们先来看一下状态:执行git status
可以看到没有任何改变,现在我们执行git reset --soft HEAD~
指令,执行完好像什么都没发生,什么提示也没有;那我们再来看一下状态,输入git status
我们可以看到,又回到了modified状态~~~~这个不就是修改完的状态吗?不就是没提交时的状态嘛~应该是reset命令直接让我们回到了提交之前,时光倒流,我们来看一下日志,是不是真的时光倒流了:
可以看到只有一次提交,确实是时光倒流了~那我们就可以把做错的事重新做一遍了,现在我们就只需要重新提交即可,可以看到确实已经完成了修改了。
此时别急着开心哦~乘着记忆犹新我们快来了解一下这个能让时光倒流的指令:reset,他是干什么的,怎么用的,各个参数有什么区别
经过刚才的操作我们已经知道reset指令是有能让时光倒流魔法的~这个就很有用了哦,我们后边写错代码、提交错代码、还有刚才的提交错message的时候都可以用。
刚才我们使用的指令是这样的:git reset --soft HEAD~
,这个–soft是什么意思呢?reset本来就是重置的意思,那重置到哪里,重置多少就是后面的–soft规定的啦~它后面其实还可以加别的参数,具体如下:
git resset --soft
git reset --mixed
gtt reset --hard
是的没错,有三个参数,一个一个来看。
回想我们使用git时写代码的流程:在更新好的分支上写代码、写完了add到暂存区、然后commit到本地仓库、然后push到远程仓库;大致流程就是这样的;
而我们的–soft就是回退到我们add之后,commit之前;
–mixed就是回退到add之前;这个是默认的参数哦~也就是不加的话默认是这个范围哦;
–hard就是回退到最开始的时候,也就是写代码之前;注意啦,这个会把你写的代码也搞没哦。
实验:我新建文件b.txt;然后add到暂存区,然后往里面写一句话,然后commit;
查看日志和状态:可以看到两次之前的提交;状态是clean的
新建文件b.txt,查看其状态是untracked;我执行git add .
对文件进行跟踪:
可以看到绿色的文件名,跟踪状态,我现在对其进行编辑,写入一行字”你好 我是帅哥 a“,查看状态,再次add到暂存区,可以看到b.txt还是绿色的,然后我直接提交,再查看log:
现在使用–soft参数,我们看一下会变成什么样子:执行指令:git reset --soft HEAD~
,然后查看日志和状态:
可以看到确实变成了绿色的,而且我的提交日志也没了,即:–soft回退到add之后,commit之前了;
现在我继续进行提交,然后查看日志和状态:
可以看到日志又加上了,也就是我提交了,状态时clean的;
我现在使用–mixed参数回退,执行指令:git reset --mixed HEAD~
,还记得吧~mixed是默认的哦,不加也是可以的;然后查看日志和状态:
看到了吧~变成红色的untracked状态了哦,而且提交的日志记录也没有了哦,这个就是没有add的状态吧,是不是回退到了add之前;
然后我现在再add、commit:
现在我使用–hard参数:执行指令:git reset --hard HEAD~
,可以看到提示如下:
再查看日志和状态:
我们可以看到确实日志已经没了,状态也变成clean了,这是什么意思呢,我们再来看文件目录:
可以看到新建的文件b.txt已经被回退了,回退到最初的状态了,就是b.txt还没创建的那时候了~
好了~通过以上实验我们清楚的了解到了reset的各个参数的含义了,接着看实际场景
这种情况直接使用git reset --soft HEAD
回退提交即可,然后将不需要的代码可以进行stash暂存(不清楚的可以翻一下我关于stash的文章哦),然后保存到新分支永久的保存起来,直到哪天再需要的时候cherry pick到我们的目标分支即可。我按照这个思路实现一下,喜欢的宝子可以跟着操作起来:
新建文件c.txt,并且写入内容“我是美女女”;
然后add、commit;这时leader过来说目前不需要这个功能了,以后再说;
我直接reset回退到commit之前;
然后stash暂存起来;
新切一个临时分支,将我们的临时保存的代码取出来,保存在这个分支上;注意我用的是git stash pop 0
哦,pop和apply的区别哦~pop就是直接取出来保存的stash就没了哦,直接拿走了,而apply只是应用,我们stash的内容还是在的哦。
突然老板说这个功能又需要做了,说小户你辛苦一下加加班连夜赶出来上线,给你加班费,你表示很为难的答应了下来,然后大家都下班了,留下来加班赶老板需求的你从容的点了个外卖,和女朋友打了两个小时的电话,饭也吃完了,要干活了,只见你从容的找到之前保存的分支,然后merge到了开发分支,然后跟老板说做好了,已经提交了发了MR了,让老板看一下,芜湖 下班,优雅~
实现这个操作有两种方法,还记得前面的reset吧~记得他的--soft
参数吧!等会我们会拿这个实现合并多次commit的,还有就是rebase了,rebase也可以实现。
方法一:reset是可以回退版本的,而加上–soft参数就是回退到add之后,commit之前;那我们将多次commit全部回退到add之后,然后重新commit可不就是合并起来了嘛~来实现一下:
新建文件d.txt,进行add、commit完成第一次commit;
修改文件d.txt,进行add、commit完成第二次commit;
修改文件d.txt,进行add、commit完成第三次commit;
修改文件d.txt,进行add、commit完成第四次commit;
然后把第二、第三、第四次commit合并成一个commit,也就是如图提交id是我圈起来的那三次合并成一次commit:
执行指令:git reset --soft HEAD~~~
可以看到我们已经成功将三次提交放到暂存区了,也就是add之后,我们现在只需要再次commit就是合并在一起提交了。
指令中的“HEAD~~~”是指当前头指针向前移动三个,除了三个~还可以用三个“HEAD~3
”都是一样的。
方法2:使用rebase实现;
我继续在文件d.txt上编辑,add、commit完成第一次提交;
我继续在文件d.txt上编辑,add、commit完成第二次提交;
我继续在文件d.txt上编辑,add、commit完成第三次提交;
然后我将edit1、edit2、edit3通过rebase进行合并,执行指令:git rebase -i HEAD~3
这时会打开rebase的窗口,将我们指定的三次提交选中,展示出来,如图:
比如我要将edit2、edit3合并到edit1上变成一个,只需要将前面的pick修改成squash或者s(注意还是跟Linux的vim是一样的操作哦,先进入insert模式),如图:
然后保存退出,这时会弹出message编辑框,会问我们三次提交合并起来之后message怎么写,我将这些删掉,变成一句话,然后保存退出:
可以看到我们已经rebase成功了,查看日志,合并成功:
这rebase是何方神圣,为什么也可以合并多个commit,来来来,看一看:
感觉从哪开始说都不好,思考良久,我们从刚才合并的时候使用的合并commit指令说起吧,git rebase -i HEAD~3
,这里的-i就是打开一个交互式的编辑器,我们可以交互式的进行rebase操作,界面大致像这样:
其中各指令意思如下:
具体怎么使用,看接下来的场景:
这种情况很简单,在你的当前分支进行变基,将他提交了的master变基到你的分支上;执行指令:git rebase master
完成变基之后再提交没有冲突的话一切ok。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。