Git的reset和rebase命令,最透彻、最详细、最简单的教程,学习完对reset和rebase清清楚楚明明白白

引言

我们提交代码的时候不小心提交错了怎么办?
提交的message不小心漏掉了字母?提交的代码好像忘改了一个拼错的单词?提交了好几次了有点乱,能不能合在一起?master分支更新了,更我切出的时候不一样怎么办???诸如此类等等情况,我们的reset和rebase闪亮登场~~人生不可以重来,但是commit可以。

场景1:提交的时候message写错了怎么办?

我提交的时候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指令详解

经过刚才的操作我们已经知道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的各个参数的含义了,接着看实际场景

场景2:有一天你写完了一个功能,刚commit上去,才要push呢,这时候老板过来说这个功能暂时不上线…

这种情况直接使用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了,让老板看一下,芜湖 下班,优雅~

场景3:我们发布了多次提交,都没有push,感觉有点乱有点繁琐了,想合并起来变成一次提交怎么办?

实现这个操作有两种方法,还记得前面的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,来来来,看一看:

rebase指令详解

感觉从哪开始说都不好,思考良久,我们从刚才合并的时候使用的合并commit指令说起吧,git rebase -i HEAD~3,这里的-i就是打开一个交互式的编辑器,我们可以交互式的进行rebase操作,界面大致像这样:
在这里插入图片描述
其中各指令意思如下:

  • List item
  • pick:保留该commit(缩写:p)
  • reword:保留该commit,但我需要修改该commit的注释(缩写:r)
  • edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
  • squash:将该commit和前一个commit合并(缩写:s)
  • fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
  • exec:执行shell命令(缩写:x)
  • drop:我要丢弃该commit(缩写:d)

具体怎么使用,看接下来的场景:

场景4:我们从master分支上拉了个分支正在在开发,开发完成之后要提交却发现已经有个小伙子给master上做了提交,这时我们的分支是从之前的master上切出来的,是没有他的提交的,现在我们合并时有了他的提交,这种情况怎么办

这种情况很简单,在你的当前分支进行变基,将他提交了的master变基到你的分支上;执行指令:git rebase master完成变基之后再提交没有冲突的话一切ok。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
git resetrebasegit版本控制中的两个重要命令,用于管理代码提交和修改历史。 git reset命令用于将当前分支的HEAD指针移动到指定的提交,同时可选择性地修改工作目录和暂存区的文件状态。它有三种常用的模式: 1. Soft Reset:使用`git reset --soft <commit>`可以将HEAD指针移动到指定提交,但不修改工作目录和暂存区的文件。这意味着之前的提交会被撤销,但相应的更改会保留在暂存区,可以重新提交。 2. Mixed Reset:使用`git reset --mixed <commit>`是默认的reset模式,它将HEAD指针移动到指定提交,并且重置暂存区,但不修改工作目录的文件。这意味着之前的提交和相应的更改都会被撤销,并且文件状态会回到最近一次提交的状态。 3. Hard Reset:使用`git reset --hard <commit>`会彻底重置当前分支的HEAD指针、暂存区和工作目录到指定提交。这意味着之前的提交和相应的更改都会被彻底删除,请谨慎使用。 git rebase命令用于在当前分支上应用另一个分支上的提交,并将其追加到当前分支的提交历史中。它可以实现分支合并的效果,但是与git merge命令不同,rebase会修改提交历史,使得分支合并后的提交看起来更加线性和整洁。 使用`git rebase <branch>`可以将当前分支的提交应用到指定的分支上,也可以使用交互式(rebase -i)的方式对提交进行修改、合并或删除。 需要注意的是,使用git resetrebase命令都会修改提交历史,所以在公共分支上使用时要谨慎,以免影响其他开发者的工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

户伟伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值