この記事でやること
✅ エラー内容(Your local changes would be overwritten by merge)
✅ 改善要点(本番で直接編集しない/pull-only 運用)
✅ 改善手順解説(今すぐの復旧/退避してpull/全部捨てる/恒久対策:環境変数で切替)
環境
▪️ サーバ: Xserver(一般的な共有ホスティングでも可)
▪️ PHP: 8.2
▪️ フレームワーク: Laravel 9
▪️ 本番配置: リポ直下に src/(Laravel 本体)
▪️ スケジューラ実行: cron → php artisan schedule:run(毎分)
✅ エラー内容
本番で app/Console/Kernel.php を“テストのために everyMinute に直接変更”した後、 git pull したら止まる。
$ git pull origin main
From github.com:xxxx/your-repo
* branch main -> FETCH_HEAD
Updating 1b88bf0..c133db0
error: Your local changes to the following files would be overwritten by merge:
src/app/Console/Kernel.php
Please, commit your changes or stash them before you can merge.
Aborting
理由: 本番ワークツリーに“未コミットの変更”があると、git pull は安全のため止まる。
✅ 改善要点(結論)
⭕️ 本番でコードを直接編集しない
→ テスト用の差分は 捨てる or 退避 して pull-only に戻す。
⭕️ 以後のテスト切替は .env の環境変数で行う
→ コードをいじらずに スケジュール(everyMinute / 毎日 03:00 など) を切替できる。
✅ 改善手順解説
すぐ復旧:ローカル差分を捨てて pull
テスト用に触った Kernel.php の ローカル差分は捨てて リモートを取り込む。
# そのファイルの差分だけ捨てる(Git 2.23+)
git restore src/app/Console/Kernel.php
# 古いGitなら
# git checkout -- src/app/Console/Kernel.php
git pull --rebase origin main
他にも複数ファイルを触ってしまって全部捨てたい場合はこれ(⚠️未コミット差分が全消去):
# (※未コミット差分は全消去)
git fetch origin && git reset --hard origin/main
git pull --rebase origin main
今後楽な方法
恒久対策:環境変数でスケジュール切替(本番でコードを触らない)
Kernel を分岐させ、.env のフラグで “毎分テスト” と “本番スケジュール” を切替できるようにします。
protected function schedule(Schedule $schedule): void
{
if(env('SCHEDULE_DEBUG', false)) {
// 検証/ローカル向け(毎分)
$schedule->command('tasks:delete-old-completed')->everyMinute();
$schedule->command('send:daily-slack')->everyMinute();
} else {
// 本番向け(定刻)
$schedule->command('tasks:delete-old-completed')->dailyAt('03:00');
$schedule->command('send:daily-slack')->dailyAt('04:00');
}
}
本番.env
SCHEDULE_DEBUG=false
ローカル/検証 .env
SCHEDULE_DEBUG=true
動作確認
# 次回実行予定
php artisan schedule:list
# その場で実行対象があれば走る
php artisan schedule:run -v