确定需要回退的版本唯一 id
查看提交历史: git log
git log # 按时间先后列出所有 更新
git log -p -2 # -p 列出每次的内容差异 -2 列出前两条 更新
git log stat #仅显示简要的增改行数统计
git log --pretty=oneline #将每个提交放在一行显示
git log --pretty=format:"%h - %an, %ar : %s" #格式化输出内容
或者 查看 HEAD 指针变化:git reflog
git reflog #按时间先后列出 所有 头指针变化的 记录
git reset 回退
通过以上命令 都可以获取到 某个操作 的 SHA-1 或者是 Head 的相对位置,然后通过 SHA-1 或者 Head 位置 就可以 回退
git reset --hard SHA-1 | HEAD@{num}
git reset --hard HEAD@{4} #恢复相对于当前位置 向前的第四次操作
git reset 命令大全:
git reset [<mode>] [<commit>] # 按照某个模式回退
git reset #
git reset --soft head_id #
git reset --hard head_id # 还原 在 head_id 之后的所有操作
git reset --merge head_id
记一次版本回退过程:
首先已有分支及作用:
master : 主分支,基本上只有 python 相关的代码还在更新,前端 和 后台 已经 弃置;
local:发布于本地环境的项目分支,源于 master,业务需求;
sso:发布于大平台上的 项目分支,源于 master,业务需要;
common: 由于 local 和 sso 均源于 master,享有公共的代码,这个分支即保留了 local 和 sso创建分支时的起点,用于 公共业务的修改,最后 分别 merge 到 local 和 sso;
分支介绍清楚之后,介绍一下事情经过:
还是像往常一样,需要修改项目中的bug,bug 是 local 和 sso 共有 的 bug, 所有 在 common 上进行修复,修复完成之后,分别 merge 到 local 和 sso. 但是最近可能比较闲,因为 看 master 上 的 python 代码更新超前,想着 ,要不要 分别更新到 sso 和 local ,所以就出事了。
分别在不同分支上执行了以下命令:
common 分支上:
git rebase master
master 分支上:
git merge common
然后就是 local 和 sso 分支上分别执行了:
git merge common
执行完就出事了,local 和 sso 的 代码都变成了 local 的代码。不好赶紧恢复:
于是:
先local 分支上恢复:
git reflog
通过以上命令 查找出 rebase 操作 之前 在 local 分支上的指针
256d7a5b HEAD@{77}: rebase: <E4><BF><AE><E6><94><B9><E4><B8><80><E6><9C><9F><E6><8A><A5><E8><A1><A8><E9><97><AE><E9><A2><98>
c61bff92 HEAD@{78}: rebase: <E4><BF><AE><E6><94><B9><E4><B8><80><E6><9C><9F>pc<E7><AB><AF>
7d9a95e8 HEAD@{79}: rebase: <E8><A7><A3><E5><86><B3><E6><BD><8D><E5><9D><8A>pps<E4><B8><80><E6><9C><9F><E5><89><A9><E4><BD><99><E5><90><8E><E7><BB><AD><E9><97><AE><E9><A2><98>
37b8bed6 HEAD@{80}: rebase: <E4><BF><AE><E6><94><B9><E4><B8><80><E6><9C><9F><E6><89><8B><E6><9C><BA><E7><AB><AF>
df03c298 HEAD@{81}: rebase: <E4><B8><80><E6><9C><9F><E5><90><8E><E7><BB><AD><E4><BF><AE><E6><94><B9>
d6766c4e HEAD@{82}: rebase: checkout master
4b265ff0 (origin/common, common) HEAD@{83}: checkout: moving from master to common
d6766c4e HEAD@{84}: pull origin master: Fast-forward
e134e5c1 HEAD@{85}: checkout: moving from sso to master
e0d3196d HEAD@{86}: merge common-code: Merge made by the 'recursive' strategy.
f1aaf3bb HEAD@{87}: checkout: moving from localto sso
4d181907 (HEAD -> local, origin/local) HEAD@{88}: merge common: Merge made by the 'recursive' strategy.
22229442 HEAD@{89}: checkout: moving from commonto local
即图中的 4d181907 头指针 :
git reset --hard 4d181907
指针重新指向 该指针,代码恢复。
然后在 sso 和 common master 的 分支上同理 均执行以上操作 即可实现 代码的 回退。