☆ 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
浙公网安备 33010602011771号