同事不小心在 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 分支。
然后文章来源:https://www.toymoban.com/news/detail-500904.html
# 查询提交日志
git reflog
# 使用 hard 模式切换到 A 提交
git reset --hard 7572d
# 使用 mix 模式切换到 D 提交(即远程分支的 HEAD)
git reset --mix d82ee
同理,工作目录是 A 提交的内容,然后将改动 push 到远程,此时 dev 的远程仓库的代码就是 A 提交的代码了。但这时候 dev 合并到 uat 的时候就不会提示说没有改动了。文章来源地址https://www.toymoban.com/news/detail-500904.html
到了这里,关于Git 使用场景--恢复被覆盖的代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!