> 文章列表 > Git 使用场景--恢复被覆盖的代码

Git 使用场景--恢复被覆盖的代码

Git 使用场景--恢复被覆盖的代码

同事不小心在 uat 分支把我的代码覆盖了,我试着把我的 dev 分支重新合并到 uat,但是提示没有更改。

同事给我的方案是在我的 dev 分支删除我的代码,合并到 uat,然后在 dev 重新提交我的代码,合并到 uat。

总所周知,git 回退 commit 有两种方法,一种是 git revert,一种是 git reset

git revert 只能回退单个提交,而且适合回退最新的提交,因为回退 HEAD 移动大于 1 的提交大概率会导致冲突,而我合并到 uat 分支有三个提交,所以只能选择 git reset

然而我在网络搜索到的使用 git reset 回退代码并推送到远程的操作方法都是:

# 回退到指定 commit
$ git reset --hard commitId
# 推动到远程
$ git push --force

但是我在执行 git push --force 的时候报错了,公司的 git 设置了不能推送 non-fast-forward 的提交。

在搜索了很多 git 的相关文档后,还是可以使用 git reset 来实现该需求,只是会比上面的方法步骤要多。

比如此时你 dev 分支的 git 日志如下:

A	7572d
B	29d83
C	e422a
D	d82ee

你要将 dev 分支的代码回退到提交 D 然后合并到 uat。你可以

# 使用 hard 模式切换到 D 提交
git reset --hard d82ee
# 使用 mix 模式切换到 A 提交(即远程分支的 HEAD)
git reset --mix 7572d

此时你 git 中的 HEAD 和 INDEX 都是 A 提交的内容,但是工作目录是 D 提交的内容,所以会显示文件被改动,此时将改动提交到 INDEX,push 到远程仓库,则远程仓库的代码就和 D 分支一样了。

这时将 dev 分支合并到 uat 分支。

然后

# 查询提交日志
git reflog
# 使用 hard 模式切换到 A 提交
git reset --hard 7572d
# 使用 mix 模式切换到 D 提交(即远程分支的 HEAD)
git reset --mix d82ee

同理,工作目录是 A 提交的内容,然后将改动 push 到远程,此时 dev 的远程仓库的代码就是 A 提交的代码了。但这时候 dev 合并到 uat 的时候就不会提示说没有改动了。