☆ git reset

场景1:本地开发环境,已提交N个commit、但尚未push。希望:①丢弃本地所有的更改,代码强制回退到某个历史版本。

解决办法:git reset --hard HEAD~回退到前N个版本,N=0,1,2....

例如:

git reset --hard HEAD~0,版本不回退,丢弃所有更改。

git reset --hard HEAD~1,以当前commit为基准,回退到前1次commit版本。

git reset --hard HEAD~2,以当前commit为基准,回退到前2次commit版本。

git reset --hard hardbba,回退到commit为hardbba的版本。

 

场景2:本地开发环境,已提交N个commit、但尚未push。希望:①保留本地所有的更改,撤销最近的若干次提交历史(目的是让git log干净一些)。

解决办法:git reset --mixed HEAD~回退到前N个版本,N=0,1,2....

git reset --mixed HEAD~1,HEAD指向前1次commit,丢弃最近1次提交历史。比如:C2<--C1<--C0,C0是最近1次提交(前0次),C1是最近2次提交(前1次),C2是最近3次提交(前2次).HEAD~1 指向C1

git reset --mixed hardbba,HEAD指向hardbba(sha-1),丢弃以后的提交历史。

 

场景3:本地开发环境,已提交N个commit、且都已push,希望:①保留本地所有更改,②base到历史指定版本(commit)。目的是让git log干净整洁,删除无关push。

解决办法:

①git log,查看提交历史,找到目标版本的commit id。

②git reset --mixed 【commit id】,即①的commit id。

③git push origin 【分支名】 -f ,将reset重置后的commit id强推到远端。

 

========================================================

 注:对--hard,soft,mixed的说明,

--hard,丢弃工作区的所有更改,回退到和历史版本一模一样的状态。

--mixed,保留工作区的所有更改,HEAD指向回退的版本。

--soft表示重置HEAD到另外一个commit,但也到此为止。如果你指定--soft参数,Git将停止在那里而什么也不会根本变化。这意味着index,working copy都不会做任何变化,所有的在original HEAD和你重置到的那个commit之间的所有变更集都放在stage(index)区域中。

这里有一篇文章讲解的很透彻,供参考:https://www.cnblogs.com/kidsitcn/p/4513297.html

可见,git reset --mixed命令可以起到净化分支提交历史的作用,reset以后,哪些不需要计入历史的改动不会push到remote远端。

其它场景举例:

git reset --hard HEAD~1,回退所有内容到上一个版本 
git reset --hard HEAD~1 MyClazz.java,回退MyClazz.java这个文件的版本到上一个版本 
git reset --soft HEAD~3,所有文件向前回退到第3个版本,保留当前代码更改
git reset --hard origin/master,将本地的状态回退到和远程的一样
git reset 057d,回退到某个版本

 

git revert HEAD,回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit

 

posted on 2020-04-28 14:43  卡米i  阅读(549)  评论(0)    收藏  举报