You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查本地未提交变更是否已存在于远程分支?

解决方案:精准检查本地独有变更的Git原生方法

针对你的场景,我们需要修改预部署检查,只在服务器本地存在origin/master没有的变更时中止部署,否则允许执行reset --hard(因为此时重置不会丢失已同步到GitHub的内容)。以下是基于Git原生命令的高效实现:

核心检查逻辑

我们需要同时验证两个关键点:

  1. 服务器本地分支没有超前于origin/master的未推送提交(这些提交的内容不在GitHub上)
  2. 工作区和暂存区的修改,全部已经存在于origin/master中

具体脚本实现

替换你现有预检查的代码为以下内容:

# 先拉取origin的最新代码,确保本地有最新的origin/master快照
git fetch origin

# 检查1:本地HEAD是否是origin/master的祖先(即本地没有origin/master没有的提交)
if ! git merge-base --is-ancestor HEAD origin/master; then
    echo "错误:服务器存在未同步到GitHub的本地提交,请先推送或合并后再部署。"
    exit 1
fi

# 检查2:工作区和暂存区与origin/master是否完全一致(无本地独有修改)
if ! (git diff --exit-code origin/master && git diff --cached --exit-code origin/master); then
    echo "错误:服务器存在未同步到GitHub的本地修改,请先提交推送或放弃后再部署。"
    exit 1
fi

# 所有检查通过,执行部署逻辑
git reset --hard origin/master
# 这里替换成你实际的重启服务命令
systemctl restart your-service-name

命令说明

  • git merge-base --is-ancestor HEAD origin/master:Git内置命令,直接判断本地当前提交是否是origin/master的祖先。如果返回0,说明本地没有超前的未推送提交;返回非0则说明本地有origin/master没有的提交。
  • git diff --exit-code origin/master:检查工作区文件与origin/master的差异,无差异返回0,有差异返回非0。
  • git diff --cached --exit-code origin/master:检查暂存区文件与origin/master的差异,逻辑同上。

为什么这能解决你的问题?

当开发者在服务器修复bug并同步到GitHub后,origin/master会包含该修复内容:

  • 如果服务器本地还保留着修改后的文件,git diff origin/master会返回0(因为内容和远程一致),检查通过,允许执行重置
  • 如果开发者在服务器本地提交了该修复,但这个提交已经同步到GitHub,git merge-base --is-ancestor会返回0(因为本地提交是origin/master的祖先),检查通过

只有当本地存在真正未同步的修改或提交时,检查才会触发中止,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Dan S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:00:22