文章目录
- 1. 前言
- 2. git stash清空场景
- 2. git stash clear后如何还原
- 3.Git撤销已经推送(push)至远端仓库的信息
1. 前言
本文总结的知识很实用哈,虽然是git工具的不常用操作,但是绝对不是冷知识,学会可以从会用git升级到git高手。
主要是两种场景的解决方案:git stash记录清空后如何还原? git commit代码后如何还原?
2. git stash清空场景
我经常用git stash这个命令,因为我负责项目的打包升级工作,有时候需要升级项目版本,但是本地做了一些修改又不想升级到远端(改动不多也没必要拉个新分支),这个时候git stash暂存本地的修改真是太香了,等打完包再通过git unstash将暂存的代码恢复到本地就可以了,无需重启。
那么问题来了,我不是直接通过命令行操作的,在idea编辑器上有个客户端可以操作,每次stash都会让起个别名留下一行stash记录方便后期恢复代码,慢慢的我这里记录太多了,轻微强迫症的我看不得太多冗余数据,某次unstash的时候不小心带你了个清空,当时手太快了,清空了发现上午写的代码都stash了还没恢复呢,一声叹息啊!
2. git stash clear后如何还原
- 首先,在控制台输入
git fsck --lost-found
- 然后根据上述命令看到的记录:dangling commit xxxidxxx,输入以下命令,查看该id的具体内容
git show xxxxidxxxx
这里就是之前删除的git stash暂存的信息,包含暂存的日期、别名(我的是0309)和暂存的文件列表信息,如果不是我们想要的,就只能挨个看看所有的dangling commit记录了,这里我还没找到捷径。
当找到你想要恢复的提交数据后,将id复制,输入如下命令进行恢复
git merge xxxxidxxxx
执行完后,之前的代码就恢复了。我本来以为这里的还原相当于git unstash把代码恢复到本地了,想错了。
恢复之后效果是相当于已经commit了,但是还没push到远程仓库,但是有些本地的修改是我改着玩的,不能推送,所以还得把这个commit恢复回来。
3.Git撤销已经推送(push)至远端仓库的信息
这个场景也很常见,偶尔误提交了代码怎么办呢?需要进行三步操作:
首先,通过git log查看提交信息
,以便获取需要回退至的版本号(适用于错误代码已经push到远端的场景):
这里需要回退至的版本号是:4d70e000d79cb556528f99908d63e03796bd2c46。然后,通过git reset --soft <版本号>重置至指定版本的提交
,达到撤销提交的目的:
$ git reset --soft 4d70e000d79cb556528f99908d63e03796bd2c46
参数soft指的是:保留当前工作区,以便重新提交 //如果上次提交的不全,要在上次基础上添加东西用soft
还可以选择参数hard,会撤销相应工作区的修改,一定要谨慎使用//如果上次提交的东西不要了可以选这个
这一步撤销了commit消息(还没push到远端仓库)
2. 撤销
对于已经push到远端仓库的情况,需要通过git push origin master –force强制提交当前版本号,以达到撤销版本号的目的,必须添加参数force进行强制提交,否则会提交失败,因为此时本地项目版本号低于远端仓库版本号:
$ git push origin master
To github.com:hanchao5272/myreflect.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:hanchao5272/myreflect.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
3.回退成功了,本地可以修改代码,重新提交和推送啦