git 撤销命令 包括对add、commit、push、pull的撤销
git分为工作区(代码直接修改)、暂存区(add)、本地仓库(commit)、远程仓库(push)
reset分为 soft、mixed、hard三种
其中mixed为默认,即 git reset 就表示为git reset -mixed
一、撤销add操作
git reset HEAD <file> 如果不加指定file名 则默认撤销所有add的文件
暂时在网上只查看到这一种命令 默认为mixed 文件重新从暂缓区回到工作区
二、撤销commit操作
git reset -soft HEAD^ 注:HEAD^ 表示HEAD^1 即上一个版本,HEAD^2表示上上个版本,一次类推
从本地仓库撤回,代码保存至缓存区,
git reset -HEAD^ 从本地仓库撤回,代码保存至工作区
git reset -hard HEAD^ 从本地仓库撤回,并不在工作区和暂缓区保留
三、撤回pull操作
git reset --hard HEAD^1 或者 跟#SHA值 或者 HEAD@{n}
四、撤回push操作
git log 或者git reflog
git reset --soft #SHA 或者HEAD@{n} 更改的代码还是保留在了缓存区
现在回退了,但是还得提交回退,如果用 git push origin step5/test 会提示本地的版本落后于远端的版本
因为已经提交推送了最新的一般代码,本地仓库肯定与远程仓库肯定有差别,
需要force git push origin master --force
这样就回退成功了,但是有人会发现,另一个同样的工程pull拉取最新代码的时候,不能拉取最新代码。这是因为有问题的工程的版本和未回退前的版本是一样的,现在回退了也就是版本降低了,pull是不可能从高版本降到低版本的。如果是这样,可以用 git branch -D step5/test 来删除本地分支,或是删除文件夹,重新下载。
当然要解决这个问题,还可以用 git revert的作用通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针是指向这个新生成的版本,而不是目标版本,这样可以保留要回退的版本,如果有其它人 pull 工程就不会取不到最新代码了。
关键是有时候分支受到保护禁止force push
revert和reset的区别在于
reset是向后退,当后退多个版本时,中间的几个版本也会被舍弃,revert是向前进,但会对之前需要舍弃的版本重做,但仍保留舍弃版本后的版本(因为在你向远程push之后,还会有其他人push)
git revert --no-commit f7742cd..551c408
git commit -a -m 'This reverts commit 7e345c9 and 551c408'
使用 git revert <commit> 可以撤销指定的提交, 要撤销一串提交可以用 <commit1>..<commit2> 语法。 注意这是一个前开后闭区间,即不包括 commit1,但包括 commit2。 注意 revert 命令会对每个撤销的 commit 进行一次提交,--no-commit 是为了之后一起手动提交。
参考:https://www.jianshu.com/p/5e7ee87241e4