如何检查本地未提交变更是否已存在于远程分支?
解决方案:精准检查本地独有变更的Git原生方法
针对你的场景,我们需要修改预部署检查,只在服务器本地存在origin/master没有的变更时中止部署,否则允许执行reset --hard(因为此时重置不会丢失已同步到GitHub的内容)。以下是基于Git原生命令的高效实现:
核心检查逻辑
我们需要同时验证两个关键点:
- 服务器本地分支没有超前于origin/master的未推送提交(这些提交的内容不在GitHub上)
- 工作区和暂存区的修改,全部已经存在于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.
相关产品推荐
相关产品推荐

