git reset强制推送后GitHub Actions执行git pull未更新远程服务器代码
问题产生原因
git pull 命令的默认行为是执行快进合并,只会将本地分支的提交历史向更新的方向同步。你本地执行git reset --hard + git push -f后,GitHub远程仓库的master分支提交历史是回退状态,比业务服务器上本地的master分支历史更旧。这种场景下git pull无法完成快进合并,也不会主动回退本地分支,因此会输出Already up-to-date的提示,实际代码没有同步回退。你提供的日志中+ ffd263c...e5a9ec8 master -> origin/master (forced update)的信息,就是Git识别到远程分支被强制修改历史的提示,但默认的git pull逻辑不会处理这类历史倒退的变更。
解决方案
- 方案一:修改部署脚本适配强制回滚场景(推荐,兼容所有提交变更场景)
直接修改GitHub Actions配置中SSH执行的部署命令,把原来的git pull替换为以下命令序列:
cd /www/htdocs/w019db06 git fetch origin master git reset --hard origin/master
git fetch会先拉取远程仓库最新的分支状态,git reset --hard会直接将本地分支强制对齐到远程分支的最新状态,无论远程分支是提交更新还是历史回退都能正常同步。
注意:该操作会清空业务服务器上仓库目录内所有未提交的本地修改,如果有无需纳入Git管理的配置文件、用户上传资源等,需提前将对应路径加入
.gitignore,或单独做持久化处理。
- 方案二:调整回滚操作逻辑,避免修改远程提交历史
如果不想使用强制推送修改远程分支历史,可以改用git revert <错误提交哈希>的方式生成新的回滚提交,再推送至远程仓库。这种方式下远程分支的提交历史是向前演进的,原有git pull逻辑可以正常拉取到回滚后的代码。
内容的提问来源于stack exchange,提问作者Maik Lowrey
相关产品推荐
相关产品推荐

