go2Demo/git-force-push.bat

80 lines
2.7 KiB
Batchfile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
echo ============================================================
echo 脚本: git-force-push.bat
echo 功能: 将本地分支强制推送到远程,让远程与本地完全一致
echo ============================================================
REM ---------- 检查是否在 Git 仓库 ----------
git rev-parse --is-inside-work-tree >nul 2>&1
if errorlevel 1 (
echo [错误] 当前目录不是 Git 仓库
exit /b 1
)
REM ---------- 获取当前分支 ----------
for /f %%i in ('git branch --show-current') do set CURRENT_BRANCH=%%i
if "%CURRENT_BRANCH%"=="" (
echo [错误] 当前处于 HEAD 分离状态,请先切换到具体分支。
exit /b 1
)
echo [信息] 当前分支:%CURRENT_BRANCH%
REM ---------- 拉取远程最新信息 ----------
echo [信息] 正在获取远程最新引用...
git fetch origin
REM ---------- 检查本地是否有未提交更改 ----------
git diff --quiet >nul 2>&1
if errorlevel 1 (
echo [警告] 检测到本地有未提交的更改(已暂存或未暂存)。
echo [警告] 这些更改不会被推送,但会保留在工作区。
set /p CONTINUE="是否继续强制推送?(y/N): "
if /i not "!CONTINUE!"=="y" (
echo [信息] 操作已取消。
exit /b 0
)
)
REM ---------- 检查本地是否落后于远程 ----------
for /f %%i in ('git rev-list --count @..@{u} 2^>nul') do set AHEAD=%%i
if not defined AHEAD set AHEAD=0
if %AHEAD% gtr 0 (
echo [警告] 远程有 %AHEAD% 个新提交,本地落后于远程。
echo [警告] 强制推送会覆盖这些提交,请确认这不是他人刚提交的代码!
)
REM ---------- 选择推送模式 ----------
echo 请选择推送模式:
echo 1) --force-with-lease (推荐,安全覆盖)
echo 2) --force (强制覆盖,极度危险)
set /p MODE="请输入数字 (1 或 2默认 1): "
if "%MODE%"=="" set MODE=1
if "%MODE%"=="2" (
set FORCE_FLAG=--force
echo [警告] 您选择了 --force这将无条件覆盖远程分支
) else (
set FORCE_FLAG=--force-with-lease
echo [信息] 您选择了 --force-with-lease安全模式。
)
REM ---------- 最终确认 ----------
set /p CONFIRM="确认将本地分支 %CURRENT_BRANCH% 强制推送到远程?请输入 'yes' 继续: "
if /i not "%CONFIRM%"=="yes" (
echo [信息] 操作已取消。
exit /b 0
)
REM ---------- 执行推送 ----------
echo [信息] 正在执行: git push %FORCE_FLAG% origin %CURRENT_BRANCH%
git push %FORCE_FLAG% origin %CURRENT_BRANCH%
if errorlevel 1 (
echo [错误] 推送失败,请检查网络或权限。
exit /b %errorlevel%
)
echo [成功] 推送完成!远程 origin/%CURRENT_BRANCH% 已与本地保持一致。
endlocal