現場とコードの間 - 7ngenious
2025.02.11
🎉 デプロイ成功!でも...
夕方7時30分。Vercelデプロイが完了した。
✅ Deployment: Ready
✅ URL: https://habitflow-mvp.vercel.app
✅ Status: 200 OK
実際にアクセスしてみると完璧に動作する。習慣を追加して、チェックして、グラフも出る。
「あとはREADMEを更新して終わりだ!」
ClaudeがREADME.mdを作ってくれた。プロジェクト説明、スクリーンショットセクション、技術スタック、ロードマップまできれいに整理されていた。
git add README.md
git commit -m "📝 Docs: README更新(開発状況チェックリスト追加)"
git push origin main
そしてエラーが発生した。
❌ エラー:「Everything up-to-date」なのに上がらない?
~/habitflow-mvp main git push origin main
オブジェクトを列挙中: 14、完了。
オブジェクト数を数える中: 100% (14/14)、完了。
Delta compression using up to 8 threads
オブジェクトを圧縮中: 100% (12/12)、完了。
error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400
send-pack: unexpected disconnect while reading sideband packet
オブジェクトを書き込み中: 100% (12/12)、3.21 MiB | 5.02 MiB/s、完了。
Total 12 (delta 3)、reused 0 (delta 0)、pack-reused 0
fatal: the remote end hung up unexpectedly
Everything up-to-date
?????
-
オブジェクトを圧縮中: 100%→ 圧縮は成功 -
3.21 MiB→ データは転送試み -
error: RPC failed; HTTP 400→ エラー発生 -
Everything up-to-date→ でも完了?
最初の反応:「何?」
GitHubに行って確認した。READMEは依然として基本Viteテンプレートのままだった。
# React + Vite
This template provides a minimal setup to get React working in Vite...
Pushができなかったのだ。
🔍 原因を探す:5つの仮説
仮説 1:node_modulesがGitに含まれた
証拠:3.21 MiB転送試み(READMEだけ変わったのにおかしい)
# 確認
git ls-files | grep node_modules
# 結果:(何も出ない)
❌ これではなかった。
仮説 2:Vercelデプロイとタイミング衝突
考え:デプロイ中にpushして衝突?
# Vercelダッシュボード確認
https://vercel.com/dashboard
# 状態:Ready(デプロイ完了)
❌ これもではなかった。
仮説 3:Git Bufferサイズ不足
証拠:3.21 MiBを転送しようとして失敗
# Bufferサイズ確認
git config --get http.postBuffer
# 結果:(設定されていない = デフォルト値1MB)
🤔 可能性がある!
仮説 4:Credential(認証情報)問題
考え:途中でSSHに変えようとして失敗した記憶
# リモートURL確認
git remote -v
# 結果:
origin git@github.com:7ngenious/habitflow-mvp.git (fetch)
origin git@github.com:7ngenious/habitflow-mvp.git (push)
SSHに変わっていた!
# SSHテスト
ssh -T git@github.com
# 結果:
git@github.com: Permission denied (publickey).
💡 これだ!
仮説 5:ローカルとリモートが合わない
# ローカルコミット
git rev-parse HEAD
# 00c9cb9d1e0048e2a6169f99a8b781aea7284bdd
# リモートコミット
git rev-parse origin/main
# b253349a94d9203fb5ba02d4401ec21821531134
# 違う!
✅ 確認:実際にpushができなかったのが正しい。
💊 解決試み 1:SSH鍵設定(失敗)
試み:
# SSH鍵生成
ssh-keygen -t ed25519 -C "your.email@example.com"
# 公開鍵確認
cat ~/.ssh/id_ed25519.pub
問題:GitHubに登録しないといけないが、今すぐ複雑だ。
決定:一旦HTTPSに戻ろう。
✅ 解決方法:HTTPS + Buffer増加
Step 1: HTTPSにリモートURL変更
# SSH → HTTPS
git remote set-url origin https://github.com/7ngenious/habitflow-mvp.git
# 確認
git remote -v
# origin https://github.com/7ngenious/habitflow-mvp.git (fetch)
# origin https://github.com/7ngenious/habitflow-mvp.git (push)
Step 2: Credentialキャッシュ初期化
# 既存認証情報削除
git credential reject << EOF
protocol=https
host=github.com
EOF
理由:以前保存された認証情報が期限切れになった可能性がある
Step 3: HTTP Bufferサイズ増加
# デフォルト1MB → 500MBに増加
git config --global http.postBuffer 524288000
# 確認
git config --get http.postBuffer
# 524288000
なぜ必要か?
- READMEだけ変わったがGitは全体履歴を考慮
- 以前のコミットのメタデータ含む
- 圧縮されたオブジェクトが1MBを超える可能性がある
Step 4: 再度push!
git push origin main
# Username入力要請
Username for 'https://github.com': 7ngenious
# Password入力要請(Personal Access Token!)
Password for 'https://7ngenious@github.com': ghp_xxxxxxxxxxxxx
重要:PasswordはGitHubパスワードではなくPersonal Access Token!
Personal Access Token生成
- https://github.com/settings/tokens アクセス
- "Generate new token (classic)" クリック
- Note:
habitflow-mvp - Expiration:
90 days - 権限:
repo全体チェック - "Generate token" クリック
- トークンコピー(二度と見られない!)
最終push
git push origin main
# 結果:
オブジェクトを列挙中: 5、完了。
オブジェクト数を数える中: 100% (5/5)、完了。
Delta compression using up to 8 threads
オブジェクトを圧縮中: 100% (3/3)、完了。
オブジェクトを書き込み中: 100% (3/3)、15.42 KiB | 15.42 MiB/s、完了。
Total 3 (delta 2)、reused 0 (delta 0)、pack-reused 0
remote: Resolving deltas: 100% (2/2)、completed with 2 local objects.
To https://github.com/7ngenious/habitflow-mvp.git
b253349..00c9cb9 main -> main
🎉 成功!
🎓 原因整理
実際の原因は3つの組み合わせ
-
SSH設定失敗
- 途中でSSHに変えようとして失敗
- SSH鍵がないのにURLだけ変わった
Permission denied (publickey)
-
HTTP Buffer不足
- デフォルト1MBでは不足
- 3.21 MiB転送試みて失敗
RPC failed; HTTP 400
-
Credentialキャッシュ問題
- 以前の認証情報が期限切れ
- 新しいトークン必要
- キャッシュ初期化必要
🔧 解決策要約
# 1. HTTPSに変更
git remote set-url origin https://github.com/7ngenious/habitflow-mvp.git
# 2. Credential初期化
git credential reject << EOF
protocol=https
host=github.com
EOF
# 3. Buffer増加
git config --global http.postBuffer 524288000
# 4. push(Token入力)
git push origin main
💡 学んだこと
Gitの動作原理
Gitはデルタ(変更分)だけ転送するのではない
- 全体オブジェクトグラフ考慮
- 圧縮されたパックファイル生成
- メタデータ含む
だから小さな変更も大きなデータになり得る
SSH vs HTTPS
| 項目 | SSH | HTTPS |
|---|---|---|
| 初期設定 | 複雑(鍵生成/登録) | 簡単(Tokenのみ) |
| 認証 | 自動(鍵ベース) | 毎回(Token入力) |
| セキュリティ | 高い | 中間(Token管理) |
| 速度 | 速い | 普通 |
| ファイアウォール | 遮断される可能性 | ほとんど通過 |
結論:
- 個人プロジェクト → HTTPS(簡便)
- 会社/チーム → SSH(セキュリティ)
HTTP 400エラーの様々な原因
HTTP 400 = "Bad Request"
可能な原因:
- 認証失敗(Credential)
- Bufferサイズ超過
- 誤ったリクエスト形式
- ネットワークタイムアウト
- プロキシ/ファイアウォール問題
デバッグ順序:
- 認証確認(
git remote -v、ssh -T) - Buffer増加
- ネットワーク確認
- リモートリポジトリ状態確認
"Everything up-to-date"の意味
このメッセージが出る場合:
- ✅ 実際に同期された(正常)
- ❌ push失敗したがGitが混乱している(非正常)
確認方法:
# ローカルとリモート比較
git fetch origin
git log origin/main..HEAD
# 出力があれば → まだpushされていない
# 出力がなければ → すでにpushされた
🚀 予防法
これからはこうしよう
1. 最初からBuffer設定
git config --global http.postBuffer 524288000
2. 認証方式を明確に
- SSH使用:鍵を先に設定
- HTTPS使用:Token先に生成
3. push前に確認
# リモートURL確認
git remote -v
# 認証テスト
git ls-remote origin
# ローカル-リモート比較
git fetch origin
git status
4. 定期的な同期
# 作業前
git pull origin main
# 作業後
git push origin main
📊 所要時間
19:30 - READMEコミット試み(失敗)
19:35 - 最初の再試行(失敗)
19:40 - node_modules確認(違う)
19:45 - Vercelデプロイ確認(違う)
19:50 - SSH問題発見
20:00 - SSH鍵生成試み(複雑)
20:10 - HTTPS転換決定
20:15 - Credential初期化
20:20 - Buffer増加
20:25 - Token生成
20:30 - 最終push成功! 🎉
総所要時間:1時間
初めて経験するエラーなので時間がかかったが、今なら5分で解決できる。
🤔 もしこの方法もダメなら?
Plan B: 小さなテストpush
# 1. 小さなファイル生成
echo "# Test" > test.txt
# 2. コミット
git add test.txt
git commit -m "test: pushテスト"
# 3. push
git push origin main
# 成功すれば → 問題は特定ファイル
# 失敗すれば → 問題はGit設定
Plan C: 強制push
# 注意:他の人が作業中でない時のみ!
git push origin main --force
Plan D: 新しいブランチで迂回
# 1. 新しいブランチ
git checkout -b readme-update
# 2. push
git push origin readme-update
# 3. GitHubでPull Request
# 4. Merge
Plan E: GitHubウェブで直接修正
1. https://github.com/7ngenious/habitflow-mvp
2. README.md クリック
3. 鉛筆アイコン(Edit)
4. 内容修正
5. Commit changes
最後の手段だが確実だ!
💭 振り返り
デバッグの重要性
エラーは学びの機会だ。
今回学んだこと:
- Gitの内部動作原理
- SSH vs HTTPSの違い
- HTTP Bufferの役割
- Credential管理
- 体系的なデバッグアプローチ
製造現場のトラブルシューティングと似ていた。
PLCエラーが発生した時も:
- エラーメッセージ確認
- 可能な原因列挙
- 一つずつ検証
- 根本原因を探す
- 再発防止策準備
Claudeの助け
AIなしで一人だったら?
- Googleで3時間以上
- Stack Overflow 10個以上のタブ
- 様々な試みの後諦め
- 結局ウェブで修正
Claudeと一緒に:
- 体系的なデバッグガイド
- 各解決策の理由説明
- 段階別コマンド提供
- 1時間で解決
諦めないこと
3回目のpush失敗した時の考え:
「そのままGitHubウェブで修正して終わろうか?」
しかし我慢した。
理由:
- これは学習機会だ
- 次回また経験する可能性がある
- 根本原因を知りたい
- ブログネタだ(笑)
🎯 次のステップ
HabitFlow完成
Phase 1.1 - ポートフォリオ整理
- README更新 ✅
- スクリーンショット追加(3枚)
- GitHub About設定
- ブログポスティング(この記事!)
Phase 1.2 - 機能追加
- 習慣修正機能
- メモ機能
- ダークモード
Phase 2.0 - バックエンド連動
- Spring Boot API
- MySQL連動
- JWT認証
🔗 プロジェクトリンク
- Live Demo: https://habitflow-mvp.vercel.app
- GitHub: https://github.com/7ngenious/habitflow-mvp
- README: 今度はちゃんと見えます! 🎉
📝 終わりに
「エラーは敵ではなく師だ」
今回のエラーを通じて:
- Gitをより深く理解した
- SSHとHTTPSの違いを学んだ
- 体系的なデバッグ方法を習得した
- 諦めない粘り強さを育てた
そしてブログネタも得た。 😄
シリーズ完結
- 0編:習慣を「感じられる」ように
- 1編:バイブコーディングで1日でMVP完成
- 2編:デプロイ後Git Pushができない時 - HTTP 400エラー解決記(現在)
Tags: #Git #トラブルシューティング #HTTP400 #GitHub #SSH #HTTPS #デバッグ #エラー解決
📌 クイック解決チートシート
# Git Push HTTP 400エラー解決
# 1. HTTPSに変更
git remote set-url origin https://github.com/USERNAME/REPO.git
# 2. Credential初期化
git credential reject << EOF
protocol=https
host=github.com
EOF
# 3. Buffer増加
git config --global http.postBuffer 524288000
# 4. push(Token必要!)
git push origin main
# Token生成:https://github.com/settings/tokens
次回同じエラーに遭遇する誰かにこの記事が役立つことを願う! 🙏