git删除commit方法和误删commit后的恢复方法
一、如果你在git上提交了错误的commit,不要慌,通过下面的方法可以回退到之前的commit
如果只误提交了一个commit, 直接执行
git reset --hard HEAD^
这一条命令就OK了(但是这条命令会把最近一次commit的代码删除哦,如果要保留代码,请看本文最后面部分)
如果你要回滚多个 commit 可以使用下面的方法:
第一步:通过git log可以查看我们之前提交的commit_id:
第二步:复制你需要回滚的commit_id。不过windows下的命令行是不能复制文本的,为此你可以到github上查看仓库的commit历史,上面是可以直接复制的:
复制好后在命令行执行:git reset --hard <commit_id>
git reset --hard 4458e09
第三步:执行: git push origin HEAD --force 提交当前HEAD
这样就能够将错误的提交删除,回滚至其之前的代码
但是如果当你回滚代码以后发现commit_id复制错了或者回滚错了怎么办呢?不要慌!!!按下面的方法做:
第一步:执行 git reflog
你能在命令行中看到你的历史操作,复制你要恢复操作最前面的hash值
第二步:执行 git reset --hard <hash>
命令中最后要输的hash就是你要恢复的历史记录最前面黄色部分的hash值
比如:
git reset --hard 4458e09
这样就成功解决问题了。
但是上面的操作仍然有缺陷,我们经常遇到的情况是:在错误的分支写了大量代码,并且已经push到远程仓库,这个时候我们要的不仅是回退commit,并且要保留自己新写的代码并且合并到正确的分支上。
接下来不要眨眼,我们来演示如何解决问题:
第一步:找到你提交之前的最新commit id,执行如下命令:
git reset --soft 4458e09
这条命令会把你本地的当前分支回退到之前的commit,并且保留你在这条commit 之后写的代码。
第二步:执行git stash 将新写的代码放到缓存中
git stash
第三步:把当前分支强行覆盖远程分支
git push --force
第四步:切换到正确的开发分支,这里假设是dev分支
git checkout dev
第五步:把缓存的代码从内存中 pop 出来
git stash pop
执行完这五步,当前分支的错误提交就清理了,并且你的代码也回到了正确的dev分支。
但是,需要注意,这样的操作必须保证在你的错误提交之后别人没有提交代码,否则这样操作将会把别人正常提交的代码回退掉。
二、再补一下git reset 的相关参数:
--mixed
意思是不删除工作空间改动代码,撤销commit ,并且撤销git add . 操作
这个是reset命令的默认参数,即git reset —mixed HEAD^ 和 git reset HEAD^ 效果是一样的
--soft
不删除工作空间改动代码,撤销commit, 撤销git add .
--hard
删除工作空间代码,撤销commit,撤销git add .
注意,添加该参数后执行后,你最新提交的代码会从内存中删除
当然如果误删了可以通过上面的方法找回来。
三、最后再补充一些常用的git 命令
1、git checkout <分支名>
切换到目标分支,比如切换到 test 分支:git checkout test
同时可以用git checkout . 直接回到当前分支的最新commit代码,同时放弃未提交更改,但是这条命令在合并分支的时候请慎用。
2、git checkout -b <分支名>
从当前分支创建并切换到一个新的分支,比如创建并切换到test分支:
git checkout -b test
3、git push --up-stream origin <分支名>
把一个远程没有的分支推送到远程仓库,比如新创建的test分支
git push --up-stream origin test
4、git branch -D <分支名>
删除本地分支,例如删除本地test分支
git branch -D test
5、git push origin --delete <分支名>
删除远程分支,仍然以删除远程test分支为例
git push origin --delete test