同事不小心在 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 log

查询提交日志

git reflog

使用 hard 模式切换到 A 提交

git reset --hard 17baa47b

使用 mix 模式切换到 D 提交(即远程分支的 HEAD)

git reset --mix 17baa47b

git强制覆盖本地命令(单条执行):

git fetch --all &&  git reset --hard origin/master && git pull

git fetch --all                拉取所有更新
git reset --hard origin/master  本地代码同步线上最新版本(会覆盖本地所有与远程仓库上同名的文件
git pull

三.版本回退

1.当已经提交修改,但是想回到修改前的样子时,可使用版本回退

$ git reset --hard HEAD^ (查找版本号)

撤销提交

使用命令:git reset --soft HEAD^  这样就成功撤销了commit。

使用 git reset --hard HEAD^  这样连add也撤销了。
文档更新时间: 2023-05-08 00:16   作者:admin