前话:在vscode中,安装git History插件,安装之后就可以用F1,选择Git:View History(git log),即可看到git的提交记录。
在每一行的最后面,就是commit_id
git reset
如果回退一个只是commit的,并没有push到远端分支的提交:
则直接执行
git reset --hard commit_id
//回退到commit_id的这次提交
//或者
git reset --hard HEAD^
//回退到上一次提交
//HEAD 等同于当前分支的最新的一次commit提交id
//HEAD^ 是上一次提交
注:
如果执行git reset --hard HEAD^ 显示More?
这是因为在windows的cmd控制台中换行默认符是^,所以More?的意思是问你下一行是否需要再输入,^符号就被当做换行符了。
解决方法:
//加引号
git reset --hard "HEAD^"
//加^
git reset --hard HEAD^^
//换成~
git reset --hard HEAD~
git reset --hard HEAD~1
//~后面的数字表示回退几次提交,默认是一次
另外:
git reset 还有以下用法:
git reset --soft
git reset --mixed
区别就是:
使用--soft就仅仅将头指针恢复,已经add的缓存以及工作空间的所有东西都不变。也就是执行了git reset --soft 就相当于只回退了git commit -m 这一步,改动的文件已经在暂存区了。
使用--mixed,就将头指针恢复,已经add的缓存也会丢失掉,工作空间的代码什么的是不变的。也就是执行了git reset --mixed 就相当于回退到了git add之前,改动的文件还在工作区,没有add到暂存区。
使用--hard,一切就全都恢复了,头指针恢复,add的缓存消失,工作空间的代码什么的也恢复到以前状态。也就是相当于你啥都没干过,工作区也没有了
另外,如果已经push到远端了,怎么回退?
依旧是先在本地回退,然后推到远端。
但是如果直接push的话,会push失败,因为本地的版本落后于远端的版本。
那就只有强退,加个--force参数
git push origin <branch> --force
git revert
回退版本还可以用git revert
如果回退的是一个只commit还没有push到远端的操作:
git revert commit_id 操作不会删除commit_id这次提交记录,并且还会新增一个新的revert的提交记录。
举个例子:
如果你依次有commit_id为a、b、c三次提交记录,并且a和b都已经提交到远端,c还没有push到远端,现在想撤销c的改动,
则执行git revert c,然后会生成一条d的commit_id,记录你revert了c。
然后你执行git status,会告诉你你有2次commit没有push。
然后你执行push到远端,就会记录下来你的c、d两次提交。
如果你revert的是已经push到远端的提交,会在工作区报冲突,需要你手动撤销你revert分支之后的改动,然后再次add,commit,push就可以了。
举个例子:
如果你依次有commit_id为a、b、c三次提交记录,并且都已经提交到远端,现在想撤销b之后的改动,
则执行git revert b,然后工作区会报冲突,报的是a之后的改动和当前的改动有冲突,可以选择采用传入的更改,然后接着add,commit,push就可以了。
网友评论